
UbuntuおよびDebianにおいて、修正済みカーネルが利用可能になるまでの間、CVE-2026-98432を緩和するためにIPオプション付きのIPv4 TCPパケットをドロップする永続的なiptablesルールをインストールする冪等なシェルスクリプトです。
IP オプションを含む受信 IPv4 TCP パケットを破棄し、再起動後もルールを維持し、それが機能することを確認する、単一の冪等なスクリプトです。まだ修正済みカーネルを入手できない Ubuntu (18.04 – 24.04) および Debian (11 – 13) のサーバーを対象としています。
これは暫定措置であり、修正ではありません。 唯一の真の修正は、パッチ適用済みカーネルと再起動です。サーバーが修正済みカーネルで稼働するようになったら、この緩和策を削除してください。
curl -fsSL https://raw.githubusercontent.com/Mervent/cve-2026-98432/master/install.sh | sudo sh
何度でも実行できます。ファイルは上書きされ、ルールが重複することはありません。 最後にスクリプトが結果を検証し、失敗した場合は非ゼロで終了します:
--- validation ---
OK helper installed: /usr/local/sbin/cve-2026-98432-mitigation
OK cron entry: /etc/cron.d/cve-2026-98432
OK cron service enabled
OK iptables rule active (raw/PREROUTING)
OK exactly one rule (no duplicates)
plain SYN: connected, SYN with IP options: timeout
OK drop test: packets with IP options are dropped
--- rule counters ---
pkts bytes target prot opt in out source destination
3 204 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 u32 "0x0>>0x18&0xf=0x6:0xf" /* cve-2026-98432 */
| パス | 目的 |
|---|---|
/usr/local/sbin/cve-2026-98432-mitigation | ルールを保持するヘルパー。引数なしで実行すると、ルールが存在しない場合に追加します。--check はルールが有効な場合に終了コード 0 で終了します。--remove はルールを削除します。 |
/etc/cron.d/cve-2026-98432 | 起動のたびにルールを再適用する @reboot エントリ |
ルール自体:
iptables -t raw -I PREROUTING -p tcp -m u32 --u32 "0>>24&0xF=6:15" \
-m comment --comment cve-2026-98432 -j DROP
sudo /usr/local/sbin/cve-2026-98432-mitigation --check && echo active
sudo iptables -t raw -L PREROUTING -v -n | grep cve-2026-98432
sudo /usr/local/sbin/cve-2026-98432-mitigation --remove
sudo rm /usr/local/sbin/cve-2026-98432-mitigation /etc/cron.d/cve-2026-98432
お使いのディストリビューションで修正が提供されているかどうかを確認するには、
Ubuntu または Debian
を確認してください(Debian 9 – 11 の場合は Freexian ELTS tracker)。
お使いのリリースが「Fixed」と表示されたら、apt update && apt full-upgrade を実行し、再起動してから緩和策を削除してください。
2026年11月1日時点で、Debian 12(linux 6.1.190-1、DLA-4841-1)と Debian 13(linux 6.12.113-1、
DSA-6568-1)には修正済みカーネルが既に提供されているため、これらのリリースではこのスクリプトを使わずにアップグレードしてください。
Debian 11 の修正(linux 5.10.272-1、ELA-1846-1)は Freexian の ELTS リポジトリにのみ存在します。商用ですが、
個人および小規模な非営利団体は申請により無償で利用できます。
CVE-2026-98432(「ipv4: free inet_opt and ireq_opt after an RCU grace period」)は、IPv4 TCP ハンドシェイクにおける use-after-free です。Linux 4.4 以降に影響し、CVSS 9.8 と評価されています。
SYN が IPv4 オプションを運んでいる場合、カーネルはそれを SYN-ACK でエコーバックできるようリクエストソケットに保存します。
その後 tcp_v4_syn_recv_sock() がそのバッファをコピーせずに子ソケットへ渡します。
子ソケットが破棄されると、バッファは単純な kfree() で解放されますが、その間にも別の CPU が再送された SYN に対する
SYN-ACK を構築するためにそのバッファを読み取っている可能性があります。
これらはすべて、アプリケーションが接続を認識する前にカーネル内で発生します。リッスンしている任意の IPv4 TCP ポート(SSH、HTTP、PostgreSQL など)がこの方法で到達可能であり、認証情報は不要です。 Anthropic は、マルチパス TCP(MPTCP)リスナーを持つホストに対して動作するリモート root エクスプロイトを報告しました。 Go Security Team は、このバグが MPTCP に固有のものではないと指摘しています。
早期に解放されてしまうメモリは、受信した SYN が IPv4 オプションを運んでいる場合にのみ存在します。オプションがなければ 保存されるバッファも存在しないため、use-after-free が作用する対象がありません。正当な TCP トラフィックが IPv4 オプションを運ぶことは実質的に皆無であるため、これらのパケットを破棄しても実用上のコストはかかりません。Red Hat (RHSB-2026-016)と AlmaLinux は同等の nftables ルールを公開しています。
u32 "0>>24&0xF=6:15" は IHL フィールド、すなわち 32 ビットワード単位の IPv4 ヘッダ長を読み取ります。値 5 は
オプションなしの 20 バイトヘッダを意味します。6 から 15 の値はオプションが存在することを意味します。
Red Hat は、このようなルールは「この脆弱性への露出を減らすが、完全に防ぐことはできない」と述べています。 カーネルにパッチが適用されるまでは、リスク低減策として扱ってください。
raw / PREROUTING を使う理由PREROUTING は、ホスト宛てのトラフィックと、公開ポート上の Docker コンテナへ転送されるトラフィックの両方を含む、
すべての受信パケットを検査します。ufw がルールを配置する INPUT にルールを置くと、転送トラフィックを取りこぼします。raw テーブルはコネクショントラッキングより前に実行されるため、破棄されたパケットが conntrack エントリを作成することはありません。raw/PREROUTING をフラッシュしないため、ルールはそれらの再起動後も維持されます。iptables はすべての対象 Ubuntu リリースに存在します。Ubuntu 18.04 と 20.04 ではレガシーバックエンドを使用し、
Ubuntu 22.04 以降および Debian 11 以降では iptables-nft です。nft バイナリはすべての環境にデフォルトで
インストールされているわけではありません。Debian では iptables 自体が存在しない場合があり、その場合スクリプトは
apt install iptables の実行を促します。iptables-nft を使用する場合、ufw/Docker とこのルールは nf_tables バックエンドを共有するため、1 つのルールで両方をカバーできます。u32 マッチには xt_u32 カーネルモジュールが必要です。存在しない場合、スクリプトは失敗し、modinfo xt_u32 を
確認するよう指示します。@reboot エントリを使う理由nftables.service ではない。 Ubuntu では /etc/nftables.conf が flush ruleset で始まり、サービスは停止時に nft flush ruleset を実行する。どちらも ufw と Docker のルールを消し去ってしまう。iptables-persistent ではない。 netfilter-persistent save は Docker のものを含む現在のすべてのルールをダンプし、そのスナップショットを起動時に復元すると Docker 自身が作成するルールと競合する。before.rules ではない。 これは ufw が有効な場合にしか機能せず、そのチェーンはコンテナへの転送トラフィックを認識しない。/etc/cron.d 内のファイルは上書きによって冪等になり、削除も rm 一発で済む。トレードオフは、起動後ネットワークが立ち上がってから cron がルールを適用するまでの数秒間の空白である。次のカーネル更新まで持てばよい緩和策としては許容範囲である。net.mptcp.enabled=0 ではだめな理由MPTCP を無効化しても、公開されているエクスプロイトの前提条件が取り除かれるだけで、バグ自体は残る。通常の TCP リスナーも同じ脆弱なコードを通る。MPTCP リスナーのないサーバー(ss -Mlnp が何も出力しない)では、この sysctl は何も変えない。無害な追加措置ではあるが、このルールの代替にはならない。
スクリプトは、ヘルパーと cron エントリがインストールされていること、cron が有効であること、そしてルールがちょうど 1 つだけアクティブであることを確認する。その後 python3 を使ったエンドツーエンドのドロップテストを実行する(python3 がなければスキップされる):
127.0.0.1 でリスナーを開く。ループバックトラフィックは raw/PREROUTING を通るため、これはルールが実際にパケットをドロップしていること、単にテーブルに存在するだけではないことを証明する。
Ubuntu 24.04 カーネル 6.8.0-100-generic を実行する Docker ホスト上のコンテナ(ubuntu:18.04、20.04、22.04、24.04、debian:11-slim、12-slim、13-slim)で実行した。各実行では、パイプ経由のインストール、重複ルールなしでの再インストール、ドロップテスト、cron @reboot による削除済みルールの復旧をカバーした。
| リリース | iptables | 結果 |
|---|---|---|
| Ubuntu 18.04 | 1.6.1 (legacy) | 合格 |
| Ubuntu 20.04 | 1.8.4 (legacy) | 合格 |
| Ubuntu 22.04 | 1.8.7 (nf_tables) | 合格 |
| Ubuntu 24.04 | 1.8.10 (nf_tables) | 合格 |
| Debian 11 | 1.8.7 (nf_tables) | 合格 |
| Debian 12 | 1.8.9 (nf_tables) | 合格 |
| Debian 13 | 1.8.11 (nf_tables) | 合格 |
すべてのイメージはホストカーネルを共有していた。これらのリリースの標準カーネルにおける xt_u32 の可用性はテストされておらず(Ubuntu 24.04 の 6.8 カーネルのみが試された)、実際の再起動も行われていない。