CVE-2026-98432 是 Linux 内核 IPv4 TCP 握手处理中的一个释放后使用(Use-After-Free)漏洞,影响 Linux 内核 4.4 及以上版本,修复前的最新稳定分支同样受影响。
攻击者向目标任意一个开放的 TCP 端口发送携带 IPv4 选项(Record Route 或 Timestamp)的 SYN 报文,再重传同一个 SYN。当一个 CPU 正在把这个请求套接字上的 IP 选项移交给子套接字,另一个 CPU 同时在为同一个请求套接字构造 SYNACK 时,内核就会读到已经释放的选项内存。
竞争成功可造成内核内存破坏与信息泄漏,并可能被进一步利用导致远程代码执行。攻击者只要持续重试即可,单次失败只会让本次握手中断。
值得注意的是,公开研究演示的利用链针对的是启用多路径 TCP(MPTCP)监听的服务器,但这个漏洞并非 MPTCP 特有,普通 TCP 监听端口同样可以触发。
| 项目 | 说明 |
|---|---|
| 🔖 漏洞编号 | CVE-2026-98432 / AVD-2026-98432 |
| 🎯 影响版本 | Linux 内核 4.4 起,至 5.10.272 / 5.15.223 / 6.1.190 / 6.6.159 / 6.12.113 / 6.18.56 / 7.2.10 之前 |
| 🧨 漏洞类型 | 释放后使用(UAF)→ 远程代码执行 |
| 📍 漏洞位置 | net/ipv4/af_inet.c → inet_sock_destruct();net/ipv4/tcp_ipv4.c → tcp_v4_reqsk_destructor() |
| 🚪 利用入口 | 任意开放的 TCP 端口,握手阶段,无需认证 |
| ⚠️ 危害 | 内核内存破坏、信息泄漏、远程代码执行、服务器失陷 |
| 📊 CVSS 3.1 | 9.8(严重),AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
问题出在内核 IPv4 协议栈对 ireq_opt(请求套接字上的 IP 选项)的所有权管理上。官方修复提交的标题是:
ipv4: free inet_opt and ireq_opt after an RCU grace period路径一:正常握手tcp_v4_syn_recv_sock() 把 ireq->ireq_opt 的所有权直接转移给子套接字 newinet->inet_opt,并没有做拷贝。与此同时,另一个 CPU 可能正在处理同一个请求套接字的重传 SYN,走 tcp_check_req() → tcp_v4_send_synack()。这条路径只在 rcu_read_lock() 下读取 ireq->ireq_opt,随后 ip_build_and_send_pkt() 和 ip_options_build() 会两次读取 opt->optlen。
自提交 079096f103fa(tcp/dccp: install syn_recv requests into ehash table)之后,请求套接字进入 ehash 表、处理时不再持有监听锁,因此子套接字完全可能在 SYNACK 还在构造时就被释放。而 TCP 子套接字没有 SOCK_RCU_FREE 标记,inet_sock_destruct() 用的是普通 kfree() —— 于是 ip_options_build() 读到的是已释放的内存。
路径二:请求套接字迁移
当 net.ipv4.tcp_migrate_req=1,或加载了 BPF_SK_REUSEPORT_SELECT_OR_MIGRATE 类型的 BPF 程序时,reqsk_timer_handler() 会用 inet_reqsk_clone() 克隆请求套接字。新旧两个请求套接字共享同一个 ireq_opt,随后 reqsk_migrate_reset() 把旧的那个指针清空。此时另一个 CPU 仍可能持有旧请求套接字的引用并在使用这些选项(发送 SYNACK,或在 tcp_v4_syn_recv_sock() 中创建子套接字),而克隆体被释放时 tcp_v4_reqsk_destructor() 同样是普通 kfree()。
修复方式
把 inet_sock_destruct() 和 tcp_v4_reqsk_destructor() 中的 kfree() 改为 kfree_rcu()。读取侧本来就走 RCU,其他替换 inet_opt 的路径(如 do_ip_setsockopt()、cipso_v4_sock_setattr())也早已使用 kfree_rcu(),这次是把释放侧补齐。
一个容易忽略的点:IPv6 不受路径一影响,因为tcp_v6_syn_recv_sock()会复制选项;但tcp_v6_reqsk_destructor()的迁移问题依然存在,会由另一个补丁处理。所以"只开 IPv6"不是安全的规避方案。
| 修复点 | 说明 |
|---|---|
| 🎯 内核升级 | 唯一彻底的修复方式,升级到公告给出的修复版本 |
| 🧯 关闭 MPTCP | 让公开利用链失效,但不等于修复,漏洞与 MPTCP 无关 |
| 🛡️ SYN 选项过滤 | 在防火墙丢弃带 IP 选项的 SYN,从入口切断触发条件 |
| 🔒 收敛暴露面 | 端口越少,攻击面越小,这是最根本的降风险手段 |
| 🚫 关闭请求迁移 | 堵住第二条触发路径 |
| ⚠️ 无单文件补丁 | 这是内核缺陷,不存在"替换一个文件即可修复"的方案 |
uname -r
cat /etc/os-release把输出和上表的修复版本对照。发行版内核以厂商公告为准,不能只看上游版本号。
# Ubuntu / Debian
sudo apt update
sudo apt install --only-upgrade linux-image-generic
sudo reboot
# RHEL / Rocky Linux / AlmaLinux / openEuler
sudo dnf update kernel kernel-core kernel-modules
sudo reboot升级前必做:
uname -r,便于在 GRUB 里回退。升级后必做:
uname -r # 确认已进入修复区间
systemctl status bt # 确认宝塔面板正常再登录面板,检查 CPU、内存、负载,逐个确认网站和数据库状态。
⚠️ 阿里云公告明确指出:各上游操作系统尚未正式发布对应安全更新补丁。执行升级后如果 uname -r 仍在受影响区间,说明厂商还没回移,必须继续执行下面的缓解措施,并持续关注厂商公告。1. 关闭 MPTCP
sysctl -w net.mptcp.enabled=0
echo 'net.mptcp.enabled=0' > /etc/sysctl.d/99-disable-mptcp.conf
sysctl --systemGo 1.24 起默认对监听套接字启用 MPTCP,这是公开利用链的前提。Go 项目还可以在程序层面兜底:
GODEBUG=multipathtcp=0 ./your-service或在 go.mod 中写死:
godebug multipathtcp=0但逐程序关闭是脆弱的,漏掉一个监听器整个系统就还在风险里,只能当过渡手段。
2. 丢弃带 IP 选项的 SYN
先用 tcpdump 观察 24 小时,确认业务不依赖 IP 选项:
tcpdump -ni any 'tcp[tcpflags] & tcp-syn != 0 and (ip[0] & 0x0f) > 5' -c 50没有输出即可放心加丢弃规则。
# iptables
iptables -N IPOPT_SYN_GUARD 2>/dev/null
iptables -F IPOPT_SYN_GUARD
iptables -A IPOPT_SYN_GUARD -p tcp --syn -m ipv4options --any -j DROP
iptables -I INPUT 1 -j IPOPT_SYN_GUARD# firewalld(iptables 手工规则会被 reload 清掉,必须用 direct)
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 \
-p tcp --syn -m ipv4options --any -j DROP
firewall-cmd --reloadufw 系统则在 /etc/ufw/before.rules 的 COMMIT 之前加入:
-A ufw-before-input -p tcp --syn -m ipv4options --any -j DROP⚠️ 宝塔面板的「安全」页面只能加端口和 IP 规则,加不了ipv4options这种匹配模块,必须走命令行。
⚠️ 这条规则会丢弃所有带 IP 选项的 SYN,包括极少数老旧网络设备发出的报文,所以先 LOG 观察再决定是否长期保留。
3. 收敛暴露面
0.0.0.0/0 开放,在「面板设置 → 安全设置 → 授权IP」限制来源;127.0.0.1。4. 关闭请求套接字迁移
sysctl net.ipv4.tcp_migrate_req # 默认 0,确认一下
sysctl -w net.ipv4.tcp_migrate_req=0uname -r对照修复版本表,确认已进入"不受影响"区间。
sysctl net.mptcp.enabled # 返回 0 表示已关闭
sysctl net.ipv4.tcp_migrate_req # 返回 0 表示已关闭
iptables -L IPOPT_SYN_GUARD -n -v # 看 pkts 计数是否增长pkts 持续增长说明确实有带 IP 选项的 SYN 在打你的服务器,这条规则正在起作用 —— 同时也说明你更应该尽快升级内核。
dmesg -T | grep -iE 'ip_options_build|BUG: unable to handle|general protection fault|KASAN'如果出现 ip_options_build 相关的 oops、general protection fault,或者 KASAN 报出 use-after-free,说明内核可能已经被触发过,需要按入侵事件处理:隔离主机、保留内存和日志、排查持久化。
| 链接 | 地址 |
|---|---|
| 阿里云漏洞库 | https://avd.aliyun.com/detail?id=AVD-2026-98432 |
| NVD 记录 | https://nvd.nist.gov/vuln/detail/CVE-2026-98432 |
| 内核修复提交 | https://git.kernel.org/stable/c/11a03ce3c4a62d84c10ccdfe47f8075006498568 |
| oss-security 讨论(Go 与 MPTCP) | http://www.openwall.com/lists/oss-security/2026/10/30/1 |
| oss-security 讨论(系统级关闭 MPTCP) | http://www.openwall.com/lists/oss-security/2026/10/30/6 |
ireq_opt 所有权转移与 RCU 宽限期外的 kfree()ipv4options SYN 过滤规则,覆盖 iptables / firewalld / ufw如果这篇文章对你有帮助,欢迎分享给身边还在用宝塔管理服务器的朋友! Made with ❤️ by YouChuang Open Source Community · Powered by Linux Kernel
—— 评论区 ——