
Linux カーネル nf_tables サブシステムにおける use-after-free である CVE-2026-23111 の動作するローカル権限昇格エクスプロイト。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 は、ターゲット上の /cve-2026-23111-poc/ に rootme が隣接して存在することを想定しています。
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) についても、カーネルが
6.12.x と大きく異なる場合は pahole / 逆アセンブリで再検証する必要があります。
このコードは防御セキュリティ研究および教育のために公開されています。既知の脆弱なカーネルを 実行するラボ VM を対象としています。所有していない、またはテストを許可されていないシステムに対して 使用しないでください。作者は悪用に対して一切の責任を負いません。
| ファイル | 目的 |
|---|
exp.c | エクスプロイト本体 (フェーズ 1 → 4)。 |
rootme.c | root シェルを取得するために使用される、小さな静的 setuid(0); execl("/bin/sh") ヘルパー。 |
netlink_min.h | 最小限の Netlink 定義 (musl 向けにビルド、カーネル uapi ヘッダー不使用)。 |
offsets.h | ターゲットカーネル用の kbase 相対シンボル/ガジェットオフセット。 |
gen_offsets.sh | カーネルの System.map / vmlinux から offsets.h を再生成する。 |
Makefile | exp と rootme を静的 musl ELF としてビルドする。 |