通过通用主机控制接口逃逸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字节

漏洞原理

  1. 缓冲区溢出

    • 目标缓冲区大小计算:[number_of_TD_structures]*0x40+0x18
    • 单个TD时缓冲区为0x58字节
    • memcpy使用MaxLen作为复制大小,可导致溢出
  2. 越界写入

    • NewURB()函数处理URB时,将TD的MaxLen值添加到光标变量
    • 后续TD处理时可部分控制目的地址

0x02 漏洞利用技术

堆布局策略

  1. 初始准备

    • 初始化SVGA FIFO内存
    • 分配SVGA3D对象表
  2. 创建内存空洞

    • 创建大小为0x158的hole(适合TD+缓冲区头)
    • 分配2400个大小为0x158的着色器
    • 释放偶数编号的着色器创建hole
  3. 资源容器分配

    • 在hole中分配0x150字节的资源容器
    • 关联分配0x160字节的数据缓冲区
    • 创建两个"相邻"的0x160字节资源容器

关键利用函数:WriteOOB

WriteOOB(void *data, size_t data_size, uint32_t offset)

参数

  • data: 要写入的数据缓冲区
  • data_size: 数据长度
  • offset: 相对于被损坏资源容器头的偏移

实现细节

  1. 分配帧列表和5个TD结构(总大小0x158)
  2. 前三个TD:
    • MaxLen=0x40
    • Packet ID=USB_PID_SOF
  3. 第四个TD:
    • Packet ID=USB_PID_SOF
    • MaxLen=从offset计算的值
  4. 第五个TD:
    • Packet ID=USB_PID_OUT
    • 写入data缓冲区内容到光标位置

内存泄漏技术

  1. 泄漏vmware-vmx.exe基址

    • 破坏资源容器中偏移0x138处的数据指针(修改最低字节为0x00)
    • 使指针指向相邻的0x160字节资源容器
    • 通过SVGA_3D_CMD_SURFACE_COPY读取数据获取函数指针
  2. 泄漏kernel32.dll基址

    • 覆盖整个数据指针为vmware_vmx_base_address+0x7D42D8(指向Kernel32!MultiByteToWideCharStub)
    • 同样通过SVGA_3D_CMD_SURFACE_COPY读取

代码执行实现

  1. 覆盖资源容器

    • 写入字符串"calc.exe"
    • 填充必要字段
    • 偏移0x120处覆盖为kernel32!WinExec地址
  2. 触发执行

    • 通过SVGA_3D_CMD_SURFACE_COPY访问被破坏的资源容器
    • 触发WinExec("calc.exe")

0x03 完整利用流程

  1. 堆布局阶段

    • 分配2400个0x158字节的着色器
    • 释放备用着色器创建hole
    • 用0x150字节资源容器填充hole
    • 创建相邻的0x160字节资源容器
  2. 信息泄漏阶段

    • 泄漏vmware-vmx.exe基址(最多迭代64次)
    • 泄漏kernel32.dll基址(最多迭代64次)
  3. 代码执行阶段

    • 构造恶意资源容器(最多迭代64次)
    • 触发WinExec执行

0x04 防御与缓解

  1. 官方补丁

    • 升级至VMware Workstation 15.0.4或更高版本
    • 补丁编号VMSA-2019-0005.1
  2. 防御建议

    • 限制guest虚拟机USB设备访问
    • 启用VMware的沙箱增强功能
    • 监控异常的内存访问模式

0x05 总结

该漏洞展示了通过精心构造的USB通信数据包实现虚拟机逃逸的技术路径,利用堆溢出和越界写入原语,结合SVGA3D协议的内存操作能力,最终实现宿主机代码执行。这反映了虚拟化环境中设备模拟组件的安全重要性。

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 参数 : data : 要写入的数据缓冲区 data_size : 数据长度 offset : 相对于被损坏资源容器头的偏移 实现细节 : 分配帧列表和5个TD结构(总大小0x158) 前三个TD: MaxLen =0x40 Packet ID= USB_PID_SOF 第四个TD: Packet ID= USB_PID_SOF MaxLen =从offset计算的值 第五个TD: Packet ID= USB_PID_OUT 写入data缓冲区内容到光标位置 内存泄漏技术 泄漏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协议的内存操作能力,最终实现宿主机代码执行。这反映了虚拟化环境中设备模拟组件的安全重要性。