10 月 27 日,Anthropic 披露了 Linux 内核 IPv4 TCP 栈中的一个释放后使用漏洞,编号 CVE-2026-98432,内核 CVE 团队给出 CVSS 9.8。未认证的攻击者只要向开着 MPTCP 监听的服务发出构造好的 TCP 报文,就能以 root 身份远程执行命令。比漏洞本身更值得记一笔的是:Anthropic 用一个尚未发布的 Claude 模型,在实验室里大约 53 分钟就把 PoC 做成了远程 root,期间还绕过了 KASLR。内核漏洞的利用开发,第一次被公开压缩到「一个午饭时间」的量级。
事件概述
受影响范围是 4.4 以来的内核,主流发行版基本全在列。上游已修复并回移到维护分支,对应内核 6.1.190 与 6.12.113。截至 10 月 30 日,各发行版进度并不一致:
- Debian 12(Bookworm)修于
6.1.190-1,Debian 13(Trixie)修于6.12.113-1,testing 与 unstable 也已更新。 - Ubuntu 22.04 LTS、24.04 LTS、26.04 LTS、26.10 在 Canonical 追踪页仍列为受影响,内核修复在途。
- RHEL 8、9、10 受影响,修复计划在未来更新;RHEL 7 因内核不含相关代码而不受影响。
- CIQ 确认 Rocky Linux 8、9、10 受影响,并给出了临时防火墙策略;Oracle Linux、Amazon Linux、SUSE 已对部分内核版本发出修复。
macOS 使用苹果自家的 XNU 内核,不受影响。
技术细节
根因是一次竞态。内核公告的表述是:tcp_v4_syn_recv_sock() 把 ireq->ireq_opt 的所有权转交给子 socket(newinet->inet_opt),但并没有复制这份数据。此时另一个 CPU 可以并发处理同一个 request socket 上重传的 SYN,从 tcp_check_req() 发出 SYNACK。而 tcp_v4_send_synack() 与 inet_csk_route_req() 只在 rcu_read_lock() 保护下读 ireq->ireq_opt,随后 ip_build_and_send_pkt() 与 ip_options_build() 会把 opt->optlen 读上两次。数据在第一次读和第二次读之间被释放、被重用,就是典型的 UAF。
同类问题还有第二条路径:启用 net.ipv4.tcp_migrate_req 时,或加载了 BPF_SK_REUSEPORT_SELECT_OR_MIGRATE 类型的程序时,request socket 迁移也会踩到同一处。
分级上有一个反差值得注意。内核 CVE 团队给 9.8,Red Hat 只给 5.9,理由是竞态利用远比「发一个恶意包」复杂,更可能的结果是内核崩溃而非代码执行。Anthropic 的演示说明后者也成立,但前提是目标暴露了 MPTCP 监听器 —— 对只有普通 TCP 监听的服务器,远程代码执行目前没有公开复现。
Go 服务为什么会被牵连
MPTCP 应用层一般不会主动打开,但语言运行时可能替你打开。从 Go 1.24 起,只要内核支持,Go 在 Linux 上会为监听 socket 默认启用 MPTCP。也就是说,一个用 net.Listen 起的普通 Go HTTP 服务,可能在运维完全不知情的情况下成为可利用目标。
Go 安全团队 10 月 29 日发布公告,给出的临时手段是在环境变量里设 GODEBUG=multipathtcp=0,或在主模块的 go.mod 中写入 godebug multipathtcp=0。但公告自己也说得很直白:逐个程序关闭是脆弱的缓解,漏掉一个监听器就等于没关,而且不能排除不依赖 MPTCP 的利用路径。是否修改默认值仍在 go.dev/issue/82717 讨论,短期内不要指望上游让步。
影响评估
不需要任何凭据,攻击面是内核本身。容器共享宿主内核,所以「重编译 Go 二进制」「换个基础镜像」都不解决问题,真正要动的是宿主内核。云上多租户环境的横向风险更明显:一台宿主机被打穿,上面所有容器一起算。
目前没有确认的在野利用。Anthropic 的 53 分钟是受控实验室结果,不代表野外已经在打。但内核洞从披露到可用工具的窗口,这次被压到了小时级,留给防守方的时间本来就少。
修复建议
第一优先是把内核升上去并重启。注意核对发行版实际的包版本号,不要拿上游版本字符串对号入座 —— 各家的回移和打包编号不一样。
# Debian 12 / 13
apt-get update && apt-get install linux-image-amd64
uname -r # 确认重启后运行的内核
# 临时降低 Go 服务暴露面(不是修复)
GODEBUG=multipathtcp=0 ./your-service
补丁未到位时的过渡措施:把面向公网的业务端口限制到可信来源;在边界上对畸形 MPTCP/TCP 选项做检测与阻断;Go 服务临时关闭 MPTCP;把「容器宿主内核版本」纳入资产清单,这类洞最容易被漏掉的就是宿主。