校验和是张白条,内核信了十八年

8 月 18 日,Vercel 挂出一百万美元悬赏:谁能攻破它的 Sandbox 沙箱产品,谁分奖金池。第三天,安全研究员 Paulos Yibelo 交了初报。他没去碰虚拟机监控器,盯上的是 Linux 内核网络栈里一张写了十八年的白条。

目录
  1. 校验和是张白条,内核信了十八年
  2. 白条是什么
  3. 写白条的换成了客人
  4. 先验完,再改掉
  5. 修了什么,没修什么
  6. 谁在查
  7. 时间线

校验和是张白条,内核信了十八年

8 月 18 日,Vercel 挂出一百万美元悬赏:谁能攻破它的 Sandbox 沙箱产品,谁分奖金池。第三天,安全研究员 Paulos Yibelo 交了初报。他没去碰虚拟机监控器,盯上的是 Linux 内核网络栈里一张写了十八年的白条。

10 月 15 日,这个漏洞以 CVE-2026-99999 的名义进入内核 CVE 库,CVSS 9.3。Vercel 的结案报告称它「整个悬赏活动最重要的一份报告」:一千二百八十五份提交里,唯一的 Critical。

白条是什么

先说校验和。网络包在网线上跑,随时可能被弄坏几位。为了发现这种损坏,TCP 和 UDP 在包尾放了一个校验字段:发送方按规则算一个数填进去,接收方用同样的规则再算一遍,对不上就丢包。

算这个数不便宜,包越大越贵。于是网卡厂商想了个办法:发送方先不算,在包头里留两张便签——从哪个字节开始算(csum_start)、算完写到哪个字节(csum_offset)——到了出口,网卡硬件按便签补算补写。内核里也有软件兜底版,叫 skb_checksum_help(),干的是同一件事。

这个「先欠着、回头补」的机制有个学名叫 CHECKSUM_PARTIAL。它就是一张白条。

问题出在白条由谁写。

写白条的换成了客人

2008 年,2.6.27 时代,会写这种便签的都是内核自己的驱动——自己人写白条,值从哪来、写到哪去,内核心里有数。

虚拟机把这个假设拆了。virtio-net 是 KVM、Firecracker 这类虚拟机标配的虚拟网卡,它允许客人说:「我的包,校验和你们宿主机替我算。」于是便签跟着包,从客人机一路传进宿主内核。写便签的从自己人换成了客人——代码没换,假设也没换。

CVE 记录把这个坑的年龄写得很直白:2.6.27 之前的版本不受影响。十八年。

先验完,再改掉

这个漏洞最精妙的地方是顺序。

一个包进来,宿主内核解析 IPv4 头、做路由判断——该验的都验了。分片发生在更后面的环节:把大包拆成小包,拆之前先把欠的校验和补上。攻击窗口就开在这里:验证在前,白条在后,中间隔着一段合法的内核流程。

涂改过的便签让补算写错了地方。研究帖给了一个最小例子:IPv4 头第一个字节通常是 0x45,前四位是版本号(4),后四位是头长(5 个 32 位字,20 字节)。补算按假便签把校验和写到了这个字节上,把它改成 0x4f——版本号没动,头长却从 5 变成 15,20 字节的头被读成 60 字节。包看起来还是正经 IPv4,几何已经变了。

下游分片代码不知道头被人动过。它按新长度(60 字节)拷贝「头」,而这个包的逻辑数据只有 28 字节(20 字节头加 8 字节载荷)。多出来的 32 字节从哪来?宿主内存。它们以「IP 选项」的名义被塞进分片发出去——客人只要收包,就能读宿主机内核里相邻的内存。连续读,想读多久读多久。

研究的递进阶梯:32 字节的泄漏原语,再到定点改写 64 字节宿主内核数据,最后在自有的 KVM 和 Firecracker 上走完整条链——host 上跑了一个助手程序把标记返回给客人,四次真冷启动复现。两个特制包可以打崩宿主机,宿主机上所有沙箱一起陪葬。

修了什么,没修什么

10 月 8 日,Michael S. Tsirkin(Red Hat,virtio 维护者)的修复进了内核网络主干树:一个共享助手 ip_check_csum_start(),五处补算点全部改成「先验便签,再补校验和」——csum_start 必须落在真正的 IPv4 头之后,越界白条当场拒收。

commit 原话说得诚实:这是防御纵深,「本不该让这种包进来」。入口侧的完整校验还在路上,因为要动的地方太多。换句话说,墙上那个洞还没彻底封死,先把屋里这扇门锁上了。10 月 15 日,Greg KH 一次放出七个 stable 内核(5.10.272 到 7.2.11),全部带着这个补丁。2.6.27 到 7.3 之间的版本都该补。

CISA 的评估:暂无在野利用,不可自动化。研究帖的预测更急:弱配置环境的公开利用数周内会出现,默认虚拟机配置下的,一个月内。

谁在查

这次研究本身值得一笔。Yibelo 的团队用 GPT-5.6 Sol 当主力做源码级分析,人负责框定方向,API 花费不到七百美元。他们把证据分成四级并严格遵守:怀疑有 bug 不等于演示了泄漏,演示了泄漏不等于宿主写入,自有环境拿到 root 不等于打穿厂商生产环境。Vercel 生产沙箱上验证的是内存泄漏;崩溃和提权是在自家环境里复现的。「实现虚拟机逃逸」这句结论,中间隔着三级台阶——省略这三级,恰是安全新闻最常夸大的地方。

还有一笔账:研究帖开头引的是悬赏前几周的 OpenAI 事故——评估环境里的 AI agent 绕过网络隔离,最终摸到了 Hugging Face 的内部系统。沙箱产品把不受信任的代码、越来越多是不受信任的 agent,跑进微虚拟机。KVM 这层的投入越来越足,而内核网络栈这一层,按 Vercel 的说法,「几乎所有主要云厂商都在同一层内核上隔离客户负载」。Trail of Bits 给 Vercel 做完四周代码审查的结论是:虚拟化边界本身没问题,问题在下一个零日总会来。

时间线

8 月 18 日,悬赏发布。8 月 20 日,初报。9 月 4 日,私下报告内核安全团队,附候选补丁。9 月 7 日,Tsirkin 复现。10 月 8 日,修复进 net.git。10 月 14 日,合入 Linus 主干。10 月 15 日,CVE 公开,七个 stable 同日发布。

从悬赏到修复落地,五十七天。

暂无表态

想参与讨论或点赞?登录后使用完整功能

讨论回复(0)

暂无回复,登录后可参与讨论
合作

智谱 GLM-5 已上线

在智谱开放平台 BigModel.cn 打造 AI 应用。新一代旗舰模型 GLM-5 在推理、代码、智能体综合能力达到开源模型 SOTA。

领取 2000万 Tokens