编者按:2022年5月,由网络安全研究国际学术论坛(InForSec)汇编的《网络安全国际学术研究进展》一书正式出版。全书立足网络空间安全理论与实践前沿,主要介绍网络和系统安全领域华人学者在国际学术领域优秀的研究成果,内容覆盖创新研究方法及伦理问题、软件与系统安全、基于模糊测试的漏洞挖掘、网络安全和物联网安全等方向。全书汇总并邀请了近40篇近两年在网络安全国际顶级学术议上发表的论文(一作为华人),联系近百位作者对研究的内容及成果进行综述性的介绍。从即日起,我们将陆续分享《网络安全国际学术研究进展》的精彩内容。
本文发表于ACM CCS 2021,详细内容可参考论文原文“V-SHUTTLE: Scalable and Semantics-Aware Hypervisor Virtual Device Fuzzing”。
如今,云计算的使用越来越广泛,组织和个人用户倾向于将应用程序部署在云计算基础设施之上,以利用其快速和可规模化的部署能力。随着人们对云计算资源的需求不断增加, Amazon Web Services(AWS)、Microsoft Azure和阿里云等主要云服务提供商也在不断发展。然而,云计算的普及也导致了与云计算的软件和硬件堆栈相关的安全问题。Pwn2Own和天府杯等知名PWN赛事针对虚拟机管理器(包括VMware WorkStation/Esxi、QEMU/KVM和VirtualBox)都设置了对应的比赛项目。客户机使用的虚拟硬件设备是在现代虚拟机管理器中模拟的硬件外围设备,可为虚拟机提供附加功能。从攻击者的角度来看,虚拟设备允许攻击者从客户机系统向主机写入数据。这一特点使虚拟设备成为虚拟机管理器系统架构中最容易遭到侵入的攻击面。过去几年里,几乎所有针对虚拟机管理器的攻击都是从虚拟设备发起的。因此,为了避免向攻击者提前暴露漏洞,对虚拟设备代码执行安全审查是至关重要的。为此,我们需要采用高效和可规模化的技术来识别潜在的漏洞。
实践证明,模糊测试是发现现代软件缺陷和漏洞的有效方法。然而,根据我们的观察,在虚拟机管理器中应用模糊测试颇具挑战性,因为虚拟机管理器所固有的特殊属性会导致模糊测试效率低下。虚拟机管理器通常用于向客户机系统开放接口,以便客户机的用户驱动虚拟设备来模拟其行为。大多数设备遵循通用操作模式,即首先通过内存映射I/O(MMIO)初始化设备状态,然后通过DMA完成复杂的数据传输流程,如图1所示。通常直观的方法就是使用模糊测试技术将随机数据写入这些接口,但通过DMA传输的数据是高度嵌套的,这严重阻碍了传统的模糊测试扩展其代码覆盖率。具体来说,设备规范中定义的数据结构通常采用树状结构,其中每个节点包含指向下一个节点的链接指针。某些DMA操作会从客户机的空间获取大量输入,并在输入结构中使用嵌套结构,即一个结构中的字段成员指向另一个结构。从随机模糊测试的角度来看,这种嵌套结构是很难构建的,因为它必须正确推测整个组织(层次嵌套模式)的语义和每个节点(即指向另一个节点的指针字段)的内部语义。
鉴于虚拟机管理器的安全性至关重要,人们提出了多种用于检测虚拟机管理器漏洞的模糊测试工具。其中最先进的方法包括VDF、HYPER-CUBE和NYX。VDF是首个虚拟机管理器模糊测试框架,它利用AFL实现了覆盖率引导的虚拟机管理器模糊测试方法。HYPER-CUBE设计了一种基于自定义操作系统、与平台无关的多维度模糊测试方法。尽管HYPER-CUBE没有将由覆盖率引导的模糊测试技术应用到其模糊测试过程中,但由于其高吞吐量的设计特性,这种方法仍然优于VDF。然而,这两种方法都只遵循一个基本的思路:向基本接口(MMIO、DMA等)写入一系列随机值。然而,这两种方式并不了解虚拟设备的协议实现方式,即如何组织通过DMA传输的数据结构。NYX理解目标设备的协议,并基于用户提供的规范构建结构化模糊测试。然而,基于规范创建模板需要耗费大量人力。例如,NYX的作者花了大约两天时间来构建最复杂的规范。因此,NYX无法规模化测试不同类型的设备,因为它对每个新协议都需要人工定制策略。这也是结构化模糊测试方法所共有的缺点,它的有效性在很大程度上依赖于结构嵌套形式的完整性,而这种嵌套结构通常是基于开发人员对协议规范的理解进行手动编写的。一般情况下,开发人员需要从设备协议中提取所有类型的基本数据结构,包括基本结构之间的连接关系,以及每个数据结构中的指针偏移量。这种将结构化模糊测试应用到虚拟机管理器的劳动密集型流程不仅耗时,也十分容易出错。因此,现有的模糊测试方法无法对虚拟设备进行有效测试。
图1
为了应对这一挑战,我们提出了一种可规模化和语义感知的虚拟机管理器模糊测试框架——V-SHUTTLE。从总体上看,我们通过解耦嵌套结构和启用类型感知,实现了全自动的模糊测试方法。具体来说,我们首先拦截对DMA对象的每次访问,并将访问从指针重定向到我们所控制的模糊输入,以消除虚拟机管理器对数据结构的寻址,从而确保向每个DMA请求提供模糊数据。然后,我们将不同DMA对象类型的结构组织到不同的类别中,并使用种子池来维护这些不同类别的种子队列,以此执行细粒度的语义感知模糊测试。这种方法能够为每个DMA请求提供语义上有效的模糊数据,从而进一步提高模糊测试的效率。
我们基于著名的模糊测试工具AFL来实现V-SHUTTLE。我们首先通过在16台QEMU设备上运行实验来评估系统,并获取代码覆盖率。评估结果表明,V-SHUTTLE确实具有可规模化和自动化的特征,能够探索虚拟机管理器中的深度代码而无须人工构建基于规范的有效测试用例。此外,V-SHUTTLE甚至优于传统的结构感知模糊测试,这主要是因为人工理解规范的过程十分容易出错。同时,V-SHUTTLE的语义感知模糊测试模式也带来了实质性的改进。与最先进的虚拟机管理器模糊测试工具相比,V-SHUTTLE在大多数情况下能够获得比VDF、HYPER-CUBE和NYX更高的代码覆盖率。在查找漏洞的能力方面,V-SHUTTLE在两个常用的虚拟机管理器中挖掘了35个先前未知的漏洞,其中17个漏洞被授予了新的CVE。我们已经向对应的供应商报告了所发现的漏洞,并与他们合作修复这些漏洞。此外,我们还成功在蚂蚁集团部署了V-SHUTTLE,这进一步体现了该框架的可规模化特性。我们希望这一工具能够帮助开发人员强化虚拟机管理器的安全,从而实现更好的软件安全性。本文发表于ACM CCS 2021,详细内容可参考论文原文“V-SHUTTLE: Scalable and Semantics-Aware Hypervisor Virtual Device Fuzzing”。
本文的主要贡献如下。
■ 关于DMA的研究。我们系统分析了虚拟机事务中驱动程序与设备的交互,并探究了重点关注代码中DMA相关部分的原因。此外,我们揭示了通过DMA传输的数据结构具有嵌套特性,这将降低模糊测试的效率。
■ 模糊测试框架。我们提出了V-SHUTTLE的设计和实现,这是一个可规模化和语义感知的虚拟机管理器模糊测试框架,可以自动解耦嵌套结构并引导模糊测试探索难以触发的代码。据我们所知,V-SHUTTLE是首个对设备中的协议实现方式进行自动深入理解的虚拟机管理器模糊测试框架。
■ 发现的漏洞。作为评估的一部分,我们在两种使用最广泛的虚拟机管理器QEMU和VirtualBox中发现了35个先前未知的漏洞,其中17个漏洞被授予了CVE。我们负责任地向相应的供应商披露了相关细节。
■ 开源工具。我们将开放V-SHUTTLE的源代码在GitHub上,以进一步推动关于虚拟化安全的研究。
一、背景和动机
我们提供必要的背景信息,以便了解什么是虚拟机管理器的虚拟设备,以及驱动程序与设备的通信是如何处理的。然后,我们将详细阐述虚拟机管理器模糊测试面临的核心挑战。
1.虚拟机管理器的虚拟设备
客户机用户使用的虚拟设备是在现代虚拟机管理器中模拟的硬件外围设备,可为虚拟机提供附加功能。虚拟设备在虚拟客户机中发挥硬件的作用,这意味着客户机操作系统中的驱动程序可以像驱动实际设备一样驱动虚拟设备。现代虚拟机管理器可以对显卡、存储设备、网卡、USB等几乎所有硬件进行虚拟化。每台设备的协议规范为设备与操作系统之间的通信定义了唯一的寄存器级硬件接口。一般而言,虚拟化开发人员将基于这些规范设计虚拟设备。鉴于虚拟设备所具备的特性(虚拟设备的模拟是在主机级别进行,客户机可使用任意数据访问虚拟设备),它们通常是虚拟机管理器中最大的攻击面。
2.驱动程序与设备的交互
从总体上说,虚拟设备向客户机开放了3个重要的交互接口:内存映射I/O(MMIO)、端口I/O(PIO)和直接存储器存取(DMA)。图1显示了虚拟机事务的一般工作流。在设备执行的初始阶段,客户机驱动程序通常会将数据写入MMIO或PIO区域,让设备完成一些初始化工作,例如设置设备状态和初始化针对客户机中预分配缓冲区的地址寄存器。初始化阶段完成后,设备将进入准备处理数据的状态。设备开始完成一些特定的工作(如传输USB数据和发送网络包)。上述数据处理阶段的主要交互机制是DMA,它支持设备向客户机传输大型和复杂的数据。由于数据处理部分是设备的主要功能,包含大多数代码路径,因此它比其他部分更有可能引入安全风险。
为了证明DMA在虚拟机管理器虚拟设备中的广泛使用,我们对QEMU中支持DMA通信的设备百分比进行了统计分析。我们选择了虚拟化场景中最常见的5种QEMU设备类型(不包括某些杂项设备和后端设备)。我们手动分析设备中是否存在DMA传输机制。分析结果如表1所示,其中72.5%的设备支持DMA。除显示设备以外,几乎所有设备都必须使用DMA来传输复杂的数据结构(尤其是涉及存储和网络的设备)。由此可见,DMA在虚拟机管理器中得到了广泛地使用,这就要求我们在虚拟机管理器中应用模糊测试时更加关注与DMA相关的代码。
表1
3.核心挑战:嵌套结构
虚拟机管理器用于与客户机内存之间传输数据,以实现设备与驱动程序的通信。这种传输操作始终通过与DMA机制相关的特定API执行,如QEMU中的pci_dma_read和pci_dma_write。具体而言,pci_dma_read将数据块从客户机的内存复制到主机缓冲区,pci_dma_write则执行相反的程序。通过指定地址参数,这些DMA操作能够以客户机物理内存的任何位置为目标。
图2是通用主机控制器接口(UHCI)中嵌套结构的示例。这里的td、qh、buf表示3种不同类型的对象(td和qh表示包含元数据量的结构,buf表示原始数据)。
图2
我们观察发现,通过DMA机制传输的数据对象通常构造为嵌套结构(即结构A包含一个指向结构B的指针),而上面提到的pci_dma_read能够支持这一嵌套特性。更重要的是,这种嵌套特性可能表现为多层和多种类型,因为虚拟机管理器往往以从根节点开始的层次结构或树状结构来组织这些结构。具体来说,这种特性阻止了模糊测试工具对虚拟机管理器代码的探索,主要由于以下两个原因。
(1)嵌套形式构造。模糊测试技术难以构造含有多级数据或子对象的嵌套数据对象,这种操作的复杂程度不一。
■ 就整体上的组织方式而言,设备的数据结构可以像树一样表示为由嵌套节点组成的层次结构。节点表示特定数据块,指针则建立节点之间的关联。值得注意的是,树状结构的嵌套级别可能具有很深的深度,远不止一层。此外,这些树状结构可以被视为递归数据结构,因为一棵树可能会将其他树作为自己的元素。在树状结构中,一个节点会包含其所有后继节点组成的子树。随机模糊测试技术难以构造这样的递归数据结构,这需要具备更多关于设备规范的领域知识。
■ 在节点层面上,每个节点均可视为元数据和指针的组合。然而,节点中的指针偏移量是不确定的,并且会根据不同数据结构的定义而发生变化。给定一个节点作为变异输入时,由覆盖率引导的模糊测试工具会对整个节点进行变异,并且平等对待所有字段,这将生成指向无效或未映射分页的指针字段。与元数据不同的是,指针值通常是固定的且指向有意义的内容,其不应该被模糊测试引擎变异。这种节点层面上的语义缺乏也会增加构造嵌套结构的难度。因此,模糊测试工具必须理解数据组织方式的语义(即层次嵌套模式),并了解每个节点中的内部语义(即哪个字段是指针)。
(2)节点类型感知。由于设备支持规范定义的各种数据类型,因此必须了解关于嵌套节点的细粒度语义知识。嵌套结构是由不同类型的节点连接而成,每个节点都有一个或多个指向不同数据类型的指针。不同节点的连接关系是规则的,并且符合规范(即数据包描述符指向数据包正文),这就要求我们在节点之间建立正确的指向关系。此外,在很多情况下,明确的指向关系只有在运行时才能体现出来:某些字段用于指示指针所指向数据结构的确切类型,因为同一个指针可以引用多种类型的数据;某些字段则用于指示当前节点是否为终止节点。如果指针设置了终止位,则会假设当前节点及其所有子节点没有更多数据需要处理。因此,由模糊测试工具生成的任意节点的随机组合无法满足设备的语义要求,而停滞在数据处理的早期阶段,这严重限制了模糊测试工具寻找深层缺陷的能力。在节点层面上,模糊测试工具需要从给定节点中提取指针,并了解指针的语义(引用的节点类型)。
为了更好地说明虚拟机管理器是如何支持嵌套结构的,下文列举了一些关于虚拟机管理器处理嵌套结构的常见用例:
■ 从根节点开始,虚拟机管理器首先在客户机内存中获取一个指向数据结构A的指针(由地址寄存器指定);
■ 虚拟机管理器通过动态分配缓冲区来存储A的副本;
■ 虚拟机管理器使用pci_dma_read将A从客户机内存复制到已分配的缓冲区;
■ 根据A中的指针字段,即子节点B,虚拟机管理器分配另一个缓冲区来存储B的副本;虚拟机管理器再次执行pci_dma_read将B从客户机内存复制到已分配的缓冲区;
■ 根据B中的指针,虚拟机管理器再次执行pci_dma_read来复制下一个结构C。
综上所述,虚拟机管理器以递归的方式遍历树状结构并向下移动,直至抵达终止节点,并在每个节点处储存了用户提供结构的副本。
如果事先不了解如此复杂的结构嵌套形式,传统的模糊测试方法就无法正确地对整个数据结构进行处理,因为它很难找出每个对象背后复杂的数据格式。这种嵌套结构在虚拟机管理器的具体部署中大量使用,严重阻碍了传统测试方案扩展代码的覆盖率。我们以USB_UHCI为例来演示虚拟机管理器中的嵌套结构。
示例:USB-UHCI中的嵌套结构。通用主机控制器接口(UHCI)负责向现代虚拟机管理器中的客户机提供虚拟USB设备,这是英特尔针对USB 1.0制定的规范。图2显示了用于对传输至USB端点的USB数据包进行处理的简化函数uhci_process_frame。该函数在每个周期中定期执行,需要使用一个由设备地址寄存器进行初始指定(即s->frame_addr)的树状结构内存缓冲区。图2第16行,第一个实体被复制到所分配的虚拟机管理器缓冲区链接中。链接中的特定字段确定下一个引用节点的类型(TD或QH),这将间接影响到不同数据块的控制流。
■ 如果指示类型为QH(队列头),链接指向的数据结构将被复制到所分配的缓冲区qh(图2第21行)。
■ 如果指示类型为TD(传输描述符),链接指向的数据结构将被复制到所分配的缓冲区td(图2第25行)。然后按照特定大小(即td.len),对先前复制的缓冲区字段成员(即td.buffer)指向的内存进行复制(图2第27行)。执行USB事务(图2第29行)后,该函数在整个循环执行期间继续以递归方式进行树状结构遍历(图2第18行)。
这里需要注意的是,如果没有对于该数据结构嵌套形式的先验知识,就无法在两个方面对虚拟机管理器进行全面的测试。
■ 在抵达函数主要功能之前(图2第29行),可能会由于虚拟机管理器无法获取有意义的数据,导致函数执行因无效的内存访问而停止。
■ 难以在虚拟机管理器中触发用于处理递归结构的深层逻辑。由于程序状态会随着每次递归进行累积,如果模糊测试不能构建递归数据结构,我们就无法完全测试程序的行为。
处理嵌套结构有一种直观的方法就是结构感知模糊测试技术。此类技术要求开发人员创建能够精确理解设备规范文档的模型。基于模型的方法按照预定义规则生成相应类型的结构,并将它们串联起来。模糊测试技术将基于该模型列举出所有可能的结构嵌套形式,以验证虚拟机管理器的功能或发现缺陷。然而,结构感知的模糊测试工具存在明显的缺点,该流程不仅耗时也十分容易出错,因此,无法对虚拟机管理器测试进行规模化。协议规范通常包含数百页的内容,这需要耗费大量人力从中提取结构定义。人们在进行理解规范这种单调乏味的工作时往往会犯错误。此外由于开发人员也许会添加新的功能,实际实现的协议可能不会完全符合规范。因此,对虚拟机管理器执行大规模测试是不可能的。我们需要找到一种自动处理嵌套结构的方法。据我们所知,目前尚未有自动处理嵌套结构的方法,而这对于在虚拟机管理器中应用高效和可规模化的模糊测试来说至关重要。
二、V-SHUTTLE设计
本节介绍V-SHUTTLE的设计。从总体上说,V-SHUTTLE旨在将由覆盖率引导的模糊测试和静态分析技术相结合,形成一个可规模化、语义感知和轻量级的虚拟机管理器模糊测试框架。此外,为了应对模糊测试中与虚拟机管理器有关的特殊挑战,V-SHUTTLE设计了两种不同的方案。
■ 重定向与DMA相关的函数。
■ 通过种子池执行语义感知模糊测试。首先,我们将提供一个虚拟机安全的威胁模型;然后,我们将基于上述威胁模型来阐述模糊测试方法。
1.威胁模型
我们假设攻击者是一个对虚拟机之内的内存拥有完全访问权限的客户机用户,因此可向其设备发送任意数据。这种假设是合理的,因为在公有云场景中,每个用户对自己的虚拟机都享有root权限。如果虚拟机管理器不小心处理来自客户机用户的不可信数据,就会出现拒绝服务(DoS)、信息泄露或权限提升等安全问题。一旦攻击者利用虚拟机管理器中的漏洞进行虚拟机逃逸,就可以接管同一主机上的其他虚拟机,从而进一步访问存储在被利用虚拟机以外的敏感数据。
2.系统概览
图3显示了V-SHUTTLE的整体概览,它利用集成到虚拟机管理器中的模糊测试代理将随机输入反馈送到虚拟设备(即模糊测试目标)中。模糊测试代理在虚拟机管理器中运行,持续向被测试的虚拟设备发送读/写请求。
图3
(本文选取了文章部分章节,更多精彩内容请阅读《网络安全国际学术研究进展》一书。)
作者简介
潘高宁,浙江大学NesaLab博士研究生。他目前的主要研究方向是虚拟化安全与Fuzzing,相关研究成果已经发表在学术界顶级安全会议ACM CCS 和工业界顶级安全会议BlackHat Asia上,并多次获得来自Redhat和Oracle等厂商的致谢。
林性伟,蚂蚁安全光年实验室安全研究员。他的研究领域包括虚拟化安全、macOS&Windows系统安全,程序分析以及Fuzzing。他曾在学术界以及工业界顶级安全会议上发表论文与演讲,包括ACM CCS,USENIX Security和BlackHat Asia,获得过来自苹果、QEMU、微软和Oracle等厂商的致谢。
版权声明:本书由网络安全研究国际学术论坛(InForSec)汇编,人民邮电出版社出版,版权属于双方共有,并受法律保护。转载、摘编或利用其它方式使用本研究报告文字或者观点的,应注明来源。