丢弃 IP 头部包含选项的入站 IPv4 TCP 数据包。
针对 CVE-2026-98432 的一个小型、可逆的 iptables 临时缓解措施。
在当前网络命名空间中丢弃包含 IP 选项的 IPv4 TCP 数据包。 包含清晰的状态输出、可重复执行的 apply/remove 命令、只读 清单、可选的 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 会话处于打开状态,并确认第二个 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 首部长度(IHL)。五个 32 位字是正常的 20 字节首部。IHL 为 6–15 表示存在 IP 选项。u32 会直接读取该字段。
PREROUTING 在到达的 IPv4 TCP 流量交付给监听者之前对其进行过滤。OUTPUT 还会过滤本地生成的流量,包括尝试访问本地监听者的流量。它也可能丢弃携带 IP 选项的传出回复。这些是 IPv4 IP 选项,是与 TCP 选项不同的首部字段。不带 IP 选项的正常 SSH、HTTPS 及其他流量不在匹配范围内。
重复应用不会增加更多副本。如果第二次插入失败,只会回滚该次调用尝试的规则;先前已存在的完全相同的规则会被保留。remove 还会清理本工具完全相同的规则的重复项。本工具的并发调用会被串行化。无关的防火墙管理器仍可能同时更改规则。
上游公告描述了在构建 SYN-ACK 或迁移请求时,IPv4 请求/套接字选项的释放后使用(use-after-free)问题。修复方案更改了两个析构函数,通过 RCU 延迟释放。
过滤携带 IP 选项的传入数据包,可防止通常由数据包提供的选项在这些钩子覆盖的路径上到达 TCP。这就是此临时缓解措施的依据。这是一种基于分析的缓解措施,并非对完整漏洞利用的复现,也不保证能阻止进入易受攻击代码的所有途径。
请检查以下限制:
| 情况 | 限制 / 操作 |
|---|---|
| 容器、网络命名空间、VPN 命名空间 | 规则按命名空间生效。主机规则不覆盖限制在另一命名空间内的流量。请在每个相关命名空间内检查并应用。容器共享主机内核。 |
| Linux 网桥 / 二层转发 | 这些 IPv4 规则不是完整的网桥策略。确保目标命名空间已被覆盖;如果该转发路径需要过滤,请使用 bridge 族规则。 |
| 隧道 | 确认在解码后的内层 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 同样只限制一种迁移机制。一个
reuseport BPF 迁移程序是另一种机制,而主要的竞态仍然存在。
这两个 sysctl 都不能替代打补丁。
在服务器上:
sudo bash paranoid-cve98432.sh status
PRESENT 表示已安装完全匹配的标记规则。pkts 和 bytes 显示自插入以来的匹配次数。计数为零表示尚未统计到匹配;这并不能证明已提供保护或不存在攻击。
从一台未启用 IP 选项过滤的独立 Linux 客户端,针对你服务器上一个已知的开放端口:
python3 verify-filter.py SERVER_IPV4 22
该辅助工具会建立一个普通 TCP 连接和一个带 Record Route IP 选项的连接。它不发送任何应用数据,也不运行任何竞态或漏洞利用。
| 结果 | 解读 |
|---|---|
| 普通连接成功;选项连接超时 | 与路径中某处存在过滤的情况一致。确认带标记的目标 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 并不能验证规则是否仍然存在。
为实现更强的集成,请将等效规则添加到您已经在使用的防火墙管理器中,
而不是依赖两个独立的管理器。
在确认已运行修复后的内核后,移除持久化安装:
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。在命名空间重建后需重新应用。本软件包不会发现容器、授予容器能力,也不会在容器镜像内写入。
| 命令 | 行为 |
|---|---|
status(默认) | 检查精确规则和原始表计数器;不修改防火墙 |
apply | 添加缺失的运行时规则 |
remove | 仅删除精确标记的规则 |
audit | 读取内核、操作系统、命名空间、监听器及相关 sysctl |
apply --dry-run / remove --dry-run | 打印命令;不调用 iptables |
--version / --help | 显示版本/帮助 |
Guard 退出码:0 命令成功(对于 status:两条规则均存在),1 操作错误,2 参数错误,3 status 发现一条或两条规则缺失。Audit 退出码 0 表示清点完成,并不表示机器安全。
Probe 退出码:0 结果与过滤一致,2 选项被接受或 CLI 参数无效,3 无法确定。
bash -n paranoid-cve98432.sh
python3 -m unittest discover -s tests -v
主要参考资料:
公告状态会发生变化。请针对你实际运行的内核软件包使用当前的厂商信息,而不是工作进展中的跟踪器行里计划发布的版本号。