
Рабочий эксплойт локального повышения привилегий через use-after-free в nf_tables ядра Linux для CVE-2026-23111 с обходом KASLR, ROP-цепочкой и перезаписью modprobe_path.
Рабочий эксплойт для локального повышения привилегий, использующий CVE-2026-23111 — use-after-free в
подсистеме ядра Linux nf_tables. Протестирован на linux-6.12.69 (x86-64).
Эксплойт предполагает, что целевое ядро собрано с:
| Опция | Значение | Зачем |
|---|---|---|
CONFIG_NF_TABLES | y | уязвимая подсистема |
CONFIG_USER_NS | y | работа с nf_tables без привилегий (user+net namespace) |
CONFIG_RANDOMIZE_BASE | y | KASLR — обходится во время выполнения (Фаза 1) |
CONFIG_MEMCG | y | объекты попадают в кэши kmalloc-cg-* (предполагается спреем) |
CONFIG_STATIC_USERMODEHELPER | n | modprobe_path должен быть доступен для записи |
SLAB_FREELIST_RANDOM / HARDENED | n | LIFO-список свободных блоков обеспечивает надёжный возврат памяти |
Смещения в offsets.h специфичны для конкретной сборки ядра — перегенерируйте их для любого другого ядра
Требуется musl-gcc (sudo apt install musl-tools).
make # builds exp + rootme (static ELFs)
make clean # remove built binaries
Оба бинарника статические, поэтому они работают внутри минимального busybox initramfs без разделяемых библиотек.
exp ожидает rootme рядом с собой в /cve-2026-23111-poc/ на целевой системе.
offsets.h генерируется из конкретной сборки. Для другого vmlinux:
make offsets SYSTEM_MAP=/path/to/System.map
gen_offsets.sh извлекает символы (single_start, modprobe_path, init_ipc_ns, msleep,
memcpy, …) и ROP-гаджеты, все как смещения от базы ядра. Вам также потребуется
перепроверить смещения структур, зашитые в exp.c (раскладка nft_chain, nft_expr_ops.validate,
init_ipc_ns + 0x110, msg_queue.q_messages, xa_node.slots), с помощью pahole / дизассемблирования, если
ваше ядро существенно отличается от 6.12.x.
Этот код опубликован для защитных исследований в области безопасности и обучения. Он нацелен на лабораторную виртуальную машину с заведомо уязвимым ядром. Не используйте его против систем, которыми вы не владеете и не уполномочены тестировать. Автор не несёт ответственности за неправомерное использование.
| Файл | Назначение |
|---|
exp.c | Эксплойт (Фазы 1 → 4). |
rootme.c | Крошечный статический помощник setuid(0); execl("/bin/sh"), используемый для получения root-шелла. |
netlink_min.h | Минимальные определения Netlink (собраны под musl, без заголовков uapi ядра). |
offsets.h | Смещения символов/гаджетов относительно kbase для целевого ядра. |
gen_offsets.sh | Перегенерирует offsets.h из System.map / vmlinux ядра. |
Makefile | Собирает exp и rootme как статические ELF под musl. |