介绍
这是来自2021 CCS的一篇论文,作者有GaoningPan, Xingwei Lin, Xuhong Zhang, Yongkang Jia, Shouling Ji, Chunming Wu, Xinlei Ying, Jiashui Wang, Yanjun Wu。该论文提出V-shuttle的新框架来执行管控程序的模糊测试,该框架执行可扩展和语义感知的管理程序模糊测试。
该论文的贡献:
1.因为由DMA传输的数据结构是根据协议规范以嵌套的形式构建的。如果不能理解虚拟设备的协议,就会使模糊过程停留在初始模糊阶段,导致模糊效率低下,因此应对这种挑战,作者提出了新的框架V-Shuttle。
2.对世界上两个流行的管理程序平台QEMU和VirtualBox评估,发现35个bug并分配了17个CVE。
前置知识
1.云计算的核心是虚拟机管理程序,也称为虚拟机监视器(VMM),对虚拟机监视器的攻击可能导致虚拟机越权或权限提升。云计算中的Hypervisor(虚拟化管理程序)是一种软件或固件层,它允许在物理计算机上运行多个虚拟机实例。
Hypervisor使得多个虚拟机之间可以相互隔离,以便它们可以独立运行,就像它们运行在物理计算机上一样。云计算中的Hypervisor通常分为两种类型:类型1和类型2。类型1 Hypervisor(也称为“裸金属” Hypervisor)直接安装在物理计算机上,而类型2 Hypervisor则在操作系统之上运行。Hypervisor在云计算中起着至关重要的作用,因为它允许将计算资源动态分配给多个虚拟机实例,以便满足不断变化的计算需求。同时,它还提供了额外的安全性,通过在虚拟机之间建立隔离层来防止恶意软件和攻击。
2.MMIO(Memory-Mapped I/O)是一种在计算机系统中用于实现输入/输出(I/O)的机制。它使用计算机的内存地址空间来寻址和访问I/O设备,使得I/O设备的数据可以像内存一样被处理和操作。
MMIO通常通过将I/O设备的寄存器映射到计算机的物理内存空间来实现。当程序需要读取或写入I/O设备的数据时,它可以像读取或写入内存一样访问相应的内存地址。此时,MMIO机制会将访问请求转换为对相应I/O设备寄存器的读取或写入操作。MMIO相比于另一种常见的I/O机制DMA(Direct Memory Access)具有更低的延迟和更高的灵活性,因为它不需要额外的硬件支持,且能够提供更好的隔离性和安全性。但是,MMIO也可能会对系统性能产生一定的影响,因为它需要与其他系统资源共享内存带宽和处理器时间。
3.QEMU 是一个快捷的跨平台开源计算机模拟器,可以模拟许多硬件体系结构。 QEMU 可让您在现有系统(VM 主机服务器)之上运行未经修改的完整操作系统(VM Guest)。
4.常规虚拟设备传输:
从总体上说,虚拟设备向客户机开放了3个重要的交互接口:内存映射I/O(MMIO)、端口I/O(PIO)和直接存储器存取(DMA)。大多数设备遵循通用操作模式,首先通过MMIO对设备进行初始化,然后通过DMA完成复杂数据传输。通常直观的方法就是使用模糊测试技术将随机数据写入这些接口,但通过DMA传输的数据是高度嵌套的,这严重阻碍了传统的模糊测试扩展其代码覆盖率。
具体来说,设备规范中定义的数据结构通常采用树状结构,其中每个节点包含指向下一个节点的链接指针。某些DMA操作会从客户机的空间获取大量输入,并在输入结构中使用嵌套结构,即一个结构中的字段成员指向另一个结构。从随机模糊测试的角度来看,这种嵌套结构是很难构建的,因为它必须正确推测整个组织(层次嵌套模式)的语义和每个节点(即指向另一个节点的指针字段)的内部语义。
虚拟机一般工作流:在设备执行的初始阶段,客户机驱动程序通常会将数据写入MMIO或PIO区域,让设备完成一些初始化工作,例如设置设备状态和初始化针对客户机中预分配缓冲区的地址寄存器。初始化阶段完成后,设备将进入准备处理数据的状态。设备开始完成一些特定的工作(如传输USB数据和发送网络包)。上述数据处理阶段的主要交互机制是DMA,它支持设备向客户机传输大型和复杂的数据。由于数据处理部分是设备的主要功能,包含大多数代码路径,因此它比其他部分更有可能引入安全风险。
驱动程序与设备交互
作者首先证明了DMA在虚拟机管理器设备的广泛使用,对QEMU设备统计分析。证明DMA在虚拟机管理器中被广泛使用。
虚拟机管理器可用于客户机内存之间的传输数据,通过DMA和特定API,达到设备和驱动程序通信。比如在QEMU中有pci_dma_read
和pci_dma_write
,前者将数据块从客户机的内存复制到主机缓冲区中,后者将主机缓冲区的数据块写入客户机。
由于DMA机制传输的数据对象通常构造为嵌套结构(即结构A包含一个指向结构B的指针),这种特性对虚拟机管理器的模糊测试产生了影响。
虚拟机管理器处理嵌套结构的方式如下
1.从根节点开始,虚拟机管理器首先会获取一个指向数据结构A的指针
2.虚拟机管理器通过动态分配缓冲区来存储A的副本
3.虚拟机管理器使用pci_dma_read将A从客户机内存复制到已分配的缓冲区
4.根据A中的指针字段,即子节点B,虚拟机管理器分配另一个缓冲区来存储B的副本;虚拟机管理器再次执行pci_dma_read将B从客户机内存复制到已分配的缓冲区
5.根据B中的指针,虚拟机管理器再次执行pci_dma_read来复制下一个结构C
综上所述,虚拟机管理器以递归的方式遍历树状结构并向下移动,直至抵达终止节点,并在每个节点处储存了用户提供结构的副本。由于复杂的结构嵌套形式,传统的模糊测试方法就无法正确地对整个数据结构进行处理。
威胁模型
假设攻击者是一个对虚拟机之内的内存拥有完全访问权限的客户机用户,因此可向其设备发送任意数据。这种假设是合理的,因为在公有云场景中,每个用户对自己的虚拟机都享有root权限。如果虚拟机管理器不小心处理来自客户机用户的不可信数据,就会出现拒绝服务(DoS)、信息泄露或权限提升等安全问题。一旦攻击者利用虚拟机管理器中的漏洞进行虚拟机逃逸,就可以接管同一主机上的其他虚拟机,从而进一步访问存储在被利用虚拟机以外的敏感数据。
V-shuttle设计
从总体上说,V-SHUTTLE旨在将由覆盖率引导的模糊测试和静态分析技术相结合,形成一个可规模化、语义感知和轻量级的虚拟机管理器模糊测试框架。此外,为了应对模糊测试中与虚拟机管理器有关的特殊挑战,V-SHUTTLE设计了两种不同的方案。重定向与DMA相关的函数和通过种子池执行语义感知模糊测试。
利用集成到虚拟机管理器中的模糊测试代理将随机输入反馈送到虚拟设备(即模糊测试目标)中。模糊测试代理在虚拟机管理器中运行,持续向被测试的虚拟设备发送读/写请求。
作者首先重定向DMA数据的传输,将指针索引的DMA内存访问拦截并定位到我们可控的Fuzzing输入中,从而消除hypervisor对数据结构的寻址,以确保每个DMA请求都能获取到Fuzzing输入。然后,作者通过将不同DMA对象类型的结构组织到不同的类别中,并使用seedpool来维护这些不同类别的种子队列,从而执行细粒度语义感知Fuzzing。该方法能够为每个DMA请求都能提供语义有效的Fuzzing种子,这进一步提高了模糊化的效率。
实验结果
作者在16个QEMU设备上验证了V-SHUTTLE的可扩展性。实验结果表明V-SHUTTLE确实能有效提高代码覆盖率,具有规模化的优势,能够自动化探索hypervisor的深层代码,避免了根据文档构建测试用例的繁琐工作,覆盖率相较于state-of-the-art的Fuzzing工具有着明显提升。
此外,V-SHUTTLE也优于纯随机的Dumb Fuzzing以及结构化感知Fuzzing。
在漏洞挖掘方面,V-SHUTTLE在QEMU和VirtualBox中共找到了35个未知漏洞,其中17个授予了CVE编号。