针对 vmware-vmx 中 VMXNET3 虚拟网卡 TSO 分段路径的 32 位整数溢出的概念验证,可从客户机 VM 触发。
此问题已修补。 该 PoC 仅出于研究和防御目的发布。它会触发主机端崩溃(SIGSEGV),并不尝试执行代码。
| CVE | CVE-2026-59346 |
| 分析文章 | cyberstan.co.uk/vmxnet3-tso-overflow |
| ZDI 公告 | ZDI-26-647 |
| 厂商公告 | VMSA-2026-0007 |
| CVSSv3 | 9.3(厂商)/ 7.5(ZDI) |
| 修复版本 | Workstation / Fusion 26H1u1 |
| 报告途径 | Trend Micro Zero Day Initiative |
VMXNET3 TSO 分段例程使用 32 位 imul 将其分配大小计算为 seg_count * per_seg_size。当真实乘积超过 2^32 时结果会回绕,分配器收到的是被截断的值。随后的分段循环由 seg_count 驱动,而非由分配大小驱动,因此它会按每个分段 per_seg_size 字节写入一个按回绕后乘积确定大小的缓冲区。
针对此代码路径的早期修复(CVE-2025-41236)添加了边界检查,拒绝 MSS、per_seg_size 或二者之和超过 9216 的数据包。这些检查约束了各个描述符字段,但从未约束乘积,而乘积才是实际发生回绕的值。远低于 9216 限制的参数仍可触发溢出。
完整的根因分析、带注释的反汇编和堆布局:cyberstan.co.uk/vmxnet3-tso-overflow。
具有足够权限写入原始 TX 描述符的客户机用户,可以在主机 vmware-vmx 进程中造成大规模越界写入,写入内容来自客户机提供的数据包。在此 PoC 中,写入会一直持续到触及未映射内存,主机进程因 SIGSEGV 而终止,从而关闭 VM。
厂商将该问题评为可在 hypervisor 上下文中执行任意代码;已发布的 PoC 仅演示了内存安全违规,并在崩溃处停止。
所有共享 vmware-vmx VMXNET3 后端的 VMware 桌面 hypervisor 产品:Workstation、Fusion 和 Player。VMXNET3 是现代客户机的默认适配器。权威的受影响版本列表请参见 VMSA-2026-0007。
该 PoC 是一个 Linux 内核模块,运行于客户机内部。它直接写入 VMXNET3 TX 环描述符,绕过内核内驱动的 TSO 逻辑,然后敲响 doorbell MMIO 寄存器。
# Inside the guest VM, as root:
# Kernel headers
apk add linux-virt-dev # Alpine
# apt install linux-headers-$(uname -r) # Debian / Ubuntu
make
insmod vmxnet3_tso_trigger.ko
主机 vmware-vmx 进程将崩溃,客户机将关机。预计会丢失 VM 中所有未保存的状态;如需重新运行,请先创建快照。
客户机需要一块 VMXNET3 适配器。使用 lspci | grep -i vmxnet 检查,或确认 .vmx 文件中的 ethernet0.virtualDev = "vmxnet3"。该模块直接与网卡通信,因此接口必须处于启用状态并绑定到 vmxnet3 驱动。
warmup 和 freechunk 会在溢出发生前塑造主机堆。复现崩溃并不需要它们;除非你在研究分配布局,否则请保持为零。
先进行试运行,以确认模块找到环并计算出参数,而不触及主机:
insmod vmxnet3_tso_trigger.ko dryrun=1
dmesg | tail -20
rmmod vmxnet3_tso_trigger
预期输出包含计算出的几何参数和定位到的 TX 环:
tso_v8: per_seg=6240 (0x1860), HDR_TOTAL=6222, MSS=1
tso_v8: PARAMS: alloc=... overflow=... seg_count=... paylen=...
tso_v8: ring at priv+N: base=... sz=... n2f=... gen=...
tso_v8: DRYRUN -- descriptors written but NOT triggered
如果未找到环,模块会记录 TX ring not found 并中止。这通常意味着驱动布局存在差异;需要针对该内核调整 find_tx_ring() 中的搜索启发式。
然后真正触发,如有需要可指定非默认接口:
insmod vmxnet3_tso_trigger.ko ifname=eth1
客户机会随主机进程一起终止,因此最后的消息可能无法写入磁盘。要捕获它们,请查看控制台而非依赖日志:
dmesg -w
在主机侧通过 VM 的 vmware.log 确认崩溃,其中会显示 PANIC: Unexpected signal: 11,并带有在 vcpu-0 线程上经过分配器的回溯。
ifname 必须指定 VMXNET3 设备,而不是网桥或辅助 e1000 适配器。need N entries but ring has M slots 中止。| 主机 | Ubuntu 24.04 LTS,内核 6.17.0,glibc 2.39 |
| Hypervisor | VMware Workstation Pro 25.0.1(build 25219725) |
| 客户机 | Alpine Linux,内核 6.12,VMXNET3 网卡 |
分析中引用的符号偏移特定于 build 25219725。易受攻击的模式在各构建版本中相同,但偏移会有所不同。
vmxnet3_tso_trigger.c trigger module
Makefile out-of-tree kernel module build
乘法需要在 64 位下执行,并在结果到达分配器之前对其加以限制。仅限制各个描述符字段是不够的,因为溢出是乘积的属性,而非任一操作数的属性。
| 日期 | 事件 |
|---|---|
| 2026 | 报告给 Trend Micro ZDI |
| 2026 年 9 月 | 由 Broadcom 在 26H1u1 中修补(VMSA-2026-0007) |
| 2026 年 9 月 | 发布 ZDI-26-647 |
在修复发布后,依据协同披露原则发布。仅在你拥有或获授权测试的系统上运行。它会导致主机 hypervisor 进程崩溃,因此不要将其指向任何你在意的目标。
Stan S - cyberstan.co.uk · @0xCyberstan
| 参数 | 默认值 | 用途 |
|---|
ifname | eth0 | 由 VMXNET3 适配器支持的接口 |
dryrun | 0 | 1 表示写入描述符但跳过 doorbell,因此不会触发任何操作 |
wait_ms | 0 | 描述符设置与 doorbell 写入之间的延迟(毫秒) |
txwarm | 0 | 在溢出数据包之前推入环中的 TSO 数据包数量 |
warmup | 0 | 触发前发起的主机端分配次数 |
freechunk | 0 | 触发前进行并部分释放的相同大小分配次数 |