
Debian/Ubuntu カーネルを CVE-2026-98432 について監査し、永続的な nftables および sysctl による緩和策を適用したうえで、カーネルのアップグレードとロールバックを案内します。
このスクリプトは、カーネルが CVE-2026-98432(IPv4 TCP 処理における use-after-free、CVSS 9.8)で修正済みかどうかを確認します。カーネルが未修正の場合、直ちに一時的防御を有効化し、カーネル更新のインストールを支援します。
この防御はリスクを低減しますが、脆弱性を排除するものではありません。 完全な解決策はただ一つ、修正済みカーネルをインストールして再起動することです。Red Hat の評価によると、IP オプション付きパケットのフィルタリングによって悪用を完全に防ぐことはできません。
tcp_v4_syn_recv_sock() が ireq_opt をコピーせずに子ソケットへ渡し、inet_sock_destruct() が通常の kfree() でそれを解放します。その時点で別の CPU コア上で処理されている再送 SYN が、ip_options_build() 内で既に解放されたメモリにアクセスします。net.ipv4.tcp_migrate_req=1 または BPF プログラム BPF_SK_REUSEPORT_SELECT_OR_MIGRATE。ipv4: free inet_opt and ireq_opt after an RCU grace period (e3f33b0a1d89)。| stable ブランチ | 修正済み |
|---|---|
| 5.10 | 5.10.272 |
| 5.15 | 5.15.223 |
| 6.1 | 6.1.190 |
| 6.6 | 6.6.159 |
| 6.12 | 6.12.113 |
| 6.18 | 6.18.56 |
| 7.2 | 7.2.10 |
| mainline | 7.3 |
2026 年 11 月 2 日時点の各ディストリビューションの状況:
linux 6.1.190-1 (DLA-4841-1) および linux-6.12 6.12.113-1~deb12u1 (DLA-4850-1) で修正済み。linux 6.12.113-1 (DSA-6568-1) で修正済み。prerouting フックで raw(−300)の優先度、つまりカーネルがオプションを解析する前に、IP オプション付き(IHL > 5)の受信 IPv4 TCP パケットを破棄します。nftables を使用し、利用できない場合は u32 モジュールを備えた iptables を使用します。net.mptcp.enabled = 0 を設定します。すでに開かれている MPTCP ソケットは MPTCP のまま残るため、スクリプトはそれらを列挙し、該当するサービスを再起動できるようにします。net.ipv4.tcp_migrate_req = 0 を設定します。nftables / netfilter-persistent / firewalld の再起動後の再適用、および 5 分ごとのタイマーによるチェックを行います。実行中のカーネルがすでに修正済みの場合、スクリプトは何も変更せず、以前に有効化した保護を解除する方法を案内します。
nftables(推奨)または iptables。永続的な保護には systemd が必要です。git clone https://github.com/IgrekLg/cve-2026-98432-mitigation.git
cd cve-2026-98432-mitigation
sudo bash mitigate-cve-2026-98432.sh # аудит, защита, предложение обновить ядро
sudo bash mitigate-cve-2026-98432.sh --status # только посмотреть, ничего не меняя
| キー | 動作 |
|---|---|
--status | 状態のみ表示 |
--uninstall | 保護を解除し、sysctl の元の値に戻す(カーネルが修正されていない場合は確認を求める) |
-y, --yes | 確認なし:カーネル更新をインストールし、--uninstall を確認 |
--no-upgrade | apt にアクセスしない:監査と保護のみ |
--force | カーネルがすでに修正されていても保護を有効化 |
--keep-mptcp | MPTCP を無効化しない |
--keep-tcp-migrate | net.ipv4.tcp_migrate_req に触れない |
ターミナルがない場合(Ansible、cron、-t なしの ssh)で --yes が指定されていない場合でも、保護は有効化され、カーネルのインストールはヒントを表示してスキップされます。
| コード | 意味 |
|---|---|
| 0 | 実行中のカーネルは修正済み、または影響なし |
| 3 | カーネルは未修正、保護は有効:更新と再起動が必要 |
| 4 | カーネルは未修正、保護は無効 |
| 1 | エラー |
| 2 | 不正な引数 |
Ansible の例:
- name: CVE-2026-98432 mitigation
ansible.builtin.script: mitigate-cve-2026-98432.sh --yes
register: cve
failed_when: cve.rc not in [0, 3]
changed_when: false
チェックは順番に実行されます:
CVE-2026-98432 または修正コミットのタイトルが記載されていれば、カーネルは修正済みです。6.1.190-1 のような形式の場合。 バージョンのアップストリーム部分を上記の表と比較します。Debian は stable アップデートを通じて修正を受け取りますが、changelog に CVE 番号が必ずしも記載されるわけではありません。5.15.0-NNN)は stable ブランチを反映していないため、changelog によってのみカーネルが修正済みと判定されます。changelog がない場合、ステータスは「修正は未確認」となり、保護が有効化されます。さらに pro fix CVE-2026-98432 --dry-run が出力されます。uname -r のバージョンを比較します。候補カーネル(-rc)は不明として扱われます。修正済みバージョンの表はスクリプトに埋め込まれています(FIXED_IN、データは 2026-11-02 時点)。独自カーネルを持つ派生ディストリビューション(Proxmox など)については、ベンダーの勧告を参照してください。
| パス | 用途 |
|---|---|
/usr/local/sbin/cve-2026-98432-fw | ヘルパー:apply / ensure / remove / check |
/etc/cve-2026-98432/mitigation.nft | nftables ルール(テーブル ip cve_2026_98432) |
/etc/systemd/system/cve-2026-98432-mitigation.service | 起動時にルールを適用、network-pre.target より前 |
/etc/systemd/system/cve-2026-98432-mitigation-check.{service,timer} | 5 分ごとにチェックし、ルールが誰かに削除されていた場合は復元(syslog に記録) |
/etc/systemd/system/{nftables,netfilter-persistent,firewalld}.service.d/50-cve-2026-98432.conf | これらのサービスによるルールの(再)読み込み後に再適用;インストール済みのものに対してのみ作成 |
/etc/sysctl.d/99-zz-cve-2026-98432.conf | sysctl;ファイル名は /etc/sysctl.conf の後に読み込まれるように選定 |
/var/lib/cve-2026-98432/sysctl.orig | --uninstall 用の sysctl 元の値 |
スクリプトの前バージョンのファイル(mitigate-CVE-2026-98432.service、99-CVE-2026-98432.conf、および iptables ルールの重複)は自動的に削除されます。
tcp_v6_syn_recv_sock() はオプションをコピーします。BPF_SK_REUSEPORT_SELECT_OR_MIGRATE プログラムを検出できません。手動で確認してください。systemctl stop nftables(またはサービス外での任意の nft flush ruleset)の後、ルールはすぐには戻らず、タイマーにより 5 分以内に戻ります。GODEBUG=multipathtcp=0 を設定できます。Go のセキュリティチームは、プログラムごとに MPTCP を無効化することを信頼できない対策と呼んでいます。修正済みカーネルで再起動した後:
sudo bash mitigate-cve-2026-98432.sh --uninstall
# логика определения версий, без изменений в системе
bash tests/test-logic.sh
# фильтр в изолированном сетевом пространстве имён (хост не затрагивается):
# ожидается plain=ok options=blocked при включённом правиле
sudo unshare -n sh -c 'python3 tests/netns-probe.py up && nft -f /etc/cve-2026-98432/mitigation.nft && python3 tests/netns-probe.py probe'