hypervisor虚拟设备的安全分析和漏洞挖掘

admin 2022年4月2日08:43:54评论175 views字数 6118阅读20分23秒阅读模式
hypervisor虚拟设备的安全分析和漏洞挖掘


近⽇,浙江大学与蚂蚁集团联合论⽂《V-SHUTTLE: Scalable and Semantics-Aware Hypervisor Virtual Device Fuzzing》⼊选ACM CCS 2021。第⼀作者潘⾼宁在蚂蚁安全光年实验室主攻虚拟化研究方向。

hypervisor虚拟设备的安全分析和漏洞挖掘


随着云计算在企业中的⼴泛应⽤和部署,虚拟化开发⼈员和安全研究⼈员越来越关注云计算安全。云计算产品的核⼼组件是hypervisor,也称为虚拟机监视器(VMM),它可以在⼀台主机中隔离多个虚拟机。然⽽,hypervisor的漏洞可能导致虚拟机逃逸和权限提升,从⽽使得恶意⽤户获得在主机中执⾏代码的权限。其中,虚拟设备是hypervisor中最⼤的攻击⾯,其向客户机系统提供了⼤量通信接⼝⽤于事务交互。因此,hypervisor虚拟设备的安全分析和漏洞挖掘对于云计算安全⾄关重要。

然⽽,将Fuzzing技术应⽤于hypervisor虚拟设备是⼀项挑战,因为DMA传输的数据结构是根据协议规范以嵌套形式构建的。不理解虚拟设备的协议将使Fuzzing过程滞留在设备初始化阶段,导致Fuzzing效率低下。

在本⽂中,我们提出了⼀个可规模化和语义感知的Fuzzing框架V-SHUTTLE。为了应对上述挑战,我们⾸先设计了DMA重定向机制,以⼤幅减少重建虚拟设备协议结构所需的⼈⼒,并实现了模糊测试环境设置的⾃动化和可规模化。此外,我们还提出了⼀种新的模糊测试变异调度机制——种⼦池,它能够使虚拟设备的模糊测试过程具有语义感知能⼒,进⽽提⾼模糊测试过程的速度和提升代码覆盖率。我们对市⾯上最主流的两款虚拟化软件QEMU和VirtualBox进⾏了⼴泛的评估,结果表明,V-SHUTTLE可以有效对现有漏洞进⾏复现,并发现新的漏洞。我们通过使⽤V-SHUTTLE总共发现了35个新型漏洞,其中17个被授予了CVE编号。


01

背 景


1.1 虚拟设备


虚拟设备在虚拟客户机中发挥硬件的作⽤,这意味着客户机操作系统中的驱动程序可以像驱动实际设备⼀样驱动虚拟设备。现代hypervisor可以对显卡、存储设备、⽹卡、USB等⼏乎所有硬件进⾏虚拟化。每种设备的协议规范都为设备与操作系统之间的通信定义了唯⼀的寄存器级硬件接⼝。⼀般⽽⾔,虚拟化开发⼈员将基于这些规范设计虚拟设备。虚拟设备通常是hypervisor中最⼤的攻击⾯。


1.2 虚拟设备的交互流程


从总体上说,虚拟设备为客户机提供了三个主要的交互接⼝:MMIO、PIO和DMA。在设备执⾏的初始阶段,客户机驱动程序通常会将数据写⼊MMIO或PIO区域,让设备完成⼀些初始化⼯作,例如设置设备状态和初始化针对客户机中预分配缓冲区的地址寄存器。初始化阶段完成后,设备将进⼊准备处理数据的状态。设备开始完成⼀些特定的⼯作(例如,传输USB数据和发送⽹络包)。

上述数据处理阶段的主要交互机制是DMA,它⽀持设备向客户机传输⼤型和复杂的数据。由于数据处理部分是设备的主要功能,包含⼤多数代码路径,因此它⽐其他部分更有可能引⼊安全⻛险。从程序测试的⻆度来说,应该更多的关注DMA部分的代码。

hypervisor虚拟设备的安全分析和漏洞挖掘


02

核⼼挑战:嵌套结构


我们观察发现,通过DMA机制传输的数据对象通常构造为嵌套结构(即结构A包含⼀个指向结构B的指针)。更重要的是,这种嵌套特性可能表现为多层和多种类型,因为hypervisor往往以树状结构来组织这类数据。具体表现在以下两个⽅⾯: 

1) 嵌套形式构造。模糊测试技术难以构造含有多级数据或⼦对象的嵌套数据对象,这种操作的复杂程度不⼀。整体层⾯上,设备的数据结构可以像树⼀样表示为由嵌套节点组成的层次结构。节点层⾯上,每个节点均可视为元数据和指针的组合。然⽽,节点中的指针偏移量是不确定的,并且会根据不同数据结构的定义⽽发⽣变化。 

2) 节点类型感知。嵌套结构是由不同类型的节点链接⽽成。每个节点都有⼀个或多个指向不同数据类型的指针。不同节点的连接关系是规则的,并且符合规范(即数据包描述符指向数据包正⽂),这就要求我们在节点之间建⽴正确的指向关系。此外,在很多情况下,指向关系是动态的:某些字段⽤于指示指针所指向数据结构的确切类型,因为同⼀个指针可以引⽤多种类型的数据。

hypervisor虚拟设备的安全分析和漏洞挖掘

上图是处理嵌套结构的⼀个例⼦,以USB UHCI为例。16⾏DMA根据地址寄存器指定的guest物理地址读取数据结构link。link中的特定字段决定下⼀个node的类型(TD或QH)。(1) 如果为QH,link指针指向的数据结构将被复制到所分配的缓冲区qh(第21⾏)。(2) 如果为TD,link指针指向的数据结构将被复制到所分配的缓冲区td(第25⾏)。然后按照特定⼤⼩(即td.len),对先前复制的缓冲区字段成员(即td.buffer)指向的内存进⾏拷⻉(第27⾏)。执⾏USB事务后,该函数将继续遍历树状递归结构以处理后续事务。

如果没有对于该数据结构嵌套形式的先验知识,就⽆法对hypervisor进⾏全⾯的测试:(1) 在抵达函数主要功能之前(第29⾏),可能会由于虚拟机管理器⽆法获取有意义的数据,导致函数执⾏因⽆效的内存访问⽽停⽌。(2) 难以在hypervisor中触发⽤于处理递归结构的深层逻辑。

解决嵌套结构最直观的⽅法就是采⽤结构化变异模糊测试。这种⽅法要求测试⼈员精确的理解设备规范⽂档,这种过程不仅耗时也⼗分容易出错,因此我们需要找到⼀种⾃动处理嵌套结构的⽅法。据我们所知,⽬前尚未有⾃动处理嵌套结构的⽅法,⽽这对于在hypervisor的模糊测试来说是⾄关重要。


03

设 计


本章节将详细介绍V-SHUTTLE框架的设计与实现细节。


3.1 系统架构

hypervisor虚拟设备的安全分析和漏洞挖掘

上图展示了V-SHUTTLE的整体架构。Fuzzer位于hypervisor之外。我们还利⽤了persistent mode来⽀持持久化Fuzzing,这意味着我们不必为每个新输⼊重新启动新的实例,节省虚拟机重启以及进程fork的开销。Fuzzing agent在hypervisor中运⾏,管理DMA/MMIO的回调上下⽂,并持续向被测试的虚拟设备发送读/写请求以驱动Fuzzing Loop。


3.2 DMA重定向


V-SHUTTLE设计了⼀种通⽤的DMA重定向⽅法,通过拦截设备对客户机内存的访问来实现嵌套结构平坦化。具体来说,我们将所有与DMA相关的API都将被替换成从⽂件中读取数据的函数。

这样⼀来,在模糊测试期间,所有内存读取均可重定向到基于⽂件的模糊测试输⼊。如下代码总结了DMA重定向的简化伪代码。通过这种⽅式,我们就不再需要执⾏DMA寻址操作。鉴于我们对DMA机制拥有完全控制权,所以⽆论指针指向何处,甚⾄0地址,我们都能对任何DMA请求给出⼀个由覆盖率引导的Fuzzing⼯具⽣成的测试⽤例。

// 重定向前pci_dma_read(dev, buffer_addr, &buf, size);
// 重定向后if (fuzzing_mode)read_from_testcase(&buf, size);

左右滑动查看完整代码

下图以图形⽅式显示了基于DMA重定向的平坦数据结构。这种⽅法将所有嵌套结构转换为⼀维向量,同时保持嵌套结构的语义,这样通过重定向DMA便可以使Fuzzing达到所有底层代码块。对于每次Fuzzing迭代,模糊测试⼯具引擎将⾸先⽣成变异的DMA数据序列。然后设备开始进⾏树状结构遍历,其中每个DMA请求将被重定向到Fuzzing输⼊,按顺序从DMA序列中获取⼀个数据块。这样⼀来,所有设备就能够进⾏平滑地覆盖包含DMA请求的代码路径,⽽不是停滞在⽆法从客户机内存中获取任何数据的状态。

hypervisor虚拟设备的安全分析和漏洞挖掘

DMA重定向是⼀种仅将嵌套数据扁平化⽽不影响结构语义的⽅法,它消除了对更⾼级别树状结构(如图2所示)的需求。我们取消了每个节点中的指针,但仍然保留了每个节点隐含的指向依赖信息,因此不会破坏设备的正常执⾏。

得益于这种设计,V-SHUTTLE不依赖指针来寻址数据,⽽是从模糊输⼊中直接获取数据。V-SHUTTLE将数据结构所有成员都视为⼀串metadata,⽽不关注其中的指针项。在较⾼级别的树状结构中,每个节点的内容都是随机⽣成的,包括指针字段。这种设计可以让模糊测试流程完全⾃动地测试需要嵌套结构且难以触发的路径,⽽⽆需任何⽤户协助。与最先进的⽅法相⽐,我们的⽅法是完全可规模化的,并且⽆需具备任何领域知识,这有助于进⼀步提⾼可扩展性。


3.3 基于种⼦池的语义感知Fuzzing


通过上述DMA重定向⽅法使得嵌套结构扁平化,这能够使Fuzzing流程⾃动化。然⽽,这种直接的⽅法在组织DMA序列时并未考虑节点类型,存在效率低下的问题。如2(2)所述,嵌套结构中的节点类型是不断变化的,这意味着程序的控制流会根据先前使⽤的DMA测试⽤例⽽发⽣动态变化。

然⽽,上述⽅法只是将DMA数据按顺序组织成⼀维向量,并没有对每个节点的类型进⾏分类。由于DMA请求的组合序列在不同的模糊测试迭代中存在显著差异,对节点序列进⾏单纯的串联会导致失去每个节点内部的语义。

假设hypervisor在当前迭代中⾸先请求数据结构A,然后请求数据结构B。这会导致由覆盖率引导的Fuzzing⽣成语义接近于A和B组合序列的种⼦。然⽽,如果在下⼀次迭代中hypervisor⾸先请求数据结构A,然后请求数据结构C,则执⾏流将顺利通过含A的路径,但却⽆法通过含C的路径。其中Fuzzing⽣成的结构B将被hypervisor拒绝,因为结构B在语义上对所请求的结构C是⽆效的。这种没有明确反馈指导的不确定性过程会使由覆盖率引导的模糊测试退化为不知道数据演变⽅向的盲模糊测试。

为了,V-SHUTTLE⾸先使⽤改进的DMA重定向⽅法将嵌套结构解耦到独⽴节点中。通过基于seedpool的模糊测试引擎来维护多个种⼦队列,每个种⼦队列对应⼀种类型的解耦节点。在类型指导下,V-SHUTTLE对虚拟机管理器执⾏语义感知模糊测试。具体各个步骤如下:

1) ⽤于标记DMA对象的静态分析。因此,我们将DMA对象定义为通过DMA保存客户机数据副本的宿主机结构。每个DMA对象表示唯⼀的节点类型。为了标记所有DMA对象,V-SHUTTLE将对hypervisor的源代码执⾏live variable analysis。我们将DMA操作的主机缓冲区字段(例如pci_dma_read及其包装函数)作为源,从源到其声明或定义(DMA对象)执⾏反向数据流分析收集所有DMA对象后,我们为每个对象分配唯⼀ID。

// 重定向前pci_dma_read(dev, buffer_addr, &buf, size);
// 重定向后if (fuzzing_mode)read_from_testcase(&buf, size, type_id);

左右滑动查看完整代码

2) 含类型约束的DMA重定向。根据标记对象,V-SHUTTLE现在拿到了DMA传输的特定节点类型。基于之前的DMA重定向,V-SHUTTLE在将DMA传输转换为从模糊输⼊进⾏读取时,引⼊了额外的类型约束。通过额外的类型约束,V-SHUTTLE能够确保每次内存读取都会根据节点类型从特定的种⼦队列(⽽不是有序的DMA队列)中获取数据。V-SHUTTLE利⽤这种⽅式将嵌套结构解耦到单个节点中,并根据节点类型对其进⾏分类,如下图所示。

hypervisor虚拟设备的安全分析和漏洞挖掘

3) 基于seedpool的Fuzzing设计。为了处理多对象输⼊,我们对AFL进⾏扩展,以⽀持并⾏的多个种⼦队列。我们将这样的多个并⾏队列称为seedpool。seedpool可以让Fuzzing可以根据每种程序输⼊类型对每个种⼦队列执⾏变异。通过覆盖率反馈,Fuzzing可以快速学习设备的结构和模式,针对每种类型的对象⽣成定制的输⼊。即使程序会在执⾏流中以动态的⽅式尝试采⽤不同类型的数据作为输⼊,Fuzzing也可以提供来⾃相应种⼦队列的语义上有效的输⼊。这种基于种⼦池的⽅法重新利⽤了现有的由覆盖率引导的模糊测试算法,并引⼊了并⾏性。所有基本种⼦队列都被视作平等,彼此独⽴,并采⽤相同的变异策略(确定性阶段、破坏阶段等)。依照这种分离的组织⽅式,每个种⼦队列将利⽤由覆盖率引导的模糊测试⼯具的⾃学能⼒,最终进化出适合其所对应类型输⼊的模式。

4) 语义感知Fuzzing流程。V-SHUTTLE结合运⾏时类型感知和基于seedpool的Fuzzing引擎,对hypervisor执⾏语义感知的Fuzzing。包括四个主要步骤:(1) V-SHUTTLE建⽴所有基本种⼦队列,并初始化全局覆盖bitmap。(2) V-SHUTTLE通过阻塞等待来⾃hypervisor的具体数据类型的DMA请求。(3) V-SHUTTLE从相应的种⼦队列中选择种⼦,并对其进⾏变异,以⽣成新的候选种⼦。(4) V-SHUTTLE向⽬标程序提供新的候选种⼦,并跟踪覆盖率信息。如果候选种⼦探索了新的覆盖范围,则将被视为有趣种⼦,并被加⼊所属的种⼦队列。经过算法收敛,我们就能够为每种类型的DMA对象提供语义上有效的输⼊,从⽽提⾼Fuzzing的整体效率。


04

实验结果


4.1 覆盖率


我们依据社区普及程度、开发的活跃程度和类别多样性选择了16款QEMU设备并验证了V-SHUTTLE,实验结果表明V-SHUTTLE确实能有效提⾼代码覆盖率,具有规模化的优势,能够⾃动化探索hypervisor的深层代码,避免了根据⽂档构建测试⽤例的繁琐⼯作。其中下表显示相较于state-of-the-art的Fuzzing⼯具(VDF、 Hyper-Cube,Nyx),V-SHUTTLE有着明显提升。

hypervisor虚拟设备的安全分析和漏洞挖掘


4.2 有效性


此外,V-SHUTTLE也优于纯随机的Dumb Fuzzing以及结构化感知Fuzzing,其主要是因为⼿动理解规范的过程是不完备且容易出错的,⽽V-SHUTTLE能很好的规避掉DMA寻址过程且不需要构造嵌套结构。同时,V- SHUTTLE的语义感知模糊模式也带来了实质性的改进,能够相较于⾮语义感知模式能快收敛,学习出嵌套结构中每⼀个节点的语义。

hypervisor虚拟设备的安全分析和漏洞挖掘


4.3 漏洞挖掘产出


在漏洞挖掘⽅⾯,V-SHUTTLE在QEMU和VirtualBox中共找到了35个未知漏洞,其中17个授予了CVE编号, 其中不乏有能够exploit完成虚拟机逃逸的⾼危漏洞同时该⼯具已成功在蚂蚁云落地部署,证明该⼯具在实际⼯业环境中的实⽤性。

hypervisor虚拟设备的安全分析和漏洞挖掘


05

总 结


V-SHUTTLE基于语义感知DMA重定向的技术实现了hypervisor⾃动漏洞挖掘框架。V-SHUTTLE的有效性和⾼效性通过⼴泛的评估得到了证实。总共发现了QEMU中的26个新内存缺陷和VirtualBox中的9个新缺陷,其中17个缺陷获得了官⽅CVE。此外,我们也在蚂蚁云商业平台上部署了V-SHUTTLE,进⼀步证明了V- SHUTTLE的优越性。为了促进未来的相关研究,我们将在 https://github.com/hustdebug/V-SHUTTLE 开放源代码。


原文始发于微信公众号(蚂蚁安全响应中心):hypervisor虚拟设备的安全分析和漏洞挖掘

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月2日08:43:54
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   hypervisor虚拟设备的安全分析和漏洞挖掘http://cn-sec.com/archives/582107.html

发表评论

匿名网友 填写信息