
Exploit local de escalada de privilegios funcional para CVE-2026-23111, un use-after-free en el subsistema nf_tables del kernel de Linux, con bypass de KASLR y cadena ROP para el kernel 6.12.x.
CVE-2026-23111_exploit
Un exploit funcional de escalada local de privilegios para CVE-2026-23111, un use-after-free en el
subsistema nf_tables del kernel de Linux. Probado en linux-6.12.69 (x86-64).
El exploit asume un kernel objetivo compilado con:
| Opción | Valor | Por qué |
|---|---|---|
CONFIG_NF_TABLES | y | subsistema vulnerable |
CONFIG_USER_NS | y | accionar nf_tables sin privilegios (namespace de usuario+red) |
CONFIG_RANDOMIZE_BASE | y | KASLR — neutralizado en tiempo de ejecución (Fase 1) |
CONFIG_MEMCG | y | los objetos caen en las cachés kmalloc-cg-* (asumido por el spray) |
CONFIG_STATIC_USERMODEHELPER | n | modprobe_path debe ser escribible |
SLAB_FREELIST_RANDOM / HARDENED | n | la freelist LIFO mantiene la recuperación fiable |
Los offsets en offsets.h son específicos de una compilación del kernel — regenéralos para cualquier otro kernel
| Archivo | Propósito |
|---|---|
exp.c | El exploit (Fases 1 → 4). |
rootme.c | Pequeño helper estático setuid(0); execl("/bin/sh") usado para obtener una shell de root. |
netlink_min.h | Definiciones mínimas de Netlink (compiladas contra musl, sin cabeceras uapi del kernel). |
offsets.h | Offsets de símbolos/gadgets relativos a kbase para el kernel objetivo. |
gen_offsets.sh | Regenera offsets.h a partir de un System.map / vmlinux del kernel. |
Makefile | Compila exp y rootme como ELFs estáticos de musl. |
Requiere musl-gcc (sudo apt install musl-tools).
make # builds exp + rootme (static ELFs)
make clean # remove built binaries
Ambos binarios son estáticos para que se ejecuten dentro de un initramfs mínimo de busybox sin bibliotecas compartidas.
exp espera rootme junto a él en /cve-2026-23111-poc/ en el objetivo.
offsets.h se genera a partir de una compilación específica. Para un vmlinux diferente:
make offsets SYSTEM_MAP=/path/to/System.map
gen_offsets.sh extrae símbolos (single_start, modprobe_path, init_ipc_ns, msleep,
memcpy, …) y gadgets ROP, todos como offsets desde la base del kernel. También necesitarás
reverificar los offsets de estructuras incrustados en exp.c (disposición de nft_chain, nft_expr_ops.validate,
init_ipc_ns + 0x110, msg_queue.q_messages, xa_node.slots) con pahole / desensamblado si
tu kernel difiere significativamente de 6.12.x.
Este código se publica para investigación en seguridad defensiva y educación. Está dirigido a una VM de laboratorio que ejecuta un kernel vulnerable conocido. No lo uses contra sistemas que no poseas o que no estés autorizado a probar. El autor no asume ninguna responsabilidad por su uso indebido.