虚拟化逃逸与 Windows 内核提权深度教学
字数 2336 2025-08-29 22:41:32

虚拟化逃逸与 Windows 内核提权深度教学文档

1. 引言与背景

虚拟化平台尤其是 VMware Workstation/Fusion 长期以来被广泛使用,其安全性备受关注。客机(Guest)到宿主(Host)攻击一旦成功,攻击者就可突破 VM 沙箱,直接影响宿主机甚至整个物理环境。

2024年,多位研究者在 Pwn2Own 等竞赛中演示了 VMware Workstation/Fusion 中的多重漏洞链,其中包含客机获取宿主执行权限的关键缺陷:

  • CVE-2024-22267:VMware 的 vBluetooth 设备中的 Use-After-Free 漏洞
  • CVE-2024-22270:Host-Guest 文件共享(HGFS)功能中的信息泄露漏洞
  • CVE-2024-30085:Windows Cloud Files Mini Filter 驱动堆缓冲区溢出漏洞

这些漏洞需要客机内具有管理员权限才能利用,一旦成功链式利用,攻击者可在宿主系统上获得任意代码执行和提权能力。

2. 攻击链总体概述

完整攻击链利用了三大漏洞:

  1. 信息泄露 (CVE-2024-22270) - 泄露宿主机堆中未初始化数据
  2. VM Escape (CVE-2024-22267) - 利用虚拟蓝牙 UAF 在 vmware-vmx 进程中执行 ROP
  3. 内核提权 (CVE-2024-30085) - Cloud Files 驱动堆溢出取得任意写,劫持 Token

攻击链逻辑顺序:

  1. 利用 HGFS 泄漏漏洞获取宿主内存信息
  2. 借助 VBluetooth UAF 漏洞在宿主上执行代码
  3. 触发 CLDFLT 堆溢出进行提权,完全控制宿主系统

3. 漏洞一:CVE-2024-22270 - HGFS 未初始化堆数据泄露

3.1 漏洞成因

  • malloc 未清零,新分配堆空间包含旧数据残留
  • HGFS v1 响应只写入有效数据,未初始化部分返回给 Guest

3.2 利用前准备

在 Guest 安装 open-vm-tools,启用 HGFS 和 VMCI:

虚拟机 .vmx 配置:

sharedFolder0.present = "TRUE"
guestOS = "windows9-64"

3.3 泄露数据分析

  • 搜索 0xfffff8... 等指针模式
  • 识别 PE header(MZ)或 ASCII 文件路径
  • 利用泄露地址计算 vmware-vmx 基址

4. 漏洞二:CVE-2024-22267 - VBluetooth URB Use-After-Free

4.1 漏洞原理

  • SubmitURB 中复制 URB 指针未增引用计数
  • HandleURBs 释放节点后异步回调,使用已释放的 URB

4.2 利用步骤

  1. Guest 发送 URB(data) - 入队并注册回调
  2. 发送 URB(reset) - 调用 PutURB 释放所有 URB
  3. Poll 回调触发 UAF
  4. 通过控制 URB 结构中的虚表指针实现间接调用

4.3 绕过 CFG 技巧

  • 寻找符合 CFG 要求的 ROP gadget
  • 将客机物理内存页映射到 VMX 数据段中,控制回调地址

5. 漏洞三:CVE-2024-30085 - CLDFLT 堆缓冲区溢出

5.1 驱动源码与漏洞定位

当 elem4_length == 0x1001,分配 0x1000,复制 0x1001 → 堆溢出

5.2 构造 ReparsePoint 数据

通过 FSCTL_GET_REPARSE_POINT 控制码发送大 buffer

伪造两次溢出:

  1. 第一次破坏 _WNF_STATE_DATA 泄露地址
  2. 第二次控制管道对象实现任意写

5.3 任意写原语

  • 修改 _WNF_STATE_DATA::Data 和 Length 字段
  • 得到读写原语

5.4 Token 劫持与 SYSTEM 权限

将 winlogon 的 Token 覆盖当前进程,获取 SYSTEM

6. 核心技术点与提权机制详解

6.1 EPROCESS 结构

  • EPROCESS.Token 偏移
  • KTHREAD 与 ETHREAD 权限检查

6.2 PagedPool 分配

  • 大小为 0x1000 的分页池块
  • Free List 与 PoolSpray

6.3 WNF & Mailslot 对象

  • WNF subscription table 布局
  • Mailslot 用于喷洒稳定对象

7. 串联利用与逃逸示例

  1. HGFS 泄漏阶段:获取宿主内核地址布局
  2. VB 漏洞阶段:在宿主 VMX 进程中执行 ROP
  3. 内核提权阶段:触发 CLDFLT 溢出,劫持 EPROCESS->Token 提权

8. 环境搭建与复现指南

8.1 虚拟机配置 (.vmx)

sharedFolder0.present = "TRUE"
guestOS = "windows9-64"

8.2 PoC 编译命令

HGFS 漏洞利用:

cl hgfs_leak_poc.cpp /O2 /EHsc

VB 漏洞利用:

cl vbluetooth_exploit.cpp /O2 /EHsc

CLDFLT 漏洞利用:

cl cldflt_exploit.cpp /O2 /EHsc /link advapi32.lib

8.3 调试与检测

WinDbg 命令:

!process 0 0
!process <地址> 1f
!uniqstack
!pool
!object
!token

9. 防护与检测策略

9.1 禁用或更新

  • 禁用 HGFS 共享文件夹
  • 关闭虚拟蓝牙设备
  • 更新到 VMware Workstation 17.5.2+/Fusion 13.5.2+

9.2 启用安全特性

  • 启用内核 CFG/HVCI
  • 启用 Hypervisor 强制代码完整性

9.3 监控检测

  • 监控 Vsock/HGFS 的非标准读写
  • 监测 vmware-hostd 服务的异常活动
  • 监控 cldflt.sys 相关的可疑操作

10. 附录:PoC 代码与脚本

10.1 HGFS 泄漏 PoC (客机)

// 使用 VMware Host-Guest API 读取共享文件
VMHGFS_OpenHandle(...);
VMHGFS_Read(...);
// 打印返回的未初始化数据

10.2 VB 漏洞 PoC (客机)

// 模拟 USB/蓝牙设备发送特制 URB
// 使用 WinUSB 或原始 IOCTL 接口

10.3 CLDFLT 漏洞 PoC (宿主)

// 创建文件并 DeviceIoControl 调用 FSCTL_SET_REPARSE_POINT
CreateFile(...);
DeviceIoControl(..., FSCTL_SET_REPARSE_POINT, ...);
// 使用大量 NtCreateWnfStateName/Update 进行 WNF 喷射

10.4 检测脚本

PowerShell 脚本监测内核对象异常:

ZwOpenKey + ZwQueryKey 访问 WNF 状态名称注册表项
NtQuerySystemInformation 检测分页池异常分配
虚拟化逃逸与 Windows 内核提权深度教学文档 1. 引言与背景 虚拟化平台尤其是 VMware Workstation/Fusion 长期以来被广泛使用,其安全性备受关注。客机(Guest)到宿主(Host)攻击一旦成功,攻击者就可突破 VM 沙箱,直接影响宿主机甚至整个物理环境。 2024年,多位研究者在 Pwn2Own 等竞赛中演示了 VMware Workstation/Fusion 中的多重漏洞链,其中包含客机获取宿主执行权限的关键缺陷: CVE-2024-22267:VMware 的 vBluetooth 设备中的 Use-After-Free 漏洞 CVE-2024-22270:Host-Guest 文件共享(HGFS)功能中的信息泄露漏洞 CVE-2024-30085:Windows Cloud Files Mini Filter 驱动堆缓冲区溢出漏洞 这些漏洞需要客机内具有管理员权限才能利用,一旦成功链式利用,攻击者可在宿主系统上获得任意代码执行和提权能力。 2. 攻击链总体概述 完整攻击链利用了三大漏洞: 信息泄露 (CVE-2024-22270) - 泄露宿主机堆中未初始化数据 VM Escape (CVE-2024-22267) - 利用虚拟蓝牙 UAF 在 vmware-vmx 进程中执行 ROP 内核提权 (CVE-2024-30085) - Cloud Files 驱动堆溢出取得任意写,劫持 Token 攻击链逻辑顺序: 利用 HGFS 泄漏漏洞获取宿主内存信息 借助 VBluetooth UAF 漏洞在宿主上执行代码 触发 CLDFLT 堆溢出进行提权,完全控制宿主系统 3. 漏洞一:CVE-2024-22270 - HGFS 未初始化堆数据泄露 3.1 漏洞成因 malloc 未清零,新分配堆空间包含旧数据残留 HGFS v1 响应只写入有效数据,未初始化部分返回给 Guest 3.2 利用前准备 在 Guest 安装 open-vm-tools,启用 HGFS 和 VMCI: 虚拟机 .vmx 配置: 3.3 泄露数据分析 搜索 0xfffff8... 等指针模式 识别 PE header(MZ)或 ASCII 文件路径 利用泄露地址计算 vmware-vmx 基址 4. 漏洞二:CVE-2024-22267 - VBluetooth URB Use-After-Free 4.1 漏洞原理 SubmitURB 中复制 URB 指针未增引用计数 HandleURBs 释放节点后异步回调,使用已释放的 URB 4.2 利用步骤 Guest 发送 URB(data) - 入队并注册回调 发送 URB(reset) - 调用 PutURB 释放所有 URB Poll 回调触发 UAF 通过控制 URB 结构中的虚表指针实现间接调用 4.3 绕过 CFG 技巧 寻找符合 CFG 要求的 ROP gadget 将客机物理内存页映射到 VMX 数据段中,控制回调地址 5. 漏洞三:CVE-2024-30085 - CLDFLT 堆缓冲区溢出 5.1 驱动源码与漏洞定位 当 elem4_ length == 0x1001,分配 0x1000,复制 0x1001 → 堆溢出 5.2 构造 ReparsePoint 数据 通过 FSCTL_ GET_ REPARSE_ POINT 控制码发送大 buffer 伪造两次溢出: 第一次破坏 _ WNF_ STATE_ DATA 泄露地址 第二次控制管道对象实现任意写 5.3 任意写原语 修改 _ WNF_ STATE_ DATA::Data 和 Length 字段 得到读写原语 5.4 Token 劫持与 SYSTEM 权限 将 winlogon 的 Token 覆盖当前进程,获取 SYSTEM 6. 核心技术点与提权机制详解 6.1 EPROCESS 结构 EPROCESS.Token 偏移 KTHREAD 与 ETHREAD 权限检查 6.2 PagedPool 分配 大小为 0x1000 的分页池块 Free List 与 PoolSpray 6.3 WNF & Mailslot 对象 WNF subscription table 布局 Mailslot 用于喷洒稳定对象 7. 串联利用与逃逸示例 HGFS 泄漏阶段:获取宿主内核地址布局 VB 漏洞阶段:在宿主 VMX 进程中执行 ROP 内核提权阶段:触发 CLDFLT 溢出,劫持 EPROCESS->Token 提权 8. 环境搭建与复现指南 8.1 虚拟机配置 (.vmx) 8.2 PoC 编译命令 HGFS 漏洞利用: VB 漏洞利用: CLDFLT 漏洞利用: 8.3 调试与检测 WinDbg 命令: 9. 防护与检测策略 9.1 禁用或更新 禁用 HGFS 共享文件夹 关闭虚拟蓝牙设备 更新到 VMware Workstation 17.5.2+/Fusion 13.5.2+ 9.2 启用安全特性 启用内核 CFG/HVCI 启用 Hypervisor 强制代码完整性 9.3 监控检测 监控 Vsock/HGFS 的非标准读写 监测 vmware-hostd 服务的异常活动 监控 cldflt.sys 相关的可疑操作 10. 附录:PoC 代码与脚本 10.1 HGFS 泄漏 PoC (客机) 10.2 VB 漏洞 PoC (客机) 10.3 CLDFLT 漏洞 PoC (宿主) 10.4 检测脚本 PowerShell 脚本监测内核对象异常: