CVE-2026-59346 VMware VMXNET3整数溢出漏洞PoC技术分析

导语:安全研究员 Stan S(化名 0xCyberstan)近日在 GitHub 公开了 CVE-2026-59346 的完整利用代码。这是一个位于 VMware Workstation 与 Fusion 的 VMXNET3 虚拟网卡 TSO(TCP 段卸载)处理路径上的 32 位整数溢出漏洞,可在宿主机上引发堆缓冲区溢出。Broadcom 已于 2026 年 9 月 3 日通过 VMSA-2026-0007 修复,本文将从原理到 PoC 代码逐层拆解。


一、漏洞背景

Broadcom 在 2026 年 9 月 3 日发布的安全公告 VMSA-2026-0007 中描述了 VMware 桌面虚拟化产品的两枚整数溢出与缓冲区溢出漏洞,其中 CVE-2026-59346 影响最严重,CVSSv3 评分为 9.3(Critical),公告原文写道:「具有 VMXNET3 虚拟网卡所在虚拟机本地管理员权限的恶意攻击者,可利用此漏洞在宿主机上执行代码」。Trend Micro ZDI 在 ZDI-26-647 中将其评为 7.5,两套评分的差异来自对代码执行可行性的不同判断。

受影响产品包括 VMware Workstation、Fusion、Player 共享同一 vmware-vmx 后端的版本,主要集中在 25H2 与 26H1。VMXNET3 是现代客户机的默认网卡,因此默认安装的桌面环境几乎都在受影响范围内。Broadcom 已发布 26H1u1 修复,公告同时明确「没有可用的临时缓解措施」,升级是唯一的修复路径。


二、技术原理

TSO 路径上的整数乘法

VMXNET3 的 TSO(TCP Segmentation Offload)把客户机内的大块 TCP 数据拆成符合 MTU 的小段,工作由宿主机进程 vmware-vmx 完成,目的是减轻客户机 CPU 负担。

TSO 分段例程分配缓冲区时使用公式:

alloc_size = seg_count × per_seg_size

两个字段均来自客户机提交的 TX 描述符。问题在于乘法是 32 位的 imul:真实乘积超过 2^32 后会被截断回 32 位,分配器只拿到一个极小的数值(PoC 中约为 5984 字节)。但 TSO 分段循环仍按原始 seg_count 迭代,向这块小缓冲区写入约 4.3 GB 数据,触发堆缓冲区溢出。

整数溢出原理示意图

CVE-2025-41236 的补丁为何不够

2025 年的 CVE-2025-41236 已在 TSO 路径上做过一轮加固:补丁要求 MSS、per_seg_size 及其和都不能超过 9216 字节。CVE-2026-59346 利用的是检查盲区——它没有抬高任何单字段,而是让两个「合规」的字段相乘后溢出。例如 PoC 中 per_seg=6240(小于 9216)、MSS=1,单看任一字段都通过校验,但 6240 × 较大 seg_count 在 32 位下就会回绕。根因在乘积本身,补丁必须改用 64 位乘法并在分配前再次校验结果。


三、公开 PoC 详解

仓库与作者信息

PoC 由 Stan S(化名 0xCyberstan)发布在 GitHub 的 CVE-2026-59346-POC 仓库,首次提交时间 2026 年 9 月 15 日。代码以 Linux 内核模块形式实现,运行在客户机内,需要 root 权限:它绕过客户机标准 vmxnet3 驱动,直接写入 TX 环描述符,再通过 MMIO 写入「门铃」寄存器触发宿主机读取。README 写明 PoC 只展示内存破坏、不尝试把崩溃转为代码执行,复现环境为 Ubuntu 24.04 + Workstation Pro 25.0.1(build 25219725)宿主机,内置 Alpine Linux 客户机。

关键参数计算逻辑

compute_params() 函数是 PoC 的核心,它在 32 位空间内反解出能让乘积溢出、同时描述符数量最少的参数组合。核心代码片段如下:

per_seg = (10 + HDR_TOTAL + MSS + 7) & ~7;
ps = per_seg;
while ((ps & 1) == 0) { ps >>= 1; k++; }
mod_exp = 32 - k;
inv = modinv(ps, 1L << mod_exp);

min_sc = (u32)(((u64)0x100000000ULL + per_seg - 1) / per_seg);
for (alloc = step; alloc < per_seg; alloc += step) {
    alloc_div = alloc >> k;
    seg_count = (u32)(((u64)alloc_div * inv) % (1UL << mod_exp));

    if (seg_count < min_sc) continue;
    if (((u64)per_seg * seg_count) % (1ULL << 32) != alloc) continue;
    ...
}

这段代码用模逆元反推出「截断后 alloc」对应的原始 seg_count,在描述符总数不超过 96 的约束下挑出最优溢出组合——min_sc 保证乘积跨越 32 位边界,alloc < per_seg 保证分配出的缓冲区远小于单段大小,触发「小缓冲区承载大段数」的经典溢出。

触发路径

模块加载完成后按以下顺序执行:通过 find_tx_ring() 定位 TX 环基址 → 调用 compute_params() 计算溢出参数 → 把 TSO 描述符链写入 TX 环(SG 条目均使用合法 DMA,避免驱动校验拒绝)→ 通过 iowrite32(idx, doorbell) 写入门铃。宿主机 vmware-vmx 拿到描述符后按原始 seg_count 跑 TSO 循环,复制数据直到写入未映射内存,进程触发 SIGSEGV 崩溃,宿主机日志留下 PANIC: Unexpected signal: 11 与 vcpu-0 线程上的分配器回溯。

完整的运行命令

# 在客户机内(Alpine)
apk add linux-virt-dev        # Debian/Ubuntu: apt install linux-headers-$(uname -r)
make
insmod vmxnet3_tso_trigger.ko dryrun=1     # 先做干跑,看参数是否合理
dmesg | tail -20
rmmod vmxnet3_tso_trigger
insmod vmxnet3_tso_trigger.ko               # 真实触发,宿主机进程会崩溃

模块还提供了 warmup、freechunk、wait_ms、txwarm 等参数,用于在触发前调节宿主机堆布局,研究人员可在授权实验环境中复现。


四、实际影响与厂商分歧

公开版本的 PoC 会稳定让 vmware-vmx 崩溃并连带关闭客户机,但没有公开任何把崩溃转为任意代码执行的方法。Stan S 在 README 中写道:「It makes no attempt at code execution」,并提醒测试会丢失未保存的客户机状态。

虚拟机逃逸示意图

Broadcom 与 ZDI 的评级差异

  • Broadcom(CVSSv3 9.3):考虑的是「具备 guest 管理员权限即可在宿主机上下文执行任意代码」的最坏情形。
  • ZDI(7.5):评估的是 PoC 当前展示的稳定性级别,未把未公开的代码执行路径计入。

两套评分并不矛盾,只是评估方法不同。安全运营人员仍应按厂商口径处理:在桌面虚拟化产品上运行不可信客户机的环境应当立即升级。

真实风险在哪里

高风险场景包括:研发测试环境、CTF 平台、培训沙箱,以及允许用户自带客户机镜像的 VDI 试点。宿主机常被遗忘升级——很多管理员习惯更新客户机内的操作系统,却不会留意 Workstation/Fusion 本身,攻击者正是利用「客户机已打补丁、宿主机仍暴露」的状态。


五、处置建议

升级操作以宿主机为基准,而非客户机:

  1. 在宿主机上确认当前版本。Windows 宿主机可在「控制面板 → 程序和功能」查看,Linux/macOS 宿主机可在 VMware 主界面「关于」中查看。
  2. 升级 Workstation/Fusion 至 26H1u1 或更高版本。这是 Broadcom 唯一推荐的修复手段,没有临时缓解方案。
  3. 复核客户机侧的 guest OS 升级是无效的——TSO 路径在宿主机进程的 vmware-vmx 内。
  4. 评估是否所有桌面客户机都必须使用 VMXNET3。对于只跑可信工作负载的客户机,可以临时切换到 E1000 减少攻击面。
  5. 在需要继续运行不可信客户机的环境里,限定客户机内管理员权限的发放范围,把「guest 管理员」当成与「宿主机本地用户」同级的高权限身份对待。

研究人员应在授权且隔离的实验环境里复现 PoC,公网生产环境务必先升级后再做合规的验证。


参考链接

  • VMSA-2026-0007 公告:https://support.broadcom.com/web/ecx/support-content-notification/-/external/content/SecurityAdvisories/0/38288
  • ZDI-26-647:https://www.zerodayinitiative.com/advisories/ZDI-26-647/
  • 公开 PoC 仓库:https://github.com/0xCyberstan/CVE-2026-59346-POC
  • 研究员博客:https://cyberstan.co.uk/vmxnet3-tso-overflow/

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容