CVE-2026-53264
net/sched: act_api: usar RCU con liberación diferida para el ciclo de vida de las acciones
- Publicado
- 25 jun 2026
- Actualizado
- 5 ago 2026
- Asignación de CNA
- Linux
- Evidencia observada
- 7 ago 2026
CVSS primario
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HBajo · próximos 30 días
- Percentil
- 15,6 %
- Fecha del modelo
- 21 sept 2026
EPSS es una estimación estadística, no una certeza o una medida de impacto. Combínelo con CVSS, estado KEV, exposición y su entorno.
Resumen
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: net/sched: act_api: usar RCU con liberación diferida para el ciclo de vida de las acciones Cuando NEWTFILTER y DELFILTER se ejecutan de forma concurrente, es posible crear una condición de carrera con una acción asociada. Ilustremos con CPU0 ejecutando NEWTFILTER y CPU1 ejecutando DELFILTER: 0: mutex_lock() <-- mantiene el bloqueo de idr 0: rcu_read_lock() 0: p = idr_find(idr, index) <-- la acción p es válida (RCU protege IDR) 0: mutex_unlock() <-- libera el bloqueo de idr 1: refcount_dec_and_mutex_lock() <-- refcnt 1->0, mutex retenido 1: idr_remove(idr, index) <-- Acción eliminada de IDR 1: mutex_unlock() <-- mutex liberado permitiéndonos eliminar la acción 1: tcf_action_cleanup(p); kfree(p) <-- Libera p inmediatamente, sin diferimiento 0: refcount_inc_not_zero(&p->tcfa_refcnt) <-- vaya, UAF p apunta a memoria liberada Este parche corrige la condición de carrera entre NEWTFILTER y DELFILTER añadiendo struct rcu_head a tc_action utilizado en el diferimiento e introduciendo call_rcu() en la ruta de eliminación para diferir el kfree() final. Nota: esto es una reversión del commit d7fb60b9cafb ("net_sched: get rid of tcfa_rcu") pero también una modernización/simplificación para usar directamente kfree_rcu(). Ilustremos la nueva ruta de código restaurada: 0: rcu_read_lock() 1: refcount_dec_and_mutex_lock() <-- refcnt 1->0, mutex retenido 1: idr_remove(idr, index) 1: mutex_unlock() 1: call_rcu(&p->tcfa_rcu, tcf_action_rcu_free) <-- difiere kfree después del período de gracia 0: p = idr_find(idr, index) 0: refcount_inc_not_zero(&p->tcfa_refcnt) <-- falla, refcnt ya es 0 1: rcu_read_unlock() <-- libera para que la liberación pueda ejecutarse después del período de gracia Después de que CPU1 llame a idr_remove(), el objeto ya no es alcanzable a través de IDR. El idr_find() posterior de CPU0 devolverá NULL, e incluso si aún mantuviera un puntero obsoleto, el kfree() inmediato ahora se difiere hasta después del período de gracia de RCU, por lo que no puede ocurrir ningún UAF.
Fuentes
2Uso responsable
Utilice información sobre vulnerabilidades solo en sistemas de su propiedad o que esté autorizado a probar. Kitploit enlaza con metadatos de investigación pública y no almacena código de explotación ni cargas útiles maliciosas.