通过通用主机控制接口逃逸VMWARE
字数 1852 2025-08-27 12:33:49
VMware UHCI接口越界读写漏洞分析与利用教学文档
0x00 漏洞概述
本漏洞是VMware Workstation中虚拟USB 1.1 UHCI(通用主机控制器接口)中的越界读/写漏洞(ZDI-19-421),允许从客户机逃逸至宿主机。该漏洞影响多个VMware产品,在VMware Workstation 15.0.4中被修补(VMSA-2019-0005.1)。
0x01 漏洞技术分析
漏洞背景
- UHCI驱动:
uhci_hcd内核设备驱动程序允许guest虚拟机与主机端的主机控制器接口(HCI)通信 - 通信机制:通过USB请求块(URB)分组与USB设备端点通信(IN/OUT)
漏洞触发条件
- 发送特制的OUT数据包到Bulk端点
- 构造异常的传输描述符(TD)结构:
- Packet ID设置为OUT(0xE1)
MaxLen子字段(位于token字段的21-31位)指示的缓冲区长度>0x40字节
漏洞原理
-
缓冲区溢出:
- 目标缓冲区大小计算:
[number_of_TD_structures]*0x40+0x18 - 单个TD时缓冲区为0x58字节
memcpy使用MaxLen作为复制大小,可导致溢出
- 目标缓冲区大小计算:
-
越界写入:
NewURB()函数处理URB时,将TD的MaxLen值添加到光标变量- 后续TD处理时可部分控制目的地址
0x02 漏洞利用技术
堆布局策略
-
初始准备:
- 初始化SVGA FIFO内存
- 分配SVGA3D对象表
-
创建内存空洞:
- 创建大小为0x158的hole(适合TD+缓冲区头)
- 分配2400个大小为0x158的着色器
- 释放偶数编号的着色器创建hole
-
资源容器分配:
- 在hole中分配0x150字节的资源容器
- 关联分配0x160字节的数据缓冲区
- 创建两个"相邻"的0x160字节资源容器
关键利用函数:WriteOOB
WriteOOB(void *data, size_t data_size, uint32_t offset)
参数:
data: 要写入的数据缓冲区data_size: 数据长度offset: 相对于被损坏资源容器头的偏移
实现细节:
- 分配帧列表和5个TD结构(总大小0x158)
- 前三个TD:
MaxLen=0x40- Packet ID=
USB_PID_SOF
- 第四个TD:
- Packet ID=
USB_PID_SOF MaxLen=从offset计算的值
- Packet ID=
- 第五个TD:
- Packet ID=
USB_PID_OUT - 写入data缓冲区内容到光标位置
- Packet ID=
内存泄漏技术
-
泄漏vmware-vmx.exe基址:
- 破坏资源容器中偏移0x138处的数据指针(修改最低字节为0x00)
- 使指针指向相邻的0x160字节资源容器
- 通过SVGA_3D_CMD_SURFACE_COPY读取数据获取函数指针
-
泄漏kernel32.dll基址:
- 覆盖整个数据指针为
vmware_vmx_base_address+0x7D42D8(指向Kernel32!MultiByteToWideCharStub) - 同样通过SVGA_3D_CMD_SURFACE_COPY读取
- 覆盖整个数据指针为
代码执行实现
-
覆盖资源容器:
- 写入字符串"calc.exe"
- 填充必要字段
- 偏移0x120处覆盖为
kernel32!WinExec地址
-
触发执行:
- 通过SVGA_3D_CMD_SURFACE_COPY访问被破坏的资源容器
- 触发
WinExec("calc.exe")
0x03 完整利用流程
-
堆布局阶段:
- 分配2400个0x158字节的着色器
- 释放备用着色器创建hole
- 用0x150字节资源容器填充hole
- 创建相邻的0x160字节资源容器
-
信息泄漏阶段:
- 泄漏vmware-vmx.exe基址(最多迭代64次)
- 泄漏kernel32.dll基址(最多迭代64次)
-
代码执行阶段:
- 构造恶意资源容器(最多迭代64次)
- 触发WinExec执行
0x04 防御与缓解
-
官方补丁:
- 升级至VMware Workstation 15.0.4或更高版本
- 补丁编号VMSA-2019-0005.1
-
防御建议:
- 限制guest虚拟机USB设备访问
- 启用VMware的沙箱增强功能
- 监控异常的内存访问模式
0x05 总结
该漏洞展示了通过精心构造的USB通信数据包实现虚拟机逃逸的技术路径,利用堆溢出和越界写入原语,结合SVGA3D协议的内存操作能力,最终实现宿主机代码执行。这反映了虚拟化环境中设备模拟组件的安全重要性。