一个幂等脚本,用于丢弃携带 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 跟踪器)。
一旦你的发行版显示为“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 安全团队指出,该缺陷并非 MPTCP 特有。
被过早释放的内存仅在传入的 SYN 携带 IPv4 选项时才存在。没有 选项时就没有保存的缓冲区,因此释放后使用漏洞没有可作用的对象。合法的 TCP 流量 实际上几乎从不携带 IPv4 选项,因此丢弃这些数据包在实践中没有代价。Red Hat (RHSB-2026-016)和 AlmaLinux 发布了等效的 nftables 规则。
u32 "0>>24&0xF=6:15" 读取 IHL 字段,即 IPv4 头部长度(以 32 位字为单位)。值为 5 表示
仅 20 字节的裸头部。6 到 15 的值表示存在选项。
Red Hat 表示,此类规则“降低了暴露于该漏洞的风险,但无法完全防止它”。 在内核被打补丁之前,请将其视为风险降低措施。
raw / PREROUTINGPREROUTING 会看到每一个传入数据包,既包括发往主机的流量,也包括转发到已发布端口上 Docker
容器的流量。INPUT 中的规则(ufw 放置其规则的位置)会漏掉
转发的流量。raw 表在连接跟踪之前运行,因此被丢弃的数据包永远不会创建 conntrack 条目。raw/PREROUTING,因此该规则能在它们重启后继续存在。iptables 存在于每个 Ubuntu 目标发行版上。在 Ubuntu 18.04 和 20.04 上它使用 legacy
后端;从 Ubuntu 22.04 和 Debian 11+ 起则是 iptables-nft。nft 二进制文件并非
在所有地方都默认安装。在 Debian 上,iptables 本身可能缺失;此时脚本会要求你运行
apt install iptables。iptables-nft 时,ufw/Docker 和此规则共享 nf_tables 后端,因此一条规则即可覆盖两者。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 是否已启用,以及是否恰好有一条规则处于活动状态。随后它会使用 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 内核),也未执行真实重启。