inet_opt / ireq_opt)プレーンな IPv4 TCP リスナーから到達可能な Linux カーネルの use-after-free に関する研究用 PoC とローカルラボ。これはバグ検出/トリガーであり、エクスプロイトではない。
7.0.0-38-generic)では、このコードパスは脆弱である:
inet_sock_destruct() と tcp_v4_reqsk_destructor() はオプションを
kfree_rcu() ではなく kfree() で解放している。kfree パスは実行時に到達可能である(kprobes)。free -> use イベント(via=reqsk)を観測したが、再現性をもって再現することは
できなかった。tcp2kaslr もバグトリガーの段階で止まっており、以降の段階は公開されていない。CONFIG_KASAN が無効で、KFENCE のサンプリングも無効になっている。tcp2kaslr より)MPTCP は不要である。実証済みのパスはプレーンな IPv4 TCP である:
ireq_opt)。accept() し、SO_LINGER(0) を設定して
クローズする。inet_sock_destruct() がオプションを kfree() で解放する。以前のトリガーには2つの誤りがあった。被害側が子ソケットを accept/クローズしておらず
(free_sock=0)、サーバーのクローズに頼らず RST を送信していた。現在のコードは
正しい要素を追加している:
listen --accept-close — accept + SO_LINGER(0) + close。--sync — ACK と重複 SYN を並行して送信、RST なし、Record Route オプション付き。上流の修正はまさに次のとおりである:
- kfree(rcu_dereference_protected(inet->inet_opt, 1));
+ kfree_rcu(rcu_dereference_protected(inet->inet_opt, 1), rcu);
また、tcp_v4_reqsk_destructor() における同じ変更についても同様です。
| パス | 内容 |
|---|---|
rust-poc/ | ネイティブ Rust PoC: 静的 ELF 解析、kprobes、トリガーモード |
lab/ | 旧ローカルテスト用の Alpine + PHP ループバック被害者環境 |
scripts/ | ローカル再現ヘルパー、認可済み監査ヘルパー |
docs/FINDINGS.md | テストした内容、確認された内容、確認されなかった内容 |
docs/EXPLOITATION-NOTES.md | スコープ: バグトリガーのみ、RCE なし |
docs/evidence/ | サニタイズ済みのサンプル証拠 |
cd rust-poc
cargo build --release
# static analysis (no root)
./target/release/cve-2026-98432 static
# runtime reachability (root, tracefs)
sudo ./target/release/cve-2026-98432 runtime
# correct local vector: accept+close server + --sync trigger
cd ..
PASSES=1 ./scripts/repro-sync.sh 8083
repro-sync.sh は 127.0.0.1:8083 上で --accept-close の被害者を起動し、sudo で同期トリガーを実行して、free_sock、use_build、および UAF の判定結果を出力します。クリーンな実行は安全性の証明にはなりません。発生率は試行あたりおよそ 1e-7 であり、イベントはクラスタ化して発生します。
artifacts/ が存在しない場合、static/runtime は /boot にフォールバックします。レガシーな scripts/cve-2026-98432.sh --static を使用してカーネルアーティファクトを生成できます。
KASAN を使用すると、カーネルは inet_csk_route_req / ip_options_build における slab-use-after-free を報告し、解放スタックは inet_sock_destruct / inet_release にあります。tcp2kaslr ハーネスは KASAN を使用して約 134k 回の試行でこれに到達します。通常のカーネルでは、同じレースは約 48M 回の試行で 2 回だけ観測されました。
所有している、または明示的にテストを許可されているカーネルとホストのみをテストしてください。このトリガーはカーネルレースであり、ホストをクラッシュさせる可能性があります。スナップショットを取得した使い捨ての VM を使用してください。
offline-ant/tcp2kaslr — バグトリガー、KASAN の証拠、分析:
https://github.com/offline-ant/tcp2kaslripv4: free inet_opt and ireq_opt after an RCU grace period
(Eric Dumazet)、net/ipv4/af_inet.c および
net/ipv4/tcp_ipv4.c における kfree → kfree_rcu。MIT。LICENSE を参照してください。