
Exploit de prueba de concepto para la escalada local de privilegios que aprovecha una condición de carrera en la tabla de tasas de qdisc de Linux, utilizando heap grooming con BPF y una fuga de pipe para obtener root.

Este repositorio contiene un exploit de prueba de concepto de escalada local de privilegios para CVE-2026-68138, una condición de carrera en el código de la tabla de tasas del control de tráfico de Linux. En el entorno QEMU probado, el PoC escala desde un proceso común con UID externo 1000 hasta una shell con UID 0 en el espacio de nombres de usuario inicial.
Advertencia
Este código corrompe intencionalmente el estado del heap del kernel. Úsalo únicamente en una VM aislada y desechable que sea tuya. Una condición de carrera fallida o una limpieza prematura pueden provocar un pánico en el invitado. No lo ejecutes en una estación de trabajo, servidor o sistema de terceros.
qdisc_get_rtab() y qdisc_put_rtab() gestionan una lista simplemente
enlazada global al proceso, qdisc_rtab_list, y un simple int refcnt no
atómico. Históricamente, los llamadores mantenían el mutex RTNL, que
serializaba el acceso a la lista y al contador de referencias.
El clasificador flower establece TCF_PROTO_OPS_DOIT_UNLOCKED. Una solicitud
RTM_NEWTFILTER para una regla flower puede, por tanto, alcanzar una acción
police y llamar a los helpers de la tabla de tasas qdisc sin RTNL:
tc_new_tfilter()
-> fl_change()
-> tcf_exts_validate_ex()
-> tcf_action_init()
-> tcf_police_init()
-> qdisc_get_rtab()/qdisc_put_rtab()
Las solicitudes concurrentes que usan la misma tabla de tasas pueden provocar
una condición de carrera en la lista global y su contador de referencias. El
resultado es un use-after-free o un double-free de struct qdisc_rate_table,
un objeto de 1056 bytes asignado desde kmalloc-2k en el kernel x86-64
probado.
Debido a que la lista es global y no por espacio de nombres de red, las solicitudes de espacios de nombres de red separados siguen provocando una condición de carrera sobre el mismo objeto.
El registro CNA de Linux identifica el commit de introducción
470502de5bdb,
publicado en Linux 5.1.
| Línea | Estado | Commit/versión |
|---|---|---|
| Linux anterior a 5.1 | No afectado | El cambio de introducción está ausente |
| Linux 5.1 hasta 7.1.5 | Afectado a menos que esté presente un backport del proveedor | 470502de5bdb hasta el commit anterior a la corrección estable |
| Linux 7.1.y | Corregido | 7.1.6, fb29e1b41052 |
| Serie de desarrollo de Linux 7.2 | Afectado antes de rc5 | desde rc1 hasta rc4 |
| Mainline | Corregido | 7.2-rc5, f43ee0c0730d |
Los kernels de las distribuciones suelen aplicar backports de las correcciones sin cambiar a la versión upstream mostrada arriba. Comprueba si alguno de los commits de corrección—o el cambio equivalente de spinlock en la tabla de tasas qdisc—está presente en la fuente exacta del kernel que usa el sistema.
El exploit se desarrolló y validó contra el commit vulnerable
92d3817649df2b0b6a008a686c8275c88d7ef594, el padre directo de la corrección
de mainline. El control de kernel corregido usó
f43ee0c0730d6191629b5ee1ceae27b1ebfdc047.
A fecha de 2026-08-12, la
búsqueda en el rastreador de CVEs de Ubuntu
no devolvió una entrada para este CVE. Por lo tanto, la tabla siguiente es una
inspección directa de la fuente, no una determinación del estado de seguridad
de Canonical. Cada etiqueta de Ubuntu enlazada todavía tiene qdisc_rtab_list
sin bloquear y carece del qdisc_rtab_lock correctivo.
| Línea de Ubuntu | Paquete/etiqueta inspeccionado | Resultado de la fuente |
|---|---|---|
| Ubuntu 22.04 GA | 5.15.0-187.197 | Código vulnerable presente; exploit completo reproducido en QEMU |
| Ubuntu 22.04 HWE | 6.8.0-136.136~22.04.1 | Código vulnerable presente; cadena de exploit no probada |
| Ubuntu 24.04 HWE | 7.0.0-28.28~24.04.1 | Código vulnerable presente; esta cadena de exploit no es compatible con su endurecimiento del asignador |
| Ubuntu 26.04 | 7.0.0-28.28 | Código vulnerable presente; esta cadena de exploit no es compatible con su endurecimiento del asignador |
No se identificó ningún paquete de Ubuntu corregido en esa fecha de inspección. Los futuros paquetes de Ubuntu deberían comprobarse para ver si contienen un backport equivalente a las correcciones upstream enlazadas, en lugar de juzgarlos solo por su número de versión.
El exploit específico de la compilación de Ubuntu 22.04, el laboratorio QEMU,
la suma de verificación exacta de la imagen y las condiciones están
documentados en ubuntu/README.md. Se validó contra el
kernel oficial 5.15.0-187-generic #197-Ubuntu con la contabilidad de
memory-cgroup habilitada.
El bug subyacente y esta cadena de exploit en particular tienen requisitos diferentes. El PoC se validó con:
CONFIG_USER_NS=y y CONFIG_NET_NS=y;CONFIG_NET_CLS=y, CONFIG_NET_CLS_FLOWER=y,
CONFIG_NET_CLS_ACT=y y CONFIG_NET_ACT_POLICE=y;CONFIG_TMPFS_XATTR=y para el heap spray simple_xattr;CONFIG_MODULES=y y un /sbin/modprobe utilizable para el helper root final;CONFIG_MEMCG=n, de modo que las asignaciones qdisc/BPF/pipe/xattr usadas
por esta cadena compartan la caché kmalloc-2k esperada;CONFIG_SLAB_BUCKETS=y, la aleatorización de freelist y el endurecimiento de
freelist estaban habilitados en el kernel de prueba que tuvo éxito. KASLR no se
evade inherentemente con una dirección fija: el PoC obtiene los punteros page
y ops necesarios de la fuga de pipe. El laboratorio suministrado usó
nokaslr para simplificar la depuración.
Los kernels con contabilidad de memory-cgroup habilitada o con diferentes diseños de asignador/caché requieren una estrategia de recuperación diferente. El PoC se niega deliberadamente a afirmar portabilidad entre configuraciones arbitrarias de distribuciones.
La variante separada para Ubuntu implementa esa estrategia de recuperación
diferente; sus requisitos son intencionadamente más reducidos y se enumeran en
ubuntu/README.md.