Linux 内核 TCP 握手竞态 RCE(CVE-2026-98432)
Linux 4.4 起的 IPv4 TCP 握手竞态会在使用中释放套接字选项;内核团队评分 9.8,Ubuntu 和 RHEL 尚无修复。
摘要
- Linux 内核 IPv4 TCP 握手中的竞态会在另一个 CPU 仍在读取某个套接字的 IP 选项时将其释放。内核 CVE 团队评分 CVSS v3.1 9.8;Anthropic 研究员 Xinyang Ge 报告了该缺陷,Eric Dumazet 于 2026-10-01 完成修复。
- 自 4.4 以来的每个 Linux 内核都受影响,前提是攻击者能到达任意 IPv4 TCP 服务。用 Go 1.24 或更高版本构建的 Go 服务默认以 MPTCP 监听,这正是 Anthropic 的攻击所用的配置。
- Anthropic 表示其 AI 模型编写了一个漏洞利用程序,在暴露 MPTCP 监听器的 Linux 服务器上无需凭据即可 root 身份执行命令。截至 2026-10-30,没有任何攻击报告,该缺陷也不在 CISA 的 KEV 目录中。
- 安装修复后的内核:5.10.272、5.15.223、6.1.190、6.6.159、6.12.113、6.18.56、7.2.10 或 7.3,或者发行版的修复包。Debian、Oracle、Amazon 和 SUSE 已部分发布;Ubuntu 和 RHEL 截至 2026-10-30 尚未发布。仅适用于 Go 的临时方案见"如何修复"。
我受影响吗?
以下条件全部成立时,您处于暴露状态:
- 主机运行的 Linux 内核为 Linux 4.4(2016 年 1 月)及之后、修复版稳定内核之前的版本。容器不带自己的内核:容器内的服务使用宿主机内核,因此由宿主机版本决定。
- 该主机上有一个攻击者可到达的 IPv4 TCP 服务。Red Hat 表示,能到达暴露 TCP 服务的远程攻击者可以触发该竞态。
- 该竞态需要重传的 SYN 以及连接请求上的 IP 选项。内核团队的评分描述:攻击者发送携带 IPv4 Record Route 或 Timestamp 选项的请求后再重发,竞态的双方都由攻击者诱导。
两条配置路径扩大了暴露面。拥有 Multipath TCP 监听器的服务器是 Anthropic 攻击的配置,而所有用 Go 1.24 或更高版本构建的 Go 程序在 Linux 上默认以 MPTCP 打开监听套接字。此外,由 net.ipv4.tcp_migrate_req=1 或 BPF reuseport 迁移程序启用的请求套接字迁移,通过第二条路径暴露同一个 use-after-free。
| 发行版或内核 | 受影响版本 | 修复版本 |
|---|---|---|
| 主线与稳定版(自行构建) | 4.4 起全部 | 5.10.272、5.15.223、6.1.190、6.6.159、6.12.113、6.18.56、7.2.10、7.3 |
| Debian 13 trixie | linux 6.12.113-1 之前 | linux 6.12.113-1(2026-10-16) |
| Debian 12 bookworm | linux 6.1.190-1 之前;linux-6.12 6.12.113-1~deb12u1 之前 | 6.1.190-1(2026-10-17);6.12.113-1~deb12u1(2026-10-22) |
| Oracle Linux 7、8、9、10(UEK) | 2026-10-16 勘误之前的内核 | ELSA-2026-500397、ELSA-2026-500398、ELSA-2026-500399(2026-10-16) |
| Amazon Linux 2023(kernel6.18) | 6.18.56-125.164 之前 | 6.18.56-125.164.amzn2023(2026-10-24) |
| Amazon Linux 2023(kernel6.12) | 6.12.113-138.209 之前 | 6.12.113-138.209.amzn2023(2026-10-29) |
| SUSE Linux Micro 6.2、openSUSE Leap 16.0 | kernel-default 6.12.0-160000.40.1 之前 | kernel-default 6.12.0-160000.40.1 及以上 |
| SLES 15 SP4 至 SP6 LTSS、SLES 16.0、SLE Micro 5.3 至 5.5 | 修复版 kernel-default 之前 | kernel-default 5.14.21-150400.24.246.1 (SP4, Micro 5.3/5.4), 5.14.21-150500.55.195.1 (SP5, Micro 5.5), 6.4.0-150600.23.143.1 (SP6), 6.12.0-160000.40.1 (SLES 16.0) |
| SLES 15 SP7 | 当前全部内核 | 修复进行中,尚未发布 |
| Ubuntu 22.04、24.04、26.04、26.10(全部内核包) | 当前全部内核 | 尚未发布,进行中 |
| RHEL 8、9、10 与 OpenShift 4 | 当前全部内核 | 受影响,尚未发布修复 |
表格共 11 行;8 行已有已发布的修复,其余 3 行没有。Amazon Linux 2 和 Amazon Linux 2023 的默认 kernel 包同样没有修复,Ubuntu 将其 cloud、FIPS 和实时内核列为脆弱或进行中。
检查每台主机上运行的内容:
# Host kernel version
uname -r
# Compare against the fixed versions above; on Ubuntu and RHEL, watch the
# vendor advisory instead, because package versions differ from upstream tags.
# Debian: installed kernel packages and status
dpkg -l 'linux-image*' | grep '^ii'
# RHEL, Oracle Linux, Amazon Linux: installed kernels
rpm -q kernel kernel-uek kernel6.12 kernel6.18 2>/dev/null
# Which Go toolchain built a service (Go 1.24+ enables MPTCP by default)
go version -m /path/to/service | head -1
如何修复?
- Ubuntu 或 RHEL 上,截至 2026-10-30 尚无可安装的修复内核。Red Hat 表示没有任何可用的缓解措施满足其易部署、适合大多数安装和稳定的标准。请关注 Ubuntu 与 Red Hat 的 CVE 页面,并将下面的 Go 选项仅当作权宜之计。
- 安装发行版的修复包并重启。Debian:
apt update && apt install linux-image-amd64,然后重启。Oracle Linux:dnf update kernel-uek,然后重启。Amazon Linux 2023:dnf update kernel6.18或kernel6.12,然后重启。 - SUSE Linux Micro 6.2 或 openSUSE Leap 16.0:
zypper in kernel-default>=6.12.0-160000.40.1,然后重启。 - 自行构建内核的,请迁移到已修复的稳定版本之一。内核 CVE 团队建议更新到最新稳定内核,并表示社区不支持单独挑选补丁。
Go 安全团队为 Go 1.24 及以上服务提供了一个真正的临时方案,并附其自有的告诫。在程序环境中设置 GODEBUG=multipathtcp=0 可在运行时禁用 MPTCP,或在主模块的 go.mod 中加入 godebug multipathtcp=0 在构建时禁用。程序还可以按套接字调用 net.ListenConfig.SetMultipathTCP(false)。团队称逐程序禁用 MPTCP 是脆弱的缓解:仅剩的一个 MPTCP 监听器仍会让系统暴露,而且它假设所有可行的利用都依赖 MPTCP。团队强烈建议改为更新到已修复的内核。
注意覆盖范围:没有任何厂商缓解措施覆盖非 MPTCP 监听器的底层竞态,Red Hat 认为那里最可能的结果是内核崩溃,内存损坏在理论上可能。
根本原因是什么?
内核在另一个 CPU 仍在读取 TCP 连接请求附带的 IP 选项时就将其释放,因为释放使用 kfree() 而不是等待 RCU 读者。
IP 层把传入 IPv4 连接请求中的选项(如 Record Route 或 Timestamp)与请求套接字一起存储。握手完成时,net/ipv4/tcp_ipv4.c 中的 tcp_v4_syn_recv_sock() 把该选项指针直接交给新的子套接字而不复制。自 commit 079096f103fa("tcp/dccp: install syn_recv requests into ehash table")起,请求套接字的处理不再持有监听器锁。
修复提交的消息描述了相互冲突的两个 CPU。另一个 CPU 可以并发地处理同一请求套接字的重传 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。没有任何机制阻止子套接字在 SYNACK 仍在构建时被释放。
// net/ipv4/af_inet.c, inet_sock_destruct(), before the fix
void inet_sock_destruct(struct sock *sk)
{
...
WARN_ON_ONCE(sk->sk_wmem_queued);
WARN_ON_ONCE(sk->sk_forward_alloc);
- kfree(rcu_dereference_protected(inet->inet_opt, 1));
+ kfree_rcu(rcu_dereference_protected(inet->inet_opt, 1), rcu);
inet_sock_destruct() 用裸 kfree() 释放子套接字的选项。TCP 子套接字没有 SOCK_RCU_FREE,因此释放是即时的。仍在 rcu_read_lock() 中的第二个 CPU 随后在 ip_options_build() 中读取已释放的选项:一次 use-after-free。
// net/ipv4/tcp_ipv4.c, tcp_v4_reqsk_destructor(), before the fix
static void tcp_v4_reqsk_destructor(struct request_sock *req)
{
- kfree(rcu_dereference_protected(inet_rsk(req)->ireq_opt, 1));
+ kfree_rcu(rcu_dereference_protected(inet_rsk(req)->ireq_opt, 1), rcu);
}
第二条路径是请求套接字迁移,由 net.ipv4.tcp_migrate_req=1 或 BPF_SK_REUSEPORT_SELECT_OR_MIGRATE 程序启用。reqsk_timer_handler() 用 inet_reqsk_clone() 克隆请求套接字,旧套接字与其克隆共享同一个 ireq_opt。克隆被释放时,tcp_v4_reqsk_destructor() 用 kfree() 释放选项,而持有旧套接字引用的另一个 CPU 可能仍在使用它们。
IPv6 不受第一条路径影响,因为 tcp_v6_syn_recv_sock() 会复制选项。提交指出 tcp_v6_reqsk_destructor() 对 CALIPSO 设置的选项存在同样的迁移问题,并称将由单独补丁解决。
该如何被利用?
没有公开的利用代码。Anthropic 描述了其内部 AI 模型编写的攻击,分四个步骤:
- 攻击者向可达服务发送携带 IP 选项的 IPv4 TCP 连接请求,然后重发请求以赢得竞态,正如内核团队评分所描述。
- 竞态使内核读取攻击者控制的长度字段,并把多余的字节复制回给攻击者。一旦其中一次越界读取返回内核指针,攻击者就击败了内核地址随机化 KASLR。
- 同一个 use-after-free 随后使缓冲区溢出,用攻击者通过普通协议功能预先放入内核内存的载荷地址覆盖回调指针。
- 内核调用该回调。载荷串联对既有内核函数的调用,以攻击者选择的 shell 命令以 root 身份执行结束。
输掉竞态只会让那一次连接尝试失败,不会使系统崩溃,因此执意的攻击者可以无限重试。在 Anthropic 的概念验证中,泄漏一个内核指针用了 48 分钟,再用 5 分钟达到 shell 命令执行。
攻击如何流动?
一句话:攻击者赢得 IPv4 TCP 握手竞态,使内核在第二个 CPU 仍在 SYNACK 路径读取请求的 IP 选项时将其释放,再把 use-after-free 变成 KASLR 泄漏和一个执行 root 命令的被劫持回调。
IPv4 SYN"] --> B["请求套接字存储
ireq_opt"] B --> C["握手完成:
选项不复制地
移交给子套接字"] C --> D["重发 SYN:
第二个 CPU 读取同样选项
构建 SYNACK"] D --> E["子套接字释放:
kfree() 释放仍在
使用的选项"] E --> F["ip_options_build() 中的
use-after-free"] F --> G["信息泄漏、
内存损坏
或崩溃"] G --> H["Anthropic 演示:
MPTCP 监听器上
root shell"]
攻击者能做什么?
内核团队的 9.8 分假设网络访问、无权限、无用户交互,并对机密性、完整性和可用性造成高影响(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)。在该场景下,该缺陷可以把邻近的内核内存发回给攻击者、破坏内核内存或使系统崩溃。
Anthropic 演示了最强的结果:在暴露 MPTCP 监听器的服务器上,无需凭据和用户交互即以 root 身份执行任意命令。其文章没有说明测试的内核版本和配置,也没有说明没有 MPTCP 监听器的服务器能否被同样接管。
Red Hat 在其 CVE 页面和机器可读公告文件(2026-10-29 更新)中都将该缺陷评为 Important、8.1,向量 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H。Red Hat 表示该问题主要导致系统崩溃(拒绝服务)或潜在的内存损坏,并称评分为初步评分。Oracle、SUSE 和 Amazon 也以相同向量给出 8.1。每个评分与内核团队的差异仅在攻击复杂度:厂商评为高,内核团队评为低。
为什么修复有效?
修复 commit e3f33b0a1d89d738e2b913dab519226eaf76e15b 将 inet_sock_destruct() 和 tcp_v4_reqsk_destructor() 这两个析构函数中的 kfree() 替换为 kfree_rcu()。kfree_rcu() 将回收推迟到 RCU 宽限期之后,因此每个在选项周围持有 rcu_read_lock() 的 CPU 都会在内存被释放前完成读取。读者本来就已使用 RCU,而其他替换 inet_opt 的路径(如 do_ip_setsockopt())本来就已使用 kfree_rcu()。
这个两行改动对提交中点名的两条 IPv4 路径是完整的:经 inet_sock_destruct() 的 SYNACK 竞态和经 tcp_v4_reqsk_destructor() 的迁移竞态。提交本身指出了一个它未触及的相邻问题:CALIPSO 设置选项对应的 IPv6 迁移问题,将另行补丁处理。
如何检查是否已被入侵?
截至 2026-10-30,任何地方都没有报告利用,也没有公布指标或检测规则。输掉竞态的尝试只会让该连接尝试失败,因此探测可能几乎不留痕迹。
该机制提示了高强度探测的样子:大量携带 Record Route 或 Timestamp 选项的短命 IPv4 连接尝试,随后是对同一监听端口的重发请求。把该模式当作待查线索,而非入侵证据;没有公开来源记录这种形态的实际流量。
时间线
- 2016-01-10:Linux 4.4 发布。The Hacker News 报道该缺陷由此版本引入,伴随后来移除竞态路径上监听器锁的请求套接字改动。
- 2026-10-01:Eric Dumazet 编写修复"ipv4: free inet_opt and ireq_opt after an RCU grace period",由 Anthropic 的 Xinyang Ge 报告。
- 2026-10-05:内核开发者在上游应用修复,比 CVE 发布早十天。
- 2026-10-11 至 2026-10-15:修复被回移植到 5.10、5.15、6.1、6.6、6.12、6.18 和 7.2 稳定分支。
- 2026-10-15:内核 CVE 团队发布 CVE-2026-98432。
- 2026-10-16:Debian trixie 与 Oracle Linux 发布修复内核(DSA-6568-1;ELSA-2026-500397 至 500399)。
- 2026-10-17 至 2026-10-22:Debian 12 bookworm 通过两份公告获得修复内核(DLA-4841-1、DLA-4850-1)。
- 2026-10-24:内核 CVE 团队在发布 CVE 九天后把 9.8 分加入记录。Amazon 修复其 kernel6.18 包(ALAS2023-2026-3251)。
- 2026-10-27:Anthropic 发布文章,描述 AI 编写的利用在 MPTCP 监听器服务器上取得 root。
- 2026-10-29:Amazon 修复其 kernel6.12 包(ALAS2023-2026-3335)。Red Hat 的 CVE 页面和公告文件改为 Important、8.1。SUSE 为 SLES 15 SP4 至 SP6 LTSS 和 SLE Micro 5.3 至 5.5 发布修复内核。The Hacker News 发布发行版状态表。
- 2026-10-30:Ubuntu 和 RHEL 仍未列出任何修复内核。两者都没有给出日期。
常见问题
我的 Go 服务从不调用 MPTCP API,也需要内核修复吗?
需要。Go 1.24 及更高版本在 Linux 上默认为监听套接字启用 MPTCP,代码里没有任何 MPTCP 调用时,一个普通的 net.Listen 也已经用它。用 go version -m 检查构建,GODEBUG 权宜方案见"如何修复"。
容器受影响吗?
缺陷在宿主机内核中,容器不会因为打包而免于暴露。受影响宿主机上任何攻击者可到达的 IPv4 TCP 服务,无论是否在容器内,都给攻击者竞态所需的网络位置。修复是宿主机的内核包。
攻击者能攻击 IPv6 监听器吗?
第一条路径不能。内核为 IPv6 连接复制选项,因此握手竞态仅限 IPv4。修复提交提到 CALIPSO 设置选项存在相同的 IPv6 迁移问题,将由单独补丁处理。
为什么内核团队给 9.8 而 Red Hat 等厂商给 8.1?
内核团队把攻击复杂度评为低,因为攻击者诱导竞态的两侧:带 IP 选项的初始请求和重传。Red Hat、Oracle、SUSE 和 Amazon 把复杂度评为高,因此在机密性、完整性和可用性影响同为高的情况下评分降为 8.1。
该缺陷在野外被利用了吗?
截至 2026-10-30,没有任何来源报告攻击。该缺陷不在 CISA 的 KEV 目录中,当日已对照目录 JSON 数据源核实。Anthropic 的利用及其测试仍是唯一演示过的执行。
这个月无法重启。最好的做法是什么?
发行版一发布修复内核就立即安装;在那之前,对 Go 1.24 及以上服务应用 Go 团队的 MPTCP 权宜方案,并清楚其局限。Red Hat 没有给出认可的缓解措施:让暴露的 IPv4 服务保持在严格的网络访问列表之内,并每天关注 Ubuntu 与 Red Hat 公告。
用 Ostorlab 找出需要最先修复的 Linux 主机
Ostorlab 的攻击面发现会盘点您暴露在互联网上的主机及其开放的服务,从而列出带有可到达 IPv4 TCP 监听器的 Linux 服务器,优先检查其内核。
参考文献
- CVE-2026-98432 记录,kernel.org CNA,2026-10-15 发布,2026-10-30 更新,CVSS v3.1 9.8 及稳定分支回移提交: https://cveawg.mitre.org/api/cve/CVE-2026-98432 (2026 年 10 月 30 日核对)
- 修复提交 e3f33b0a1d89d738e2b913dab519226eaf76e15b,"ipv4: free inet_opt and ireq_opt after an RCU grace period",Eric Dumazet,2026-10-01: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e3f33b0a1d89d738e2b913dab519226eaf76e15b (2026 年 10 月 30 日核对)
- Anthropic,"Discovering and exploiting vulnerabilities in critical, real-world software with Claude",2026 年 10 月 27 日,第 5 章: https://www.anthropic.com/research/discovering-vulnerabilities-with-claude (2026 年 10 月 30 日核对)
- The Hacker News,"Linux Kernel TCP Flaw With 9.8 CVSS Score Affects Ubuntu, Red Hat and Other Distributions",2026 年 10 月 29 日,发行版状态表与评分依据: https://thehackernews.com/2026/10/linux-kernel-tcp-flaw-with-98-cvss.html (2026 年 10 月 30 日核对)
- Go 安全团队,"[security] Protecting against CVE-2026-98432",golang-announce,2026 年 10 月 29 日: https://groups.google.com/d/msgid/golang-announce/0c2926bc-e90f-4cdb-97c3-300fff6d8885n%40googlegroups.com (2026 年 10 月 30 日核对)
- 转发到 oss-security 的同一 Go 指引,2026 年 10 月 29 日: https://www.openwall.com/lists/oss-security/2026/10/30/1 (2026 年 10 月 30 日核对)
- Ubuntu CVE-2026-98432 页面,截至 2026 年 10 月 30 日没有内核包被列为已修复: https://ubuntu.com/security/CVE-2026-98432 (2026 年 10 月 30 日核对)
- Red Hat 针对 CVE-2026-98432 的机器可读公告,Important 8.1,2026-10-29 更新: https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-98432.json (2026 年 10 月 30 日核对)
- Red Hat 针对 CVE-2026-98432 的 CVE 页面: https://access.redhat.com/security/cve/cve-2026-98432 (2026 年 10 月 30 日核对)
- Debian DSA-6568-1,linux 6.12.113-1,2026 年 10 月 16 日: https://lists.debian.org/debian-security-announce/2026/msg00482.html (2026 年 10 月 30 日核对)
- Oracle Linux CVE-2026-98432 勘误页面,ELSA-2026-500397 至 500399,2026-10-16 发布: https://linux.oracle.com/cve/CVE-2026-98432.html (2026 年 10 月 30 日核对)
- Amazon Linux 2023 公告 ALAS-2026-3251,kernel6.18-6.18.56-125.164,2026-10-24 发布: https://alas.aws.amazon.com/AL2023/ALAS2023-2026-3251.html (2026 年 10 月 30 日核对)
- Amazon Linux 2023 公告 ALAS-2026-3335,kernel6.12-6.12.113-138.209,2026-10-29 发布: https://alas.aws.amazon.com/AL2023/ALAS2023-2026-3335.html (2026 年 10 月 30 日核对)
- SUSE CVE-2026-98432 页面,Important 8.1,逐包修复状态: https://www.suse.com/security/cve/CVE-2026-98432.html (2026 年 10 月 30 日核对)
- CVE-2026-98432 的 NVD 条目,显示内核团队的 9.8 分: https://nvd.nist.gov/vuln/detail/CVE-2026-98432 (2026 年 10 月 30 日核对)
- 内核 CVE 团队发布的 CVE-2026-98432 记录,建议最新稳定内核: https://kernel.googlesource.com/pub/scm/linux/security/vulns/+/refs/heads/master/cve/published/2026/CVE-2026-98432.mbox (2026 年 10 月 30 日核对)
- 内核关于 Multipath TCP 的文档: https://docs.kernel.org/networking/mptcp.html (2026 年 10 月 30 日核对)
- 跟踪讨论的 Go issue,go.dev/issue/82717: https://go.dev/issue/82717 (2026 年 10 月 30 日核对)
- CISA KEV 目录 JSON 数据源,2026 年 10 月 30 日核对 CVE-2026-98432(未列入): https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json (2026 年 10 月 30 日核对)