本次介绍的论文使用静态分析与模糊测试相结合的方法,针对虚拟机监视器(Hypervisor)中虚拟设备DMA相关的漏洞进行挖掘。论文发表于软件工程顶级会议ASE 2023,作者团队来自于中国科学院软件研究所和上海交通大学。
一、研究背景
随着云计算技术的不断普及,许多云厂商都发布了自己的云服务,比如谷歌云,阿里云,华为云等。虚拟化技术是云计算的核心,其可以将物理资源划分成虚拟资源给不同的用户使用。虚拟机监视器(Hypervisor)是虚拟化技术的核心系统软件,它可以管理虚拟机的资源。现如今许多研究都针对Hypervisor中的虚拟设备进行漏洞挖掘,常见的虚拟设备有虚拟网卡、虚拟声卡、虚拟USB设备等,虚拟设备由于种类繁多,且代码复杂,是Hypervisor中的一个重要攻击面。在针对虚拟设备的漏洞挖掘中,一个常见的攻击模型就是假设客户机是恶意的,可以通过PIO/MMIO/DMA等数据信道向虚拟设备发送恶意的指令,从而对虚拟设备甚至Hypervisor进行攻击。而模糊测试(Fuzzing)是近些年挖掘漏洞最有效的方式之一,它主要向被测程序提供随机的输入并且监控被测程序的状态,并发现可能的崩溃。
本文也采用了Fuzzing的技术针对虚拟设备进行漏洞挖掘,但是本文的主要目标是DMA相关的漏洞。根据作者的统计,有82%虚拟设备的漏洞与DMA操作有关,所以针对DMA相关的漏洞进行挖掘是一个非常重要的安全需求。
二、研究方法
1. Overview
针对上述问题,作者开发了VD-GUARD工具,其架构如上图1所示,主要包含两个部分,分别是静态分析和Fuzzing。静态分析部分主要有两个功能,分别是寻找能够触发DMA操作的路径,作者将这一步骤称作Call Chain Searching;以及构建初始种子。Fuzzing部分作者使用了静态分析的结果进行DMA Guided Fuzzing。
图1 VD-GUARD工具架构图
2. Call Chain Searching
经过分析,VD-GUARD发现只有当内存区域被设置为MMIO/PIO区域,并且存在一个由内存操作到最终执行DMA操作的调用链时,内存操作才可能触发与DMA相关的漏洞。所以VD-GUARD首先通过识别内存的初始化和注册过程来提取可能存在bug的内存操作。接下来,VD-GUARD构建调用图,并使用深度优先搜索算法搜索从MMIO/PIO函数到DMA操作的调用链。在构建调用图时,VD-GUARD特别关注了函数指针的赋值语句,确保调用链的完整性。
3. Initial Seed Construction
有了调用链之后,VD-GUARD目的是构建一个初始种子,该种子能够触发虚拟设备中识别出来的调用链。他们对每个调用链构建了一个程序依赖图(PDG),如图2所示,PDG的节点是调用链函数中的语句,边是控制流和数据流依赖关系。基于PDG,VD-GUARD提取了控制流依赖中的约束集,这些约束分为两组:必须满足的约束(例如对调用语句的约束)和必须绕过的约束(例如过早触发控制流跳转的语句的约束)。接着,VD-GUARD根据数据依赖关系追踪这些约束中变量的数据赋值语句。如果追踪到的数据赋值语句也需要满足其他约束,则重复上述步骤,直到不能发现新的约束。
图2 简化的程序依赖图(PDG)
但是,使用上述的静态分析方法在处理约束方面存在局限性,难以构建触发调用链的种子。因此,VD-GUARD利用Fuzzing来生成所需的种子。具体来说,VD-GUARD在Fuzzing之前使用静态方法构建的种子作为初始种子,然而Fuzzing 的目标不是触发程序崩溃,而是持续进行Fuzzing直到触发调用链为止。
4. DMA Guided Fuzzing
在Fuzzing部分,作者针对DMA操作相关的漏洞进行挖掘,提出了DMA Guided Fuzzing技术,主要包括了两个改进方案:DMA Guided Metric以及DMA Guided Mutator。
DMA Guided Metric基于DMA操作来过滤种子。DMA Guided Metric在编译期间在每个DMA操作前添加标记,并在程序执行新生成的输入时记录DMA操作的覆盖率。只有当一个输入至少触发一个DMA操作并发现新的边覆盖时,VD-GUARD才会将其添加到当前循环的种子队列中。
DMA Guided Mutator是新的变异策略。为了提高测试用例变异的有效性,VD-GUARD首先将测试用例分割成操作序列,然后根据特定策略进行变异。对于序列中的每个内存操作,变异器以一定的概率γ删除它,或者以较低的概率δ对其进行变异。此外,变异器还随机生成新的内存操作序列。通过基于输入的变异策略生成的测试用例负责触发DMA操作并保留之前扩展的状态,而通过随机生成策略生成的语料可以扩展额外的状态。
三、实验结果
实验设置
作者收集了近两年来QEMU中与DMA相关的10个漏洞作为benchmark,在实验中使用了QEMU 8.0版本以及VirtualBox 7.0.2版本,针对每个虚拟设备都测试24小时并重复5次。
RQ1:在QEMU上进行静态分析
表1比较了VD-GUARD和之前的工作在静态分析QEMU中可能存在漏洞的调用链的情况。VD-GUARD识别的数据入口点(146个)明显多于之前的工作(25个),这是由于其使用了更全面的分析方法,VD-GUARD不仅考虑了内存操作的名称,还考虑了内存区域的初始化和注册过程。因此,VD-GUARD发现了更多的调用链,并涵盖了更多的虚拟设备。总的来说,VD-GUARD的方法在静态分析方面更为有效。
表1 VD-GUARD和之前的工作的对比
RQ2:发现0-day漏洞
如表2所示,VD-GUARD在测试中成功发现了4个之前未知的虚拟设备漏洞。这些漏洞包括不同类型的内存错误,可能导致服务拒绝(DoS)攻击。其中三个由于安全影响严重被分配了CVE编号,特别是堆缓冲区溢出漏洞,可能还能被用于虚拟机逃逸攻击。
表2 VD-GUARD发现的漏洞
RQ3:与MORPHUZZ比较
(1)漏洞发现
如表3所示,在漏洞挖掘的实验中,VD-GUARD 在24小时内成功发现了数据集中的全部10个漏洞,而MORPHUZZ只找到了3个。另外,尽管MORPHUZZ在OSS-Fuzz项目中报告了E1000E、PCNET、EHCI和XHCI设备的漏洞,但在此次实验中24小时内并未发现这些漏洞,实验结果的差异可能与Fuzzing的设置有关。这表明VD-GUARD能显著提高虚拟设备漏洞发现的效率。
表3 为QEMU构建的漏洞数据集
(2)DMA路径覆盖率
DMA路径覆盖对于Hypervisor的Fuzzing十分重要,这个实验比较了MORPHUZZ和VD-GUARD在6个虚拟设备上的表现。图3说明VD-GUARD在24小时内持续在所有设备上显示出更高的DMA路径覆盖率(平均2.1倍)。特别是对于XHCI,VD-GUARD发现的DMA路径是MORPHUZZ的4倍。MORPHUZZ发现的漏洞数量较少与其较低的DMA路径覆盖率有关,这更凸显了DMA引导模糊测试的重要性。
图3 MORPHUZZ和VD-GUARD在不同目标虚拟设备下的DMA路径覆盖
RQ4:Ablation Study
实验评估了为DMA guided Fuzzing提出的三个组件的有效性:初始种子构建、DMA Guided Metric和DMA Guided Mutator。为了进行这些评估,MORPHUZZ、VD-GUARD及其变种在3个虚拟设备上进行了24小时的测试,实验重复5次。表4说明启用了所有组件的VD-GUARD平均在120分钟内发现漏洞。禁用任何组件都显著增加了发现漏洞的时间(3.9倍至218倍),这个实验证明了这三个组件对于Hypervisor中虚拟设备中高效漏洞发现的重要性,突出了它们对Fuzzing的贡献。
表4 发现漏洞的耗时
四、总结
本文针对Hypervisor中的虚拟设备进行漏洞挖掘,提出了DMA引导的Fuzzing方案,设计并实现了VD-GUARD的原型系统。VD-GUARD首先通过静态分析识别了DMA相关的操作序列,然后将其作为Fuzzing的反馈,这样可以增强对不同DMA逻辑状态的探索,进而在虚拟设备中发现更多DMA相关的漏洞。根据实验评估,VD-GUARD在QEMU和VirtualBox中发现了4个0-day漏洞。