
IPv4 TCPのinet_opt/ireq_opt use-after-freeに対する緩和ツールキット: 露出監査、nftによるIPオプション付きSYNのドロップルール、tcpdumpによる検出、およびELカーネル向けkpatch/livepatchビルダー。
IPv4 TCP の inet_opt/ireq_opt における use-after-free(上流の修正 e3f33b0a、inet_sock_destruct() および tcp_v4_reqsk_destructor() 内の kfree → kfree_rcu)。
トリガー: IPv4 オプション(ihl > 5)を含むクライアント SYN — オプションがなければ、競合対象のオブジェクト ireq_opt は決して割り当てられない。主張されているリモート root エクスプロイトには、さらに MPTCP リスナーが必要である。
| ファイル | root が必要 | 目的 |
|---|---|---|
cve-audit.sh | いいえ | 読み取り専用の露出状況およびパッチ適用可否レポート |
cve-mitigate.sh | 適用/元に戻す | IP オプション付き SYN を nft でドロップ、任意で MPTCP を無効化 |
nft-rules.txt | — | ルールセット単体(nft -f nft-rules.txt) |
cve-detect.sh | キャプチャモード | エクスプロイトのパケット形状を検知する tcpdump センサー |
kpatch-el-build.sh | ビルド/インストール | EL 系向けの検証済み kpatch/livepatch ビルダー |
klp-handcraft-build.sh | ビルド/ロード | kpatch-build が実行できない IBT カーネル(EL10)向けの手書き klp モジュール |
patches/CVE-2026-98432.patch | — | 上流の修正、kpatch-build 用に準備済み |
tests/run-tests.sh | いいえ | ハーネス(netns ルールセットのロード + スタブ化ビルダーの e2e) |
./cve-audit.sh # where do I stand?
./cve-mitigate.sh apply --with-mptcp-off # closes trigger + claimed root path
./cve-detect.sh count 30 # anyone probing with IP options?
sudo ./kpatch-el-build.sh --name CVE-2026-98432 \
--expect inet_sock_destruct,tcp_v4_reqsk_destructor \
[--sign priv.pem cert.pem] [--install] \
patches/CVE-2026-98432.patch
# verify: cat /sys/kernel/livepatch/CVE-2026-98432/enabled -> 1
./cve-mitigate.sh status # keep until 100% patched, then:
./cve-mitigate.sh undo
| ターゲット | 備考 |
|---|---|
| EL7 (3.10) | 脆弱ではない(トリガーコードは 4.4 で登場)。ビルダーは他のパッチ向けには引き続き動作する |
| EL7h/EL8 (4.18) | 脆弱。kernel-debuginfo が /usr/src/debug/kernel-*/linux-* を提供。kpatch-build は EPEL から |
| EL9 (5.14) | 脆弱。カーネルは gcc-toolset でビルドされており、ビルダーは一致する /opt/rh/gcc-toolset-* を自動的に先頭に付加する |
| EL10 (6.12) | IBT: kpatch-build 0.9.11 は CONFIG_X86_KERNEL_IBT=y のカーネルを拒否する(dynup/kpatch#1320)。klp-handcraft-build.sh を使用すること。Secure Boot/lockdown 下ではモジュール署名が強制される |
| CloudLinux 8/9/10 | ディストロ ID が kpatch-build のサポートリストにないため、ビルダーは常に -s/-c/-v を明示的に渡す。debuginfo は rpm -qf /boot/vmlinuz-$(uname -r) に一致する AlmaLinux/CentOS の kernel-debuginfo から取得する |
RHEL での debuginfo にはリポジトリを有効化する必要がある。例:
dnf --enablerepo='*debug*' debuginfo-install -y $(rpm -qf /boot/vmlinuz-$(uname -r))
(未請求のホストでは subscription-manager repos --enable=rhel-9-appstream-rpms など)。
CONFIG_LIVEPATCH=y と CONFIG_KALLSYMS=y があること。.comment レベルのチェックは
kpatch-build に委譲され、ツールセットの検索はここで行われる)。--expect)— 想定外の 3 つ目の変更オブジェクトはハードフェイルとなる。sign-file + modinfo sig_type の再チェック。
Secure Boot 用に MOK 経由で証明書を登録すること。--install は /var/lib/kpatch/$(uname -r)/ に配置し、
kpatch/insmod 経由でロードし、再起動後の永続化のために kpatch.service を有効化する。uname -r にする。./kpatch-el-build.sh ... --install を実行し、
/sys/kernel/livepatch/<name>/enabled == 1 を確認する。hping3 -S -p <port> --tcp-opts ... で
リスナーにフラッドをかけながら、カナリア上で net.ipv4.tcp_migrate_req=1 を切り替える。
ip_options_build() 内に人工的な udelay() を仕込んだ KASAN カーネル版は、
パッチなしで UAF を再現し、パッチありでは沈黙するはずである。uname -r が変わっていないこと(livepatch はこれを上げない)、kpatch list、
dmesg -w で taint と klp 遷移の停滞を監視する
(/sys/kernel/livepatch/<name>/transition が 0 まで減ること)。ハーネス: AlmaLinux 10.2 VM(カーネル 6.12.0-211.64.1.el10_2)上ですべてのチェックがパスする。
実際の nft ルールセットが新しい netns 内でロードされ一覧表示される。pcap フィルタは
稼働中の tcpdump に対してコンパイルされる。ビルダーパイプラインは、実際の .ko フィクスチャと
注入されたシンボルフィードを用いて、スタブ化された kpatch-build に対してエンドツーエンドで実行される。
その EL10 VM 上で実際に検証済み:
klp-handcraft-build.sh --load がライブパッチをビルドして有効化した:
/sys/kernel/livepatch/klp_CVE_2026_98432/enabled=1、transition は drain 済み、
sysfs には inet_sock_destruct,1 + tcp_v4_reqsk_destructor,1 が表示され、通常の
TCP (HTTP 200) は影響を受けなかった。署名なしの .ko はカーネルを taint する; Secure Boot
lockdown では拒否される (VM は署名なしで実行された)。kpatch-build (dynup 0.9.11、ソースからビルド) は EL10 上で
"kernel option CONFIG_X86_KERNEL_IBT not supported" によりハードフェイルする — ビルダーは
これを事前チェックし、handcraft ルートを指し示すようになった。実際のバイナリ差分による
kpatch-build 実行は EL8/EL9 では未検証のままである。prerouting priority -310 で機能するのも同じ理由である。
インシデントで信頼する前に、EL カナリア上でハッピーパスを一度実行すること。