CVE-2026-97959 in Linux
Resumen
por VulDB • 2026-09-26
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
net/sched: cls_route: liberar bucket vacío al mover un filtro
route4_change puede mover un filtro existente a un bucket de nivel superior diferente: route4_set_parms vuelve a calcular el handle desde TCA_ROUTE4_TO/ FROM/IIF, y la comprobación de coincidencia del handle está condicionada por la bandera 'new', por lo que para un filtro existente el nuevo handle puede diferir del anterior y terminar en un bucket distinto. Cuando esto ocurre, el filtro se desvincula del bucket antiguo, pero dicho bucket nunca se libera una vez queda vacío. El bucket vacío obsoleto permanece en head->table[], provocando que route4_delete informe *last=false incluso después de que haya desaparecido el último filtro activo. Esto mantiene fijado (pinned) el tcf_proto vacío y causa una fuga de memoria (leak).
Se soluciona este problema mediante la contabilización por referencias (refcounting) de los filtros vinculados a un bucket, liberando el bucket cuando dicho contador llega a cero. El escaneo existente en route4_delete desaparece con esta solución.
El contador se actualiza en todos los puntos donde se vincula o desvincula un filtro durante las operaciones add, change y delete, y el bucket se elimina de head->table[] tan pronto como alcanza cero.
Condiciones para recrear la vulnerabilidad: CONFIG_NET_CLS_ROUTE4=y, CONFIG_NET_SCH_INGRESS=y, CONFIG_NET_CLS_ACT=y.
tc qdisc replace dev lo clsact tc filter add dev lo ingress protocol ip pref 100 route from 1 to 1 tc filter change dev lo ingress protocol ip pref 100 handle 0x10001 \ route from 1 to 2 tc filter del dev lo ingress protocol ip pref 100 handle 0x10002 \ route from 1 to 2 tc filter show dev lo ingress | grep -c 'pref 100 route chain 0 '
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.