CVE-2026-99999 PwnEscape:Linux 内核 IPv4 校验和缺陷致虚拟机逃逸,CVSS 9.3

一个特制的网络包,就能把代码从虚拟机送进宿主机。10 月中旬,Linux 内核 IPv4 校验和处理缺陷以 CVE-2026-99999 编号公开,Linux CNA 给出 CVSS 3.1 评分 9.3,代号 PwnEscape。上游修复已进入多条稳定分支,部分发行版内核仍未跟上。

事件概述

漏洞由 pwn.ai 研究员 Paulos Yibelo 在 Vercel 的 Sandbox 挑战赛(8 月 18 日开赛、奖金 100 万美元)中发现,经私密渠道上报。Debian 于 10 月 17 日前后发布公告,将其定为关键级。Vercel 确认,崩溃与代码执行只在研究员自建、按 Vercel Sandbox 配置搭的 KVM 与 Firecracker 环境复现,生产环境只确认宿主机内存泄露,未发现客户数据被读取。

上游修复提交为 6785011f8b16,标题 “ipv4: validate checksum_start before completing checksum”,10 月 8 日进入开发树、10 月 14 日进入主线,已回移至 5.10、5.15、6.1、6.6、6.12、6.18、7.2 七个分支。缺陷代码可追溯到 Linux 2.6.27。

技术细节

问题出在延迟校验和机制。virtio-net 允许客户机把未完成校验和的数据包交给宿主机,并附带 csum_start 字段说明校验和起点。攻击者把 csum_start 指向 IPv4 头内部,数据包进入宿主机 IPv4 栈后,ip_do_fragment() 调用 skb_checksum_help() 完成校验和,该函数会向内核已校验过的 IPv4 头写入两个攻击者控制的字节。

内核随后重新读取头长度字段 IHL,按该长度把头部复制进每个分片。研究中 IHL 从 20 被改成 60,分片时便把逻辑数据包之外的宿主机堆内存一并带出,每分片最多泄露 40 字节,实测 32 字节。

同一份卸载元数据有四条可达路径:

  • 不可信虚拟机经 TAP 或 vhost-net,CVE 记录描述的主路径;
  • 非特权用户在 user namespace 内使用带 IFF_VNET_HDR 的 tun 设备;
  • 持 CAP_NET_RAW 的 AF_PACKET 套接字配合 PACKET_VNET_HDR;
  • macvtap 或 ipvtap 设备的所有者。

第二阶段从泄露走向写入:研究者借助堆布局观测与分配控制,在自有 KVM 环境实现针对宿主机内核内存的定向 64 字节写入,并以 root 运行辅助程序。该链条未公开。

影响评估

9.3 分来自 Linux CNA,Red Hat 另评 8.8,差异源于对攻击前提的取舍。向量标注为本地,攻击者须先取得客户机内的代码执行权;但在多租户云、容器沙箱和 VPS 场景里,这个前提正是业务模型本身。两个特制数据包即可打崩一台宿主机。目前没有公开 POC。

CloudLinux 公告指出,修复内核与热补丁就绪前的缓解都只是去掉一个前提且未经针对验证;CageFS 这类账户隔离无法覆盖该路径。

修复建议

优先升级宿主机内核至 6.12.113、6.18.57、7.2.11 或 7.3-rc7;无法立即升级时关闭校验和卸载:

uname -r   # QEMU: -device virtio-net-pci,netdev=n0,csum=off,guest_csum=off

共享主机若不允许租户建命名空间,可同时关闭本地路径(会破坏 rootless 容器与 Chrome、Flatpak 沙箱):sysctl -w user.max_user_namespaces=0。

云上业务不要只等镜像更新,应向云厂商确认宿主机内核状态;自建 KVM、Firecracker 集群按节点核对,虚拟化节点优先。

参考来源