
Exploit locale di privilege escalation use-after-free nel kernel Linux nf_tables funzionante per CVE-2026-23111, con bypass KASLR, catena ROP e sovrascrittura di modprobe_path.
Un exploit funzionante di privilege escalation locale per CVE-2026-23111, un use-after-free nel
sottosistema nf_tables del kernel Linux. Testato su linux-6.12.69 (x86-64).
L'exploit presuppone un kernel target compilato con:
| Opzione | Valore | Perché |
|---|---|---|
CONFIG_NF_TABLES | y | sottosistema vulnerabile |
CONFIG_USER_NS | y | pilotare nf_tables senza privilegi (user+net namespace) |
CONFIG_RANDOMIZE_BASE | y | KASLR — neutralizzato a runtime (Fase 1) |
CONFIG_MEMCG | y | gli oggetti finiscono nelle cache kmalloc-cg-* (presupposto dallo spray) |
CONFIG_STATIC_USERMODEHELPER | n | modprobe_path deve essere scrivibile |
SLAB_FREELIST_RANDOM / HARDENED | n | la freelist LIFO mantiene il reclaim affidabile |
Gli offset in offsets.h sono specifici per una singola build del kernel — rigenerali per qualsiasi altro kernel
Richiede musl-gcc (sudo apt install musl-tools).
make # builds exp + rootme (static ELFs)
make clean # remove built binaries
Entrambi i binari sono statici, così da poter essere eseguiti all'interno di un initramfs busybox minimale senza librerie condivise.
exp si aspetta rootme accanto a sé in /cve-2026-23111-poc/ sul target.
offsets.h è generato da una build specifica. Per un vmlinux diverso:
make offsets SYSTEM_MAP=/path/to/System.map
gen_offsets.sh estrae simboli (single_start, modprobe_path, init_ipc_ns, msleep,
memcpy, …) e gadget ROP, tutti come offset dalla base del kernel. Dovrai anche
riverificare gli offset delle struct incorporate in exp.c (layout di nft_chain, nft_expr_ops.validate,
init_ipc_ns + 0x110, msg_queue.q_messages, xa_node.slots) con pahole / disassembly se
il tuo kernel differisce in modo significativo da 6.12.x.
Questo codice è pubblicato per ricerca difensiva sulla sicurezza e didattica. È rivolto a una VM di laboratorio che esegue un kernel noto come vulnerabile. Non usarlo contro sistemi di cui non sei proprietario o che non sei autorizzato a testare. L'autore non si assume alcuna responsabilità per usi impropri.
| File | Scopo |
|---|
exp.c | L'exploit (Fasi 1 → 4). |
rootme.c | Piccolo helper statico setuid(0); execl("/bin/sh") usato per ottenere una shell root. |
netlink_min.h | Definizioni Netlink minime (compilate contro musl, senza header uapi del kernel). |
offsets.h | Offset di simboli/gadget relativi alla kbase per il kernel target. |
gen_offsets.sh | Rigenera offsets.h da un System.map / vmlinux del kernel. |
Makefile | Compila exp e rootme come ELF statici musl. |