
CVE-2026-98432(Linux IPv4 TCP ireq_opt の use-after-free)に対する一時的な緩和策:IP オプション付きの IPv4 TCP をドロップし、MPTCP を無効化します。テスト済みスクリプト+検証付き。EN/KO。
このリポジトリには、Linux ホスト上で IP オプションを含む IPv4 TCP パケットを破棄するスクリプトが含まれています。SELinux/Smack NetLabel CIPSO ラベリングを使用していないホストでは、そのようなパケットがなければ CVE-2026-98432(Linux カーネルの IPv4 TCP use-after-free)は発生しません。これは一時的な緩和策であり、修正ではありません。実際のエクスプロイトに対してテストされたものではなく(公開 PoC は存在しません)、ベンダーによる推奨もありません。お使いのディストリビューションがすでに修正済みカーネルを提供している場合は、それをインストールし、本緩和策を適用済みであれば revert.sh を実行してください。提供されていない場合は、緩和策がお使いのホストに該当することを確認したうえで、以下の手順で適用および検証してください(所要時間は約 10 分)。著者は個人の管理者であり、ベンダーではありません。
uname -r の出力を、修正済みの安定版バージョン(5.10.272、5.15.223、6.1.190、6.6.159、6.12.113、6.18.56、7.2.10、7.3。修正コミットは e3f33b0a1d89d738e2b913dab519226eaf76e15b)と比較してください。ディストリビューションのカーネルは異なるバージョン番号で修正が含まれている場合があるため、ベンダーのトラッカーも確認してください。cat /sys/kernel/security/lsm。SELinux または Smack がリストされており、CIPSOV4 マッピングで NetLabel を使用している場合、この緩和策はその経路をカバーしません。nft。OpenWrt には独自の手順があります(Files を参照)。OpenWrt 以外で systemd のないホストは対象外です。深刻度: カーネル CNA は CVSS 9.8 を付与しています。Red Hat、Oracle、SUSE は 8.1、Amazon は 7.0 を付与しています。Anthropic は、MPTCP リスナーを持つ Linux サーバーに対するリモート root エクスプロイトについて公開的に説明しました(2026-10-27)。2026-10-29 時点で、実際の悪用は報告されていません。
2026-10-29/30 時点のディストリビューションの状況(スナップショットであるため、ベンダーに確認してください):
| ディストリビューション | 状況 |
|---|---|
| Ubuntu(サポート対象の全リリース) | 修正済みカーネルなし |
| RHEL 8/9/10 | 修正済みカーネルなし |
| Proxmox VE | 2026-10-30 時点で pve-kernel の changelog にこの CVE の項目なし |
| Debian、Oracle Linux UEK、一部の SUSE、一部の Amazon Linux | 修正が利用可能 |
sudo ./mitigate.sh を実行します。このスクリプトは冪等です(再実行するとルールセットが再読み込みされます)。Files に記載されたファイルをインストールし、root でない場合、nft が存在しない場合、または systemd が存在しない場合は終了します。
出力を以下のリファレンスと比較してください。最初の行は次のとおりでなければなりません:
svc=active enabled=enabled mptcp=0
その後に 2 つのルールが続き、1 つは inet テーブル、もう 1 つは bridge テーブルにあります。
サービスが MPTCP で待ち受けている場合は、そのサービスを再起動してください。net.mptcp.enabled=0 は新しいソケットにのみ影響するため、すでに開いている MPTCP リスナーは、そのサービスが再起動するまで MPTCP のままです。この sysctl はネットワーク名前空間ごとの設定であり、mitigate.sh はホストの名前空間に対してのみ設定します。
ホストが LXC または Docker コンテナを実行している場合は、コンテナの項に進んでください。
公開されたエクスプロイトは MPTCP リスナーを標的にしていました。この競合自体は MPTCP を必要としません(修正の説明からの推測)。MPTCP のないホストが完全に侵害され得るかどうかは確立されていません。
ターゲットの SYN-ACK は IP オプションをエコーします。この緩和策を自身で実行しているクライアントはその SYN-ACK を破棄するため、ターゲットが緩和されていなくても check-blocked.py は「blocked」と報告します。あるホストで測定したところ、ターゲットで revert.sh を実行した後でも、緩和済みクライアントからの check-blocked.py は依然として ipopt FAIL TimeoutError を出力しましたが、verify-synack.sh は ipopt synack=5 を示しました。
いずれか 1 つのツールを選んでください:
python3 check-blocked.py <host> <port> を実行してください(root は不要)。これは 2 回接続します: まずプレーンで、次に IP_OPTIONS ソケットオプションを通じて IPv4 Record Route オプションを設定して接続します。sudo ./verify-synack.sh <ip> <port> を実行してください(クライアントに root、tcpdump、python3 が必要)。これは固定の送信元ポートからプレーンな SYN と IP オプション付き SYN を送信し、tcpdump でターゲットの SYN-ACK を数えます。その後、出力をそのツールの表と比較してください。
check-blocked.py(緩和策を適用していないクライアントから):
| 出力 | 意味 |
|---|---|
plain CONNECTED | 通常の TCP は動作する |
ipopt FAIL TimeoutError | IP オプション付き SYN が意図どおりに破棄された |
verify-synack.sh:
| 出力 | 意味 |
|---|---|
plain: CONNECTED synack=N | ipopt: TimeoutError synack=0 | ターゲットは緩和済み |
ipopt ... synack>=1 | ターゲットは緩和されていない(IP オプション付き SYN に応答があった) |
カーネルレベルの結果(1 台の Proxmox VE ホスト、カーネル 7.0、2026-10-30): 緩和策をオフにすると、脆弱なコードパスがパスごとに 1 回実行され、WireGuard 経由および LXC から LXC への通信で確認されました。オンにすると、SYN はタイムアウトし、パスは 0 回実行されました。サンプルは 1 台のホスト上の 2 状態における 2 パスです。トレース手法は docs/ANALYSIS.md(英語)にあります。
nftables の状態はネットワーク名前空間ごとであるため、ホストのルールだけではコンテナの名前空間を保護できません。LXC コンテナで測定したところ、ホストのルールのみの場合、コンテナ内部から自身の 127.0.0.1 または自身の IP への IP オプション付き SYN が接続に成功しました。コンテナはホストのカーネルを共有しているため、任意のコンテナ内のコードがこの方法で脆弱なパスに到達する可能性がありました。
sudo ./inject-netns.sh を実行してください。これは同じルールセットを、実行中のすべての LXC コンテナ(pct/lxc-info、Proxmox 経由)と、実行中のすべての Docker コンテナに読み込みます(host-network コンテナはスキップされます)。| 出力 | 意味 |
|---|---|
ok lxc:<id> または ok docker:<id> | そのコンテナの名前空間にルールセットが読み込まれた |
injected=N failed=M | 合計、M は 0 であるべき |
この注入は永続的ではありません。コンテナが再起動すると失われるため、再起動後にスクリプトを再実行してください。LXC コンテナ内にネストされた Docker コンテナでは、その LXC コンテナ内でスクリプトを実行する必要があります(未測定)。
測定結果: 5 台の Proxmox ホストにわたり、64 個のコンテナ名前空間に 0 件の失敗で注入されました。注入後、同じテストはタイムアウトし、コンテナ名前空間のドロップカウンターが増加しました。
この緩和策が干渉している症状は、TCP 接続が拒否されるのではなくハングする(タイムアウトする)ことであり、それに加えて次の出力でカウンターが増加します:
nft list ruleset | grep counter
| コマンド | 効果 |
|---|---|
systemctl stop cve-2026-98432-mitigation | 即座に停止、再起動時に再び有効化される |
systemctl disable --now cve-2026-98432-mitigation | 現在停止し、再起動後も無効のまま |
テスト済みホストで測定した互換性: ルールは専用のテーブルに存在し、Docker、ufw、iptables-legacy の NAT ルール、NetBird (WireGuard) のルーティングと共存しました。通常の TCP 接続は、テストしたすべての経路で動作し続けました。ドロップカウンタは、短い観測期間(数日ではなく数時間)の通常運用中、テストパケットの数値のままでした(正当なトラフィックは一致しませんでした)。
推測であり、測定はしていません: 設定に flush ruleset を含む nftables.service は、リロード時にテーブルを削除します。その有無を確認し、そのようなリロードの後には mitigate.sh を再実行してください。
uname -r で確認します。sudo ./revert.sh を実行します。MPTCP も再度有効化したい場合は --mptcp を追加します。| 出力 | 意味 |
|---|---|
remaining tables: 0 | ユニットは無効化され、3 つのファイルと両方のテーブルが削除された |
ether type ip) に一致します。VLAN 対応ブリッジはテストしていません。inet ルールを通過し、ブリッジポート間でスイッチングされるフレームは bridge ルールを通過します。WireGuard とループバックは測定済みです。IPIP、GRE、VXLAN は測定していません(コード上の推論のみ)。tcp_migrate_req は 0 でした。リクエストソケットのマイグレーション競合には同じく非 NULL の ireq_opt が必要なため、同じルールが適用されます(コード上の推論)。CVE-2026-98432 は IPv4 TCP 接続確立における競合です: 再送された SYN が、別の CPU によってすでに解放された IP オプション (ireq_opt) から SYN-ACK を構築する可能性があります。このバグは Linux 4.4 に由来します。IPv6 はオプションをコピーするため、主要な競合の影響を受けません。メインラインのソースでは、ireq_opt が非 NULL になるのは、SYN が IPv4 ヘッダーオプションを伴っていた場合 (IHL > 5)、または CIPSOV4 マッピングを伴う SELinux/Smack NetLabel を経由した場合のみです。ireq_opt が NULL であれば、解放または読み取りの対象はありません。prerouting 優先度 -310 のルール ip protocol tcp ip hdrlength gt 5 counter drop は、カーネルがオプションを解析する前に最初のケースをドロップします。ソースの詳細な解説は docs/ANALYSIS.md(英語)にあります。
| ファイル | 内容 |
|---|---|
mitigate.sh | /etc/cve-2026-98432.nft(2 つのテーブル、inet prerouting と bridge prerouting、それぞれに ip protocol tcp ip hdrlength gt 5 counter drop、優先度 -310)、起動時に network-pre.target より前にこれをロードする systemd oneshot ユニット cve-2026-98432-mitigation.service、および net.mptcp.enabled = 0 を含む /etc/sysctl.d/99-cve-2026-98432.conf をインストールします |
revert.sh | mitigate.sh がインストールしたすべてを削除します(パッチ適用後の削除を参照) |
inject-netns.sh | ルールセットをコンテナのネットワーク名前空間にロードします(コンテナを参照) |
check-blocked.py | root 権限なしでの接続テスト(検証を参照) |
verify-synack.sh | SYN-ACK カウントテスト(検証を参照) |
openwrt/10-cve-2026-98432.nft | inet ルールをチェーンとして含む OpenWrt fw4 インクルード(テーブルブロックなし)。/etc/nftables.d/ にコピーし、fw4 check && fw4 reload を実行します |
docs/ANALYSIS.md | ソースレベルの推論と kprobe の手法(英語) |
LICENSE | MIT |
このリポジトリで GitHub issue を作成してください。