
Exploit local de escalação de privilégios por use-after-free no nf_tables do kernel Linux, para CVE-2026-23111, com bypass de KASLR, cadeia ROP e sobrescrita de modprobe_path.
Um exploit funcional de escalonamento de privilégios local para CVE-2026-23111, um use-after-free no
subsistema nf_tables do kernel Linux. Testado em linux-6.12.69 (x86-64).
O exploit assume um kernel alvo compilado com:
| Opção | Valor | Motivo |
|---|---|---|
CONFIG_NF_TABLES | y | subsistema vulnerável |
CONFIG_USER_NS | y | acionar nf_tables sem privilégios (namespace de usuário+rede) |
CONFIG_RANDOMIZE_BASE | y | KASLR — contornado em tempo de execução (Fase 1) |
CONFIG_MEMCG | y | objetos caem nos caches kmalloc-cg-* (assumido pelo spray) |
CONFIG_STATIC_USERMODEHELPER | n | modprobe_path precisa ser gravável |
SLAB_FREELIST_RANDOM / HARDENED | n | freelist LIFO mantém a recuperação confiável |
Os offsets em offsets.h são específicos para uma compilação de kernel — regenere-os para qualquer outro kernel
Requer musl-gcc (sudo apt install musl-tools).
make # builds exp + rootme (static ELFs)
make clean # remove built binaries
Ambos os binários são estáticos para que rodem dentro de um initramfs busybox mínimo sem bibliotecas compartilhadas.
exp espera rootme ao seu lado em /cve-2026-23111-poc/ no alvo.
offsets.h é gerado a partir de uma compilação específica. Para um vmlinux diferente:
make offsets SYSTEM_MAP=/path/to/System.map
gen_offsets.sh extrai símbolos (single_start, modprobe_path, init_ipc_ns, msleep,
memcpy, …) e gadgets ROP, todos como offsets a partir da base do kernel. Você também precisará
reverificar os offsets de struct embutidos em exp.c (layout de nft_chain, nft_expr_ops.validate,
init_ipc_ns + 0x110, msg_queue.q_messages, xa_node.slots) com pahole / disassembly se
seu kernel diferir significativamente do 6.12.x.
Este código é publicado para pesquisa em segurança defensiva e educação. Ele tem como alvo uma VM de laboratório executando um kernel sabidamente vulnerável. Não o use contra sistemas que você não possui ou não está autorizado a testar. O autor não assume qualquer responsabilidade pelo uso indevido.
| Arquivo | Propósito |
|---|
exp.c | O exploit (Fases 1 → 4). |
rootme.c | Pequeno helper estático setuid(0); execl("/bin/sh") usado para obter um shell root. |
netlink_min.h | Definições mínimas de Netlink (compilado contra musl, sem headers uapi do kernel). |
offsets.h | Offsets de símbolos/gadgets relativos à kbase para o kernel alvo. |
gen_offsets.sh | Regenera offsets.h a partir de um System.map / vmlinux do kernel. |
Makefile | Compila exp e rootme como ELFs estáticos musl. |