
Funktionierender Linux-Kernel-nf_tables-Use-after-free-Exploit zur lokalen Rechteausweitung für CVE-2026-23111, mit KASLR-Bypass, ROP-Chain und modprobe_path-Überschreibung.
Ein funktionierender Exploit zur lokalen Rechteausweitung für CVE-2026-23111, einen Use-after-free im
Linux-Kernel-Subsystem nf_tables. Getestet auf linux-6.12.69 (x86-64).
Der Exploit setzt einen Ziel-Kernel voraus, der mit folgenden Optionen gebaut wurde:
| Option | Wert | Warum |
|---|---|---|
CONFIG_NF_TABLES | y | verwundbares Subsystem |
CONFIG_USER_NS | y | nf_tables unprivilegiert ansteuern (User- und Netzwerk-Namespace) |
CONFIG_RANDOMIZE_BASE | y | KASLR — zur Laufzeit ausgehebelt (Phase 1) |
CONFIG_MEMCG | y | Objekte landen in kmalloc-cg-*-Caches (vom Spray angenommen) |
CONFIG_STATIC_USERMODEHELPER | n | modprobe_path muss beschreibbar sein |
SLAB_FREELIST_RANDOM / HARDENED | n | LIFO-Freelist hält die Rückgewinnung zuverlässig |
Die Offsets in offsets.h sind spezifisch für einen Kernel-Build — für jeden anderen Kernel müssen sie neu generiert werden
Erfordert musl-gcc (sudo apt install musl-tools).
make # builds exp + rootme (static ELFs)
make clean # remove built binaries
Beide Binaries sind statisch, damit sie in einem minimalen busybox-initramfs ohne Shared Libraries laufen.
exp erwartet rootme daneben unter /cve-2026-23111-poc/ auf dem Ziel.
offsets.h wird aus einem bestimmten Build generiert. Für ein anderes vmlinux:
make offsets SYSTEM_MAP=/path/to/System.map
gen_offsets.sh extrahiert Symbole (single_start, modprobe_path, init_ipc_ns, msleep,
memcpy, …) und ROP-Gadgets, alle als Offsets von der Kernel-Basis. Zusätzlich müssen die in exp.c
eingebrannten Struct-Offsets (nft_chain-Layout, nft_expr_ops.validate,
init_ipc_ns + 0x110, msg_queue.q_messages, xa_node.slots) mit pahole / Disassembly neu
verifiziert werden, falls der Kernel maßgeblich von 6.12.x abweicht.
Dieser Code wird für defensive Sicherheitsforschung und Bildung veröffentlicht. Er zielt auf eine Labor-VM mit einem bekannten verwundbaren Kernel. Verwende ihn nicht gegen Systeme, die dir nicht gehören oder die du nicht testen darfst. Der Autor übernimmt keine Haftung für Missbrauch.
| Datei | Zweck |
|---|
exp.c | Der Exploit (Phasen 1 → 4). |
rootme.c | Winziger statischer setuid(0); execl("/bin/sh")-Helfer, um eine Root-Shell zu erhalten. |
netlink_min.h | Minimale Netlink-Definitionen (gegen musl gebaut, keine Kernel-uapi-Header). |
offsets.h | kbase-relative Symbol-/Gadget-Offsets für den Ziel-Kernel. |
gen_offsets.sh | Generiert offsets.h aus einem Kernel-System.map / vmlinux neu. |
Makefile | Baut exp und rootme als statische musl-ELFs. |