可通过网络攻击,无需登录,也无需用户操作。 该漏洞位于处理每个传入 IPv4 TCP 连接的内核代码中。
本指南介绍如何检查服务器、在修补后的内核可用之前保护服务器,以及事后进行清理。以下命令已在 Ubuntu 22.04 和 24.04 服务器上使用。
本文档中的状态截至 2026-10-30。补丁状态变化很快,因此请始终查看您所在发行版自己的安全跟踪器。
e3f33b0a1d89通俗地说: 一个连接请求(SYN)可以携带 IPv4 选项,即数据包头中很少使用的附加内容,例如记录路由或时间戳。当这样的请求到达时,内核会保留这些选项的副本。如果攻击者在恰到好处的时机重发该 SYN,一个 CPU 可能释放该副本,而另一个 CPU 仍在使用它来构建回复。这就是 ip_options_build() 中的释放后使用(use-after-free),它可能导致服务器崩溃或损坏内核内存。
当服务器在套接字之间迁移待处理的连接请求时(net.ipv4.tcp_migrate_req=1,或使用 BPF_SK_REUSEPORT_SELECT_OR_MIGRATE 程序),还存在第二个触发条件。该设置默认关闭。
| Ubuntu 优先级 | 高 |
| CVSS,内核 CNA | 9.8 严重:网络、无需身份验证、无需用户交互 |
| CVSS,Red Hat | 8.1,因为 Red Hat 认为该竞争条件更难触发 |
| 受影响 | 自 4.4 起的内核 |
| IPv6 | 不受主要问题影响 |
| 利用情况 | 未报告在野利用,也不在 CISA KEV 目录中。针对带有 多路径 TCP(MPTCP)监听器的服务器的远程 root 利用已被报告,但尚未公开。 |
谁面临风险: 任何具有可通过 IPv4 访问的 TCP 端口的服务器,无论是 SSH、HTTP、HTTPS 还是其他任何服务。
| 发行版 | 状态 | 修复于 |
|---|---|---|
| 上游内核 | ✅ 已修复 | 5.10.272、5.15.223、6.1.190、6.6.159、6.12.113、6.18.56、7.2.10、7.3 |
| Debian 12 / 13 | ✅ 已修复 | 6.1.190-1(或 linux-6.12 6.12.113-1~deb12u1)/ 6.12.113-1 |
| Ubuntu 26.10 / 26.04 / 24.04 / 22.04 | ❌ 修复进行中,尚未发布 | 计划:7.3.0-10.10 / 7.0.0-43.43 / 6.8.0-149.149 / 5.15.0-203.213 |
| Ubuntu 20.04 / 18.04 / 16.04 | ❌ 存在漏洞 | 仅通过 Ubuntu Pro(ESM)提供,如果提供的话 |
| RHEL 8 / 9 / 10 | ❌ 报告为“修复推迟” | 无 |
| Oracle Linux(UEK) | ✅ 已修复 | ELSA-2026-500397 / 500398 / 500399 |
| Amazon Linux 2023 | ⚠️ 部分修复 | kernel6.18 和 kernel6.12 已修复;默认内核和 AL2 待定 |
| SUSE | ⚠️ 部分修复 | openSUSE Leap 16.0 已修复;SLES 进行中 |
Ubuntu 云内核(-aws、-azure、-gcp、-oracle)有自己的版本号。发行版内核会向后移植修复,因此不要将 5.15.0-xxx 这样的发行版版本号与上游版本号进行比较。
此操作仅读取并报告。它不会安装、更改或重启任何内容。将其粘贴到服务器上的终端中:
sudo bash -s <<'EOF'
CVE=CVE-2026-98432; FIX="free inet_opt and ireq_opt"; KR=$(uname -r)
. /etc/os-release
echo "== $PRETTY_NAME | running kernel: $KR"; echo " build: $(uname -v)"
echo "== Installed kernels (if one is newer than the running kernel, you need a reboot)"
ls -1v /boot/vmlinuz-* 2>/dev/null | sed 's|/boot/vmlinuz-| |'
[ -f /var/run/reboot-required ] && echo " !! reboot required"
echo "== Is the fix in the RUNNING kernel's changelog?"
if command -v dpkg >/dev/null; then
dpkg-query -W -f=' package version: ${Version}\n' "linux-image-$KR" 2>/dev/null
zgrep -Eqs "$CVE|$FIX" /usr/share/doc/linux-*"$KR"*/changelog.Debian.gz \
&& echo " PATCHED" || echo " NOT FOUND -> likely VULNERABLE"
command -v pro >/dev/null && pro fix "$CVE" --dry-run </dev/null
elif command -v rpm >/dev/null; then
PKG=$(rpm -qf "/lib/modules/$KR/vmlinuz" "/usr/lib/modules/$KR/vmlinuz" "/boot/vmlinuz-$KR" 2>/dev/null | grep -v 'not owned' | head -1)
echo " package: ${PKG:-unknown}"
rpm -q --changelog "$PKG" 2>/dev/null | grep -Eq "$CVE|$FIX" \
&& echo " PATCHED" || echo " NOT FOUND -> likely VULNERABLE"
if command -v zypper >/dev/null; then zypper -n -q lp -a --cve="$CVE" </dev/null
elif command -v dnf >/dev/null; then dnf -q updateinfo list --all --cve="$CVE" </dev/null
elif command -v yum >/dev/null; then yum -q updateinfo list --cve="$CVE" </dev/null; fi
fi
echo "== Exposure"
sysctl net.mptcp.enabled net.ipv4.tcp_migrate_req 2>/dev/null | sed 's/^/ /'
M=$(ss -lnMH 2>/dev/null); echo " MPTCP listeners (reported root-exploit path): ${M:-none}"
echo " TCP listeners not on loopback (attack surface):"
ss -ltnH | awk '$4 !~ /^(127\.|\[::1\])/ {print " "$4}' | sort -u
EOF
把它整段粘贴进去:最后的 EOF 必须单独占一行,且行首不能有空格。
解读输出:
| 你看到 | 含义 | 下一步 |
|---|---|---|
PATCHED | 正在运行的内核已经包含修复 | 你已完成 |
NOT FOUND -> likely VULNERABLE | 正在运行的内核中没有修复 | 第 2 步 |
!! reboot required,或列出了比正在运行的内核更新的内核 | 已安装更新的内核,但尚未运行 | 第 3 步 |
A fix is coming soon(Ubuntu) | Ubuntu 尚未发布修复 | 现在执行第 2 步,稍后执行第 5 步 |
MPTCP listeners: none | 所报告的 root 提权路径当前不适用 | — |
数据库或缓存端口,例如 *:3306、0.0.0.0:6379 或 0.0.0.0:11211 | 它监听所有接口 | 确保防火墙阻止它(见第 4 步末尾) |
下面的规则会丢弃携带 IP 选项的 IPv4 TCP 数据包,而这正是攻击者触发该漏洞所需要的。正常客户端(浏览器、SSH、手机、API、负载均衡器)从不会发送 IP 选项,因此真实流量不会受到影响。
首先检查服务器使用的是哪种防火墙工具:
systemctl is-active ufw nftables firewalld
如果 nftables 或 firewalld 处于 active 状态,重新加载该防火墙可能会清除此规则。请使用本步骤末尾的 nftables 变体,或根据你的环境进行调整。
安装临时方案。 它是一个小型 systemd 单元,因此每次重启后规则都会恢复:
sudo tee /etc/systemd/system/cve-2026-98432.service >/dev/null <<'EOF'
[Unit]
Description=Stopgap for CVE-2026-98432: drop IPv4 TCP packets carrying IP options
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/iptables -t raw -I PREROUTING -p tcp -m u32 --u32 "0>>24&0xF=6:15" -m comment --comment CVE-2026-98432 -j DROP
ExecStop=/usr/sbin/iptables -t raw -D PREROUTING -p tcp -m u32 --u32 "0>>24&0xF=6:15" -m comment --comment CVE-2026-98432 -j DROP
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload && sudo systemctl enable --now cve-2026-98432
sudo iptables -t raw -L PREROUTING -v -n
最后一条命令应列出一条带有注释 CVE-2026-98432 的 DROP 规则。pkts 列统计它拦截的数据包数量;该值应保持为 0 或接近 0。
u32 测试 0>>24&0xF=6:15 读取 IPv4 头部长度字段。正常头部为 5 × 4 = 20 字节。任何更长的值都意味着附加了选项,该数据包会被丢弃。该规则位于 raw 表中,而 ufw 不管理该表,因此你现有的防火墙规则不受影响。
继续之前请检查 SSH: 保持当前会话打开,并从第二个终端登录。然后加载你的网站。
要立即撤销:
sudo systemctl stop cve-2026-98432
每个数据包都有一个头部,其中携带源 IP 和目的 IP,连接正是依靠它来完成的。该规则会忽略这些地址。它只查找头部中很少使用的 options 扩展字段,该字段会使头部长度超过 20 字节。使用 ssh [email protected] 或 https://1.2.3.4 连接时,行为与之前完全一致。
如果第 1 步显示 MPTCP listeners: none,你可以关闭 MPTCP。在没有任何东西使用它时,这样做是无害的:
echo 'net.mptcp.enabled = 0' | sudo tee /etc/sysctl.d/99-disable-mptcp.conf
sudo sysctl -p /etc/sysctl.d/99-disable-mptcp.conf
sudo nft add table ip cve98432
sudo nft add chain ip cve98432 pre '{ type filter hook prerouting priority -300; policy accept; }'
sudo nft add rule ip cve98432 pre ip protocol tcp ip hdrlength gt 5 counter drop
# undo: sudo nft delete table ip cve98432
此规则不会在重启后保留。如需持久生效,请将其添加到你的持久化 nftables 配置中。
在 Ubuntu 上,重启目前还无法修复此 CVE,因为尚不存在已修复的内核。但它会加载已安装的最新内核,而该内核通常包含数月以来的其他安全修复。
重启之前:
uptime -s; screen -ls; tmux ls
systemctl list-units --type=service --state=running --no-legend | awk '{print $1}' | sort > /root/services-before.txt
然后:
sudo reboot
没有安装更新的内核,但内核版本很旧? 自动更新可能已关闭。用以下命令检查
sudo apt update && apt list --upgradable 2>/dev/null | grep -E '^linux-(generic|image)'。 如果有待安装的内核,请安装更新并保留现有配置文件:sudo apt -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade然后重启。用以下命令重新开启自动更新:printf 'APT::Periodic::Update-Package-Lists "1";\nAPT::Periodic::Unattended-Upgrade "1";\n' | sudo tee /etc/apt/apt.conf.d/20auto-upgrades
sudo ufw status verbose
uname -r
sudo iptables -t raw -L PREROUTING -v -n
systemctl --failed
| 检查项 | 预期结果 |
|---|---|
ufw status | Default: deny (incoming),仅允许你实际提供服务的端口(通常为 22、80、443)从 Anywhere 访问 |
uname -r | 步骤 1 中更新的内核版本 |
iptables … | CVE-2026-98432 的 DROP 规则已存在 |
systemctl --failed | 0 loaded units listed |
如果你在步骤 3 中保存了 services-before.txt,请将其与当前正在运行的服务进行对比。以 < 开头的行表示重启前运行、现在未运行的服务:
systemctl list-units --type=service --state=running --no-legend | awk '{print $1}' | sort | diff /root/services-before.txt -
MySQL 副本: 检查复制是否已恢复: