
IPヘッダーにオプションを含む受信IPv4 TCPパケットをドロップします。
IP ヘッダーにオプションを含む受信 IPv4 TCP パケットをドロップします。
CVE-2026-98432 に対する、小さく可逆な iptables の暫定対策です。
現在のネットワーク名前空間において、IP オプションを含む IPv4 TCP パケットをドロップします。 明確なステータス出力、繰り返し実行可能な適用/削除コマンド、読み取り専用の インベントリ、オプションの systemd サービス、および独立した接続チェックを含みます。
バージョン: 1.0.0 · レビュー日: 2026年10月30日 · 要件: Linux + Bash + iptables
これはコミュニティによるフィルタリングであり、カーネルの修正やベンダー認定の完全な 回避策ではありません。ルールが存在することは、エクスプロイト耐性を証明するものではありません。 ベンダーが修正したカーネルをインストールして起動するか、この CVE を明示的に カバーするサポート対象の livepatch を使用してください。
ZIP を展開し、このディレクトリでターミナルを開いてから、次を実行します:
# Read-only inventory; no root required, although visibility may be limited.
bash paranoid-cve98432.sh audit
# Preview the firewall commands; no changes, no root required.
bash paranoid-cve98432.sh apply --dry-run
# Apply the two runtime rules.
sudo bash paranoid-cve98432.sh apply
# Check exact rules and packet counters.
sudo bash paranoid-cve98432.sh status
SSHセッションを開いたままにし、2つ目のSSH接続と通常のサービスが引き続き動作することを確認してください。IPv4 IPオプションを必要とするクライアントは影響を受ける可能性があります。
元に戻す:
sudo bash paranoid-cve98432.sh remove
このツールの正確なタグ付きルールのみが削除されます。他のファイアウォールルールおよびすべての sysctl設定は保持されます。以前に手動でインストールしたルール(会話中でタグなしで 作成したルールを含む)は削除も引き継ぎもされません。
| 依存関係 | 目的 |
|---|---|
| Bash | スクリプトの実行環境 |
IPv4 raw テーブル、u32 および comment マッチを備えた iptables | パケットフィルタリング |
root および CAP_NET_ADMIN | 適用、ステータス確認、削除 |
flock、stat、mkdir | /run 配下のプライベートディレクトリを使用した変更の直列化 |
iproute2 (ss) | オプションのリスナー一覧 |
| Python 3.8+ | オプションの検証ヘルパー |
| Python 3.9+ | オフラインテストスイート |
| systemd | オプションの起動時永続化のみ |
Ubuntu/Debian での一般的なパッケージ:
sudo apt install iptables util-linux iproute2 python3
RHEL 系のシステムでは、iptables コマンドを提供するパッケージがリリースによって異なります。dnf provides '*/iptables' で確認してください。このツールはパッケージのインストールや、選択されている iptables バックエンドの変更は行いません。
一部の iptables-nft インストールでは、現在の構成で u32 がサポートされていません。挿入に失敗した場合、ツールはエラーを報告し、追加した新しいルールをロールバックします。稼働中のサーバーでファイアウォールバックエンドを無闇に切り替えないでください。代わりに、既存のファイアウォールと統合されたネイティブの nftables 相当機能を使用してください。
以下の正確なルールを、識別用のコメント付きでインストールします:
iptables -w 10 -t raw -I PREROUTING 1 -p tcp \
-m u32 --u32 '0>>24&0x0F=6:15' \
-m comment --comment 'cve98432-guard:v1' -j DROP
iptables -w 10 -t raw -I OUTPUT 1 -p tcp \
-m u32 --u32 '0>>24&0x0F=6:15' \
-m comment --comment 'cve98432-guard:v1' -j DROP
IPv4ヘッダーの最初のバイトには、バージョンとInternet Header Length(IHL)が含まれています。32ビットワード5個は、通常の20バイトヘッダーです。IHLが6~15の場合、IPオプションが存在します。u32はそのフィールドを直接読み取ります。
PREROUTINGは、リスナーへの配信前に到着するIPv4 TCPトラフィックをフィルタリングします。OUTPUTは、ローカルリスナーへの到達試行を含む、ローカルで生成されたトラフィックもフィルタリングします。また、IPオプションを含む送信応答をドロップする場合もあります。これらはIPv4 IPオプションであり、TCPオプションとは異なるヘッダーフィールドです。IPオプションを持たない通常のSSH、HTTPS、その他のトラフィックは一致対象外です。
2回適用してもコピーは追加されません。2回目の挿入が失敗した場合、その呼び出しで試行されたルールのみがロールバックされ、既存の完全一致ルールは保持されます。removeは、このツールの完全一致ルールの重複もクリーンアップします。このツールの同時呼び出しは直列化されます。ただし、無関係なファイアウォールマネージャーが同時にルールを変更する可能性はあります。
アップストリームのアドバイザリは、SYN-ACKの構築中またはリクエストの移行中に発生するIPv4リクエスト/ソケットオプションのuse-after-freeについて説明しています。修正は、2つのデストラクタを変更してRCU経由で解放を遅延させます。
IPオプション付きの受信パケットをフィルタリングすることで、通常パケットによって供給されるオプションが、これらのフックが対象とする経路上でTCPに到達するのを防ぎます。これがこの暫定対策の根拠です。これは分析に基づく緩和策であり、完全なエクスプロイトの再現でも、脆弱なコードへのあらゆる経路に対する保証でもありません。
以下の制限を確認してください。
| 状況 | 制限 / 対応 |
|---|---|
| コンテナ、ネットワーク名前空間、VPN名前空間 | ルールは名前空間ごとです。ホストのルールは、別の名前空間内に閉じたトラフィックをカバーしません。関連する各名前空間内で検査および適用してください。コンテナはホストカーネルを共有します。 |
| Linuxブリッジ / レイヤー2フォワーディング | これらのIPv4ルールは完全なブリッジポリシーではありません。宛先名前空間がカバーされていることを確認してください。そのフォワーディング経路でフィルタリングが必要な場合は、ブリッジファミリーのルールを使用してください。 |
| トンネル | デコードされた内側のIPv4経路でフィルタリングを確認してください。暗号化された外側のパケットは、内側のIPオプションを外側のフィルターに公開しません。 |
| SELinuxまたはSmackを使用するNetLabel / CIPSO | CIPSOはカーネルのラベリング経路を通じてリクエストオプションを設定できます。イングレスヘッダーのフィルタリングをその経路のカバレッジと見なさないでください。SELinuxが有効になっているだけでは、CIPSOが設定されていることの証明にはなりません。 |
| 既存のソケットまたは保留中のリクエスト | フィルターの追加は、すでに作成されたカーネルオブジェクトのクリーンアップやパッチではありません。 |
| ファイアウォールのリロード | リロード、リストア、コンテナオーケストレーター、または管理者によってルールが削除または並べ替えられる可能性があります。ステータスを再確認し、再適用してください。 |
| 既存のrawテーブルの終端ルール | 新しいルールは位置1に配置されますが、その後のルール変更により終端ルールがそれらの前に配置される可能性があります。順序を検査してください。 |
| IPオプションを必要とするクライアント | その接続が機能しなくなる可能性があります。これには特殊なセキュリティラベリングのデプロイメントが含まれます。 |
| IPv6 | これらのルールはIPv6をフィルタリングせず、別途追跡されるIPv6/CALIPSO移行の問題にも対処しません。 |
バージョン文字列、変更履歴の記載、リスナー出力が空であること、またはパケットカウンターがゼロであることに基づいて、カーネルにパッチが適用されていると自動的に主張することはありません。ベンダーカーネルは修正をバックポートしており、generic、cloud、HWEなどの個別のフレーバーを持っています。新しいカーネルがインストールされていても、それが実行中のカーネルであるとは限りません。
Anthropicの10月27日のレポートは、MPTCPリスナーを持つサーバーに対するリモートrootエクスプロイトについて説明しています。基盤となるアドバイザリは、MPTCPに限定されないIPv4 TCPの競合状態について説明しています。両方の事実が重要です。
アプリケーションがMPTCPを必要としない場合、新しいMPTCPソケットを別途無効化できます。
# Record the current value before changing it.
sysctl net.mptcp.enabled
sudo sysctl -w net.mptcp.enabled=0
この設定はネットワーク名前空間ごとのもので、新しいソケットの作成を制御します。 このコマンドによって既存の MPTCP リスナーがプレーン TCP に変換されることはありません。 依存するサービスを特定し、必要に応じて意図的に再起動/再設定してください。 このツールはサービスを再起動しません。一部のアプリケーションは通常の TCP にフォールバックせず、失敗する可能性があります。
変更を永続化する場合は、通常の sysctl 設定を通じて
net.mptcp.enabled = 0 の行を追加してください。後で復元できるよう、対象ファイルと
以前の実行時の値を記録しておいてください。ガードの remove コマンドは、
別途行われた sysctl の変更を元に戻しません。
net.ipv4.tcp_migrate_req=0 も同様に、1 つの移行メカニズムのみを制限します。
reuseport BPF 移行プログラムは別のメカニズムであり、主要な競合状態は
依然として残ります。どちらの sysctl もパッチ適用の代替にはなりません。
サーバー上で:
sudo bash paranoid-cve98432.sh status
PRESENT は、タグ付けされたルールが正確にインストールされていることを意味します。pkts と bytes は、挿入以降の一致数を示します。カウントがゼロであることは、一致がカウントされていないことを意味するだけで、保護の有無や攻撃の不在を証明するものではありません。
IP オプションのフィルタリングを行わない別の Linux クライアントから、サーバー上の既知のオープンポートに対して:
python3 verify-filter.py SERVER_IPV4 22
ヘルパーは、プレーンな TCP 接続を 1 つと、Record Route IP オプション付きの接続を 1 つ行います。アプリケーションデータは送信せず、レースやエクスプロイトも実行しません。
| 結果 | 解釈 |
|---|---|
| プレーンは接続、オプションはタイムアウト | 経路上のどこかでフィルタリングされていることと整合します。タグ付きターゲットの DROP カウンタが増加することを確認してください。 |
| 両方とも接続 | この経路ではオプションが受け入れられています。これはカーネルにパッチが適用されているかどうかを立証するものではありません。 |
| プレーンが失敗、オプションのセットアップが失敗、または接続が拒否される | 結論は出ません。ポート、ルーティング、ローカルのオプションサポート、ファイアウォールポリシーを確認してください。 |
クライアント自身のフィルタが、送信するプローブやオプション付きの応答をドロップする可能性があります。ルータも IP オプションをドロップする可能性があります。タイムアウトだけでは、サーバ側のルールが機能した証拠にはなりません。ヘルパーは意図的に、エクスプロイトによる立証を避けています。
実行時の apply は再起動後には保持されません。付属の systemd ユニットは起動時にルールを再適用します。必要に応じて明示的にインストールしてください:
sudo install -m 0755 paranoid-cve98432.sh /usr/local/sbin/cve98432-guard
sudo install -m 0644 systemd/cve98432-guard.service \
/etc/systemd/system/cve98432-guard.service
sudo systemctl daemon-reload
sudo systemctl enable --now cve98432-guard.service
sudo /usr/local/sbin/cve98432-guard status
このサービスはホストの現在の iptables 代替を使用します。このサービスに依存している間は、その代替を変更しないでください。このサービスは自身の名前空間のみを対象とし、Docker/LXC やその他の名前空間にルールを自動的に注入することはありません。
このユニットは起動時の永続化を提供するものであり、継続的な強制ではありません。外部ファイアウォールのリロード後は、次を実行してください:
sudo systemctl reload cve98432-guard.service
sudo /usr/local/sbin/cve98432-guard status
systemctl is-active だけでは、ルールがまだ存在することを検証できません。
より強固な統合を行うには、すでに使用しているファイアウォールマネージャーに同等のルールを追加し、2つの独立したマネージャーに依存しないようにしてください。
修正済みカーネルが実行されていることを確認した後、永続的なインストールを削除します:
sudo systemctl disable --now paranoid-cve98432.service
sudo /usr/local/sbin/cve98432-guard remove
sudo rm /etc/systemd/system/paranoid-cve98432.service
sudo systemctl daemon-reload
sudo rm /usr/local/sbin/paranoid-cve98432
明示的な remove は、ランタイムルールがまだ存在していた間に非アクティブだったユニットも処理します。以前の stop/remove コマンドが失敗した場合は、ファイル削除の手順を実行しないでください。まずエラーを確認してください。
名前付き VPN/ネットワーク名前空間の場合:
sudo ip netns exec YOUR_NAMESPACE bash ./paranoid-cve98432.sh apply
sudo ip netns exec YOUR_NAMESPACE bash ./paranoid-cve98432.sh status
# Later:
sudo ip netns exec YOUR_NAMESPACE bash ./paranoid-cve98432.sh remove
コンテナ名前空間の場合は、明示的に特定したコンテナ PID と nsenter -t PID -n を指定してホストのツールを使用します。名前空間の再作成後には再適用してください。
このパッケージはコンテナの検出、コンテナへの権限付与、コンテナイメージ内への書き込みは行いません。