Claude 挖出 Linux 内核高危漏洞,Go 程序为何也受到了牵连?

Claude 挖出 Linux 内核高危漏洞,Go 程序为何也受到了牵连?

💡 原文中文,约8000字,阅读约需19分钟。
📝

内容提要

Anthropic披露Claude发现的Linux内核TCP握手UAF漏洞CVE-2026-98432(CVSS 9.8),可无认证远程获取root权限。Go 1.24起默认启用MPTCP监听,使Go服务易满足该PoC条件。Go团队建议升级内核,或用GODEBUG=multipathtcp=0临时关闭MPTCP,但这不修复底层漏洞。社区正讨论是否取消默认启用。

🔎

延伸解读

漏洞根因与MPTCP的关系

CVE-2026-98432是Linux IPv4 TCP握手过程中的Use-After-Free漏洞,根因在于内核处理IPv4选项数据时的并发时序错误,并非MPTCP专属。MPTCP只是Anthropic展示的远程RCE利用链所需的条件之一。Go Security Team明确表示,即使没有MPTCP Listener,也不能断言系统完全不受该底层漏洞影响。因此,关闭MPTCP仅能阻断已公开的PoC路径,不能消除内核中的UAF风险。

Go默认启用MPTCP的连锁效应

从Go 1.24开始,标准库在Linux上默认启用MPTCP Listener,开发者无需显式调用MPTCP API,普通HTTP服务也可能创建MPTCP监听Socket。这恰好满足了Claude所展示攻击链的条件,使大量Go服务成为需要重点关注的对象。不过实际影响还取决于内核版本、系统MPTCP开关、go.mod版本声明以及服务是否监听网络。Go团队建议优先升级内核,临时可用GODEBUG=multipathtcp=0关闭默认行为。

临时缓解与根本修复的边界

Go Security Team给出的首要建议是升级到已修复的Linux内核。若暂时无法升级,可通过GODEBUG=multipathtcp=0、go.mod中godebug指令或系统sysctl关闭MPTCP。但公告强调,关闭MPTCP只能阻止当前展示的特定利用路径,不能修复内核UAF,未来仍可能出现不依赖MPTCP的攻击方式。此外,修改系统配置后已创建的MPTCP Listener不会自动转换,需重启相关服务。

检查时不可忽视宿主机内核

开发者应先用uname -r确认内核版本,并对照发行版安全公告判断是否已包含修复,不能仅比较上游版本号。可用ss -Mlnp检查是否存在MPTCP监听Socket,用sysctl net.mptcp.enabled查看系统开关。尤其要注意,Docker容器和Kubernetes Pod共享宿主机内核,仅重建Go应用镜像无法修复宿主机漏洞,Kubernetes节点、云服务器宿主机和容器运行时所在Linux主机都应纳入检查范围。

❓

Q&A

CVE-2026-98432 是什么漏洞?影响有多严重?

CVE-2026-98432 是 Linux 内核 IPv4 TCP 握手过程中的 Use-After-Free(UAF)漏洞,CVSS 评分 9.8。攻击者无需认证、无需用户交互,仅通过发送网络数据包就可能远程获取 root 权限。

Claude 是如何利用这个漏洞实现远程代码执行的?

Claude 构建了两阶段利用链:第一阶段利用竞争条件让内核多读取数据并泄露内核指针,绕过 KASLR;第二阶段再次利用同一 UAF 覆盖内核回调函数指针,最终执行攻击者指定的 Shell 命令。PoC 中泄露内核指针约 48 分钟,获得命令执行约 5 分钟。

Linux 内核是怎么修复这个 UAF 漏洞的?

维护者 Eric Dumazet 提交补丁,将直接释放内存的 kfree(ptr) 替换为 kfree_rcu(ptr, rcu),即等待 RCU 宽限期结束、确保此前仍在访问该内存的读者完成操作后再释放,从而解决并发环境下的内存生命周期问题。

为什么 Go 程序会受这个 Linux 内核漏洞影响?

从 Go 1.24 开始,Go 标准库在 Linux 上默认启用 Multipath TCP(MPTCP)监听。使用标准库创建 TCP 监听器时可能默认创建 MPTCP 监听 Socket,而 Anthropic 展示的远程 RCE 利用链恰好需要目标服务器存在 MPTCP Listener,因此大量 Go 服务可能满足该 PoC 的攻击条件。

Go 开发者可以采取哪些临时缓解措施?

可通过环境变量 GODEBUG=multipathtcp=0 关闭 MPTCP 默认行为;也可在 go.mod 中加入 godebug multipathtcp=0,或在 main 包前添加 //go:debug multipathtcp=0;还可在系统层面执行 sysctl -w net.mptcp.enabled=0。但关闭 MPTCP 只是临时缓解,不能修复底层内核漏洞。

关闭 MPTCP 就能彻底解决这个漏洞吗?

不能。Go Security Team 强调,关闭 MPTCP 只能阻止 Anthropic 当前展示的那条特定利用路径,不能修复 Linux 内核中的 UAF。由于漏洞根因不专属于 MPTCP,未来仍可能出现不依赖 MPTCP 的其他攻击路径。根本解决方案是升级到包含补丁的 Linux 内核。

Go 社区对是否默认启用 MPTCP 有什么争议?

GitHub issue #82717 提案讨论是否默认关闭 MPTCP。支持者认为 MPTCP 增加攻击面且其他主流网络库未普遍默认开启;反对者认为漏洞根因在 Linux 内核,不应因第三方漏洞改变 Go 默认行为,且 MPTCP 具有无缝网络切换、带宽聚合等实际价值。截至文章撰写时该 issue 仍开放讨论。

Go 开发者现在应该做哪些安全检查?

首先用 uname -r 确认内核版本,并对照发行版安全公告确认已修复并重启进入新内核;其次用 ss -Mlnp 检查是否存在 MPTCP Listener,用 sysctl net.mptcp.enabled 检查内核是否允许 MPTCP;对暂无法升级内核的环境可用 GODEBUG=multipathtcp=0 临时关闭。还需注意容器共享宿主机内核,应检查 Kubernetes 节点和云主机内核。

🏷️

标签

➡️

继续阅读