【DEFCON & HITB】Bug Hunting In VMware Device Virtualization(上篇)
奇安信天工实验室安全研究成果,入选国际顶级安全会议DEFCON 32 和 HITBSecConf 2024,议题名称《Dragon Slaying Guide: Bug Hunting In VMware Device Virtualization》。 我们将该议题分为三篇文章进行详细讲解。本文是第一篇,主要介绍VMware虚拟化实现,为后续深入探讨VMware虚拟设备漏洞挖掘打下坚实的理论基础。 一、Introduction VMware Workstation/ESXi是市场上最流行的商用虚拟化软件之一。其复杂的虚拟化系统设计和在基础设施中的关键地位使其长期成为黑客的顶级目标。对于安全研究人员来说,发现VMware Hypervisor中的虚拟化逃逸漏洞就像在角色扮演游戏中与巨龙较量一样具有挑战性。 本议题揭露了一个新型攻击面:Device Virtualization in VMKernel 。这是迄今为止,尚未被安全研究探索的未知领地。且该攻击视角尚未被VMware考虑进防御体系,其现有的沙箱机制理论上完全无法防御从VMKernel发起的攻击。在对本次攻击面的分析和VMware Hypervisor的逆向工程中,我们发现了8个与设备虚拟化相关的漏洞,其中5个漏洞已经被分配了CVE编号(CVE-2024-22251、CVE-2024-22252、CVE-2024-22255、CVE-2024-22273、CVE-2024-37086),其余3个漏洞已经被VMware确认。 本议题将从VMware虚拟化实现、USB Device Virtualization 和 SCSI Device Virtualization 三个部分递进讲解,如何发现VMKernel这个攻击面,找到多个未知漏洞的过程。 本周将为大家介绍第一部分:VMware虚拟化实现。该部分会深入介绍 vmm 的加载过程,vmm与vmx数据共享功能的实现,VMware的UserRPC这一Hypervisor与Host通信的实现,这些都是在虚拟设备模拟中至关重要的机制。 二、VMware Virtualization Details 我们将通过介绍我们对VMware 设备虚拟化的逆向工作,来展示我们是如何发现VMKernel这一与设备虚拟化相关的新攻击面的。为了方便阐述我们会用自己逆向所定义的符号名配合代码片段进行解释,其中也有部分符号直接来自于open-vm-tools,我们发现open-vm-tools与vmx共享很多通用数据结构,这加速了我们的逆向分析过程。 我们都知道VMware利用UserRpc机制完成了对很多虚拟设备的实现,在分析具体UserRpcHandler时我们总是会发现vmx经常会使用一些与vmm称为SharedArea 的共享数据,只审计UserRpcHandler我们无法判断这些数据的来源与去向,这时常会让我们有些抓狂。所以我们决定首先分析 UserRpc 的实现,以了解VMware在设备虚拟化方面的工作流程,判断我们在Guest中的数据可以影响的二进制代码块。 三、UserRpc In VMX 当 vmx 进程启动时,其最重要的部分就是按顺序初始化系统需要使用的所有模块,这个模块的表项由模块名和启动初始化函数组成,他很容易从二进制入口点静态分析追踪到,除此之外我们还使用了API Monitor 来监控vmx与内核模块vmx86.sys的通信过程,通过IOCTL指令立即数,我们能在vmx中定位到对应请求发起的位置,以及在vmx86.sys中对应的处理代码。幸运的是,我们能在IDA中看到一些调试日志字符串,这让我们更容易理解相应IOCTL指令的含义。 首先引起我们注意的便是 “IOCTL_VMX86_RUN_VM” 这条指令,他被调用于一个线程的循环内。代码结构上,它一直保持循环调用并会使用 IOCTL_VMX86_RUN_VM 的返回值作为参数之一传递给 Monitor_ProcessUserRpcCall 负责调用对应的处理函数。这种代码结构正是我们需要寻找的 vmm 切回宿主机并调用 vmx 处理UserRpc请求的过程代码,Monitor_ProcessUserRpcCall 其中调用功能函数表就是 Vmware 的 UserRPC 功能在 vmx 侧的实现,并且这些UserRpcHandler函数使用了称为userRpcBlock的共享内存区域指针作为其唯一的参数。...