一种针对云计算系统虚拟设备的模糊测试方法及系统与流程

文档序号:18901318发布日期:2019-10-18 21:58阅读:290来源:国知局
一种针对云计算系统虚拟设备的模糊测试方法及系统与流程

本发明涉及计算机系统安全领域,用于检测云计算系统虚拟设备中存在的安全漏洞,更具体地,是一种针对云计算系统虚拟设备的模糊测试方法及系统。



背景技术:

随着全球云计算市场份额的持续增长,作为云计算的基础,虚拟化技术得到了广泛的应用,同时,不可避免带来了很多安全问题,利用虚拟化平台漏洞进行攻击的恶意行为层出不穷。虚拟设备作为虚拟化平台的一个重要组成部分,是虚拟化平台安全威胁的主要来源之一。利用虚拟设备的漏洞可以在目标云计算系统中发起逃逸攻击或拒绝服务攻击,从而影响云计算系统的正常安全运行。

虚拟设备主要运行在用户层,虚拟设备代码相比客户机系统,其执行权限更高,更接近于虚拟机管理程序。相比从客户层的客户机系统里测试虚拟机管理程序,利用虚拟设备的漏洞,从用户层渗透测试虚拟机管理程序更加直接。虚拟设备由很多开发者共同开发和维护,而且虚拟设备种类很多,虚拟设备代码体量庞大,每年都在增长,虚拟设备存在漏洞的概率很大。随着openstack成为众多行业构建云基础架构的首选,而openstack的重要组成部分—kvm计算资源虚拟化技术也随着openstack的普及而应用得越来越广泛。而且由于kvm和xen的超级管理程序都使用qemu来实现硬件设备的功能模拟,所以我们选取qemu虚拟设备作为测试目标。

测试虚拟设备存在困难和挑战,这与虚拟设备的特点相关。第一,虚拟设备是多状态的。在测试虚拟设备之前,虚拟设备需要先达到已知的设备初始化状态。虚拟设备与虚拟机管理程序交互,在不同的输入条件下呈现不同的设备状态。虚拟设备的异常往往需要在特定的设备状态下才能成功触发。大部分的测试工具可以直接针对用户层的程序输入接口进行测试,但是它们不能直接用来测试虚拟设备,必须要考虑到设备状态。第二,虚拟设备种类多,接口多。虚拟设备包括网卡、显卡、声卡、输入设备、存储设备等,不同的设备寄存器地址范围不同、设备读写类型不同。测试用例的生成需要考虑不同设备的输入结构和输入约束范围。

目前,测试虚拟设备的思路在设备的初始化、设备的测试、测试用例生成方面存在许多问题。首先,在一个完整的操作系统中,pci总线的初始化和设备的初始化通常是在bios系统自启动和引导过程中来完成的。另外,通过利用虚拟机快照的方式也是实现设备的初始化的一个解决方案。但是无论是通过bios系统引导的方式还是通过虚拟机快照的方式,设备的初始化过程都相当耗时,并不能有效地实现大规模测试。其次,基于现有的虚拟设备的测试方法,我们发现大部分虚拟设备测试方法都是通过测试客户端向测试服务器发送i/o序列来实现测试的。测试客户端和测试服务器之间交互通过进程间的通信或串口通信来实现的。使用进程间的通信,数据解析和传输都需要时间,测试速度相对直接测试来说较慢,而且一旦目标程序挂起,测试驱动会进入等待状态,无法立即检测设备的挂起状态。最后,大部分模糊测试工具对代码格式没有感知,采取一种盲目变异的方式。它们主要依靠产生大量的变异输入来发现新的基本块。这种盲目的变异策略导致测试速度很慢,而且深入发现执行路径具有偶然性。



技术实现要素:

为解决上述问题,本发明提供一种针对云计算系统虚拟设备的模糊测试方法及系统,解决现有的测试方法在设备初始化、设备测试用例生成、测试用例的重放三个方面的不足,提出了一种有效的,大规模的,目标可感知的模糊测试方案,能够很大程度上提升测试的效率,缓解当前针对云平台进行渗透测试存在的门槛高、测试效率低的问题。

为达到上述目的,本发明采用具体技术方案是:

一种针对云计算系统虚拟设备的模糊测试方法,包括以下步骤:

(1)遍历目标虚拟设备的系统函数列表,正则匹配目标虚拟设备的回调函数接口。

(2)静态分析回调函数接口,提取地址偏移参数的约束取值范围。

(3)依据地址偏移参数的约束取值范围和目标虚拟设备的测试用例输入数据结构,生成测试用例。

(4)插桩目标虚拟设备的qemu的qtest执行引擎,驱动pci总线初始化,获取pci总线的初始化序列。

(5)插桩目标虚拟设备的回调函数接口,指定目标虚拟设备模型并启动客户机,获取启动客户机系统时指定的目标虚拟设备的内存寄存器的初始化序列。

(6)以步骤(3)生成的测试用例为种子数据,对目标虚拟设备的qemu进程进行测试,qemu进程重放步骤(4)和步骤(5)获取的初始化序列,使设备达到初始化状态,然后重放测试用例。系统获得被选择性插桩的目标虚拟设备代码分支的覆盖信息,并基于覆盖信息的反馈变异种子数据生成新的测试用例。系统启动新的qemu进程,重放新的测试用例。

(7)测试进程监控qemu进程,一旦qemu进程产生异常,记录产生异常的测试用例,然后测试用例最小化进程缩减导致崩溃的测试用例,并自动生成poc(proofofconcept,为观点提供证据)程序代码来验证系统发现的异常。

一种针对云计算系统虚拟设备的模糊测试系统,包括:虚拟设备测试用例生成模块;虚拟设备初始化模块;虚拟设备测试模块;测试用例最小化模块;测试覆盖信息实时显示模块。

1、虚拟设备测试用例生成模块,用于自动生成目标虚拟设备的测试用例。该模块通过对目标虚拟设备的代码进行感知,获取目标虚拟设备的回调函数接口信息,并依据目标虚拟设备的测试用例输入数据结构自动生成测试用例。

2、虚拟设备初始化模块,用于初始化目标虚拟设备状态。设备的初始化序列,实质上是一系列mmio/pmio操作,该模块首先插桩获取pci总线的初始化序列和内存寄存器的初始化序列,并通过重放初始化序列实现在不启动操作系统和快照情况下,有效且快速实现虚拟设备状态的初始化。

3、虚拟设备测试模块,用于对目标虚拟设备进行模糊测试。当种子数据传递给虚拟设备测试模块后,系统重放设备初始化序列,然后执行种子数据。系统获得被选择性插桩的目标虚拟设备代码分支的覆盖信息,并基于覆盖信息的反馈变异种子数据生成新的测试用例。系统启动新的qemu进程,重放新的测试用例,并对qemu进程进行监控。如果qemu进程挂起或者产生崩溃,则将造成qemu进程异常的测试用例保存,最小化测试用例,并生成可用的poc程序代码来验证系统发现的异常

4、测试用例最小化模块,用于实现测试用例的最小化,自动生成poc代码。一旦系统检测出虚拟设备的异常,就会将造成目标异常的测试用例保存下来。保存的测试用例中包含很多元数据,但是大部分元数据对于重现漏洞异常没有帮助。为了能够简化对异常的分析,同时也为了能够自动生成poc代码,需要对测试用例进行最小化。。

5、测试覆盖信息实时显示模块,用于实时显示测试覆盖信息,给系统的测试效果直观有效的监测。该模块显示代码分支的代码覆盖率,使测试样本队列中的代码覆盖信息在网页上高亮显示。主要的功能包括:显示函数、代码分支、代码覆盖率;区分显示测试目标的代码覆盖情况;显示代码分支的执行次数;显示未被覆盖的函数接口。

与现有的云计算系统虚拟设备的测试技术相比较,本发明具有以下几点优势:

1、无论是通过启动bios系统或者实现快照的方式,设备的初始化过程都比较耗时。本发明可以在不启动bios系统或者快照的情况下,有效且快速实现pci设备的初始化。

2、大部分测试工具对代码无感知,盲目变异。本发明可感知设备输入接口,自动生成测试用例,覆盖更多代码分支。

3、现有的测试方法使用测试驱动通过ipc通信或串口通信的方式传输种子数据,耗时且无法检测目标挂起状态。本发明通过构造qemu模糊测试执行引擎,重放初始化序列,并直接读取设备输入文件,实现大规模的自动化的测试。

本发明的目的是为了主动防御云计算系统的安全威胁,及时发现云计算系统中存在的安全漏洞,避免或降低不必要的损失。本发明的有益效果在于:针对kvm/qemu虚拟化平台的虚拟设备,本发明实现了有效的、大规模的、目标可感知的模糊测试系统。

附图说明

图1是本发明一实施例中云计算系统虚拟设备的模糊测试系统架构示意图。

图2是本发明—实施例中虚拟设备测试用例元数据头和元数据字段设计示意图。

图3是本发明一实施例中虚拟设备测试用例生成流程图。

图4是本发明一实施例中虚拟设备初始化流程图。

图5是本发明—实施例中虚拟设备测试用例重放示意图。

图6是本发明一实施例中虚拟设备测试流程图。

图7是本发明一实施例中选择性插桩编译示意图。

图8是本发明一实施例中测试用例最小化模块示意图。

图9是本发明一实施例中测试覆盖信息实时显示模块示意图。

具体实施方式

为了使本技术领域的人员更好地理解本发明中的技术方案,并使本发明的目的、特征和优点能够更加明显易懂,下面结合附图和实施例对本发明中技术核心作进一步详细的说明。

在本实施例中,设计了一套有效的、大规模的、目标可感知的模糊测试系统,能够有效解决现有技术所存在的问题。

如图1所示,是云计算系统虚拟设备的模糊测试系统架构示意图。测试框架主要由五个功能模块组成,包括测试用例生成模块、虚拟设备初始化模块、虚拟设备测试模块、测试用例最小化模块以及测试覆盖信息实时显示模块。测试的流程主要分为如下3个步骤:

第1步,测试用例生成模块通过静态的程序分析的方法来生成测试用例,然后将生成的测试用例作为种子数据传递给虚拟设备测试模块;

第2步,在每次测试之前,通过虚拟设备初始化模块生成初始化序列,使设备快速达到已知的初始化状态;

第3步,在测试的过程中,虚拟设备测试模块启动qemu进程,重放设备的测试用例,并对qemu进程的状态进行监控。

如图2所示,是虚拟设备测试用例元数据头和元数据字段设计示意图。系统的测试用例可能包含多个i/o元测试数据,构成一个测试序列。i/o元测试数据的数据结构包含三个字段域(field):元数据头(header)、寄存器地址偏移(offset)、寄存器值(value)。为了让元数据更加的紧凑,从而使系统在测试过程中减少测试用例无用的字节的变异,需要根据设备的类型和寄存器的类型设计元数据的字段域的大小。

元数据头字段域的大小仅仅只有1个字节,元数据头字段域的第1个比特位是读写位(r/w),第2~4个比特位表示寄存器值的大小(regsize),第5~7个比特位表示寄存器组类型(regtype),最后1个比特位表示设备输入输出映射类型,即mmio/pio,其中mmio为内存映射i/o,pio为端口映射i/o。寄存器地址偏移字段域的大小与设备的寄存器组的地址范围有关,不同设备的寄存器组的地址范围不同。寄存器值字段域大小范围是1~4字节,大部分设备,比如网卡设备、显卡设备以及多媒体设备等设备的寄存器类型是32bit的,寄存器值字段域应该设置为4个字节大小。还有少部分设备比如软盘设备的寄存器类型是8bit的,寄存器值字段域应该设置为单个字节大小。寄存器值字段域当且仅当元数据头字段域的第1个bit位标记为写时才有效。

如图3所示,是虚拟设备测试用例生成流程图。系统静态分析设备代码,自动识别设备接口,提取设备读写接口中的地址偏移参数约束值和参数类型。然后系统根据生成的约束条件生成设备测试说明文件,并依据测试说明文件,合成设备读写序列,将序列提供给系统测试模块,执行测试。

由于设备的回调函数接口的命名有一定的规律可循,那么给定一个设备名称,我们可以使用正则匹配来识别设备的回调函数接口。正则匹配的规则:"[a-z]*_(mem|ioport|mmio)|(write)_((writeb)|(writew)|(writel)|(write)|(readb)|(readw)|(readl)|(read))"。

大部分设备代码判断寄存器地址偏移是通过switch语句实现的,可以通过对switch语句进行分析,提取switch语句中的case值,获取所有可能的地址偏移值。本发明使用静态分析工具ida对qemu二进制执行文件进行静态分析,并基于idapython实现了对switch语句中的地址偏移值约束进行提取。

如图4所示,是虚拟设备初始化流程图。在每次执行种子数据之前可以通过重放设备初始化序列,使虚拟设备快速达到已知的初始化状态。为了完成pci设备的初始化序列的收集,该框架首先需要对qemu的qtest执行引擎的内存地址读写函数进行插桩(图4中(a)图),插桩的代码主要用来记录pci基地址寄存器的读写序列,通过重放这些序列可以实现pci总线的初始化。pci设备的初始化不仅包括pci总线的初始化,还包括设备驱动的初始化。在启动qemu客户机的时候,也可以通过插桩qemu的设备回调函数的程序代码来记录设备驱动的初始化过程(图4中(b)图)。对于isa设备,isa设备的初始化过程只需要关注设备驱动的初始化。

如图5所示,是虚拟设备测试用例重放示意图。基于qtest测试框架,本发明设计了qemu模糊测试执行引擎,通过修改qtest执行引擎的代码,消除了测试驱动与测试执行引擎之间的ipc通信过程,并将它们的功能结合起来。新构造的模糊测试执行引擎可以直接读取测试数据,实现种子数据的重放。首先通过afl(americanfuzzlop,一种模糊测试工具)测试进程(即afl-fuzz进程)启动qemu进程,然后,qemu进程中的模糊测试执行引擎依次执行初始化集和种子集中的数据,分别实现设备的初始化和设备测试用例的重放。通过对目标设备的内存或i/o地址空间进行读写,来完成对目标设备(nic、scsi等)代码的测试。

原来的qtest测试驱动与qemu进程交互过程中,产生的种子序列中可能包含时间戳。时间戳保证种子数据的重放在正确的时间间隔内发生。但是这些时间戳不能被变异。根据实验观察,每隔一个固定的虚拟时间例如10毫秒执行种子数据的读写比较合适。可以调用qemu原生提供的apis中的qtest_clock_step()接口来实现固定的虚拟时间间隔。

为了实现自动化的模糊测试,本发明使用afl来驱动qemu进程。qemu的二进制程序原本不能将文件作为程序的输入,为了方便自动化测试,在qemu源文件qemu-options.hx中添加获取种子数据文件的“-fin”选项,同时修改vl.c文件,增加“-fin”选项的参数解析代码,用来识别输入的种子数据文件路径。

如图6所示,是虚拟设备测试流程图。为了实现虚拟设备的测试用例自动重放,需要测试进程来循环驱动虚拟设备模糊测试执行引擎的执行。当种子数据传递给虚拟设备测试执行引擎后,系统首先重放设备初始化序列,使设备首先达到初始化状态。然后执行种子数据,重放测试用例。系统根据目标设备代码反馈的信息,指导测试用例的变异和生成。测试进程会循环启动新的qemu进程,新的qemu进程将重放测试用例队列中的测试用例。测试进程对qemu进程进行监控,如果qemu进程挂起或者产生崩溃,则将造成qemu进程异常的测试用例保存。最后通过最小化测试用例进程对保存的测试用例进行缩减,并依据最小化的测试用例生成可用的poc程序代码来重现漏洞。

如图7所示,是选择性插桩编译示意图。在测试之前,系统需要对目标二进制代码进行插桩。但是,系统只关心虚拟设备代码的部分,而不是整个qemu系统代码。如果对整个qemu系统代码进行插桩,qemu的其他组成部分包括qemu的初始化,二进制翻译等模块的代码覆盖会指导产生很多设备无关的测试用例,这样不仅会降低模糊测试的性能包括时间和内存上的消耗,而且会产生很多与设备无关的异常。图7中,afl-gcc表示模糊测试系统编译器,afl-as表示模糊测试系统的汇编器,as表示linux系统下常用的汇编器。

在afl编译时,afl-gcc会指定编译参数,包括通过“-b”选项指定汇编器的路径,并用gcc将源代码编译成汇编代码。然后,指定的afl-as会解析汇编代码的分支指令,并在分支处插入桩代码,并最终再调用as进行真正的汇编。

通过控制“-b”选项,决定汇编器的路径来实现选择性插桩,如果汇编器的路径指定的是afl-as,会对目标代码文件进行插桩;如果汇编器的路径指定的是as,则会调用原生的汇编器直接汇编,不会进行插桩。另一种方案是,通过实现选择性编译,来实现选择性插桩。在qemu编译文件中,对与设备代码相关的源程序,调用afl-gcc来编译;否则,调用gcc来编译源程序。

如图8所示,是测试用例最小化模块示意图。虚拟设备测试用例实质上都是由读写序列组成。系统将测试用例依次等划分为序列块,第一轮按照划分的序列块依次缩减测试用例,若缩减后的测试用例依然可以造成虚拟机崩溃或者挂起,则表示此次序列块缩减有效,修改该序列块的序列标志位为1;若无效,暂时保留该序列块,修改该序列块的序列标志位为0。第二轮,系统将保留的序列块再依次等划分为较小的序列块,并按照较小序列块逐步缩减测试用例。依次类推,直至按照单个序列缩减测试用例得到最小的测试用例。基于设计的测试用例最小化算法,将网卡设备pcnet的测试用例从120kb大小缩减到仅仅只有104byte。执行缩减后的测试用例依然可以使目标产生异常,且产生的异常状态与缩减前基本一致。

如图9所示,测试覆盖信息实时显示模块。测试覆盖信息实时显示功能主要依赖于gcov和lcov工具实现。gcov是一个测试代码覆盖率的工具,lcov是gcov的图形化前端工具。gcc编译器在编译程序时,如果添加上-fprofile-arcs和-ftest-coverage,会产生对应的.gcno文件。这两个参数分别告诉gcc编译器:(a)在目标文件中插桩跟踪代码;(b)产生gcov需要的.gcno文件,.gcno文件中含有重建基本块依赖图和将源码关联至基本块及源代码行号的必要信息。执行可执行文件后,会产生.gcda文件,里面存放基本块之间的跳转信息,gcov利用该文件与.gcno文件计算出每个基本块的执行次数,从而来得到各行、分支、函数的覆盖次数,并以文本格式存放至.gcov文件中。而lcov会收集.gcda文件中的信息,写入.info文件,其中包括测试用例名称,源代码文件名,函数、分支所在行号,代码有效行数,执行的次数等等测试信息。

实验主要针对kvm/qemu中的14个虚拟设备来对系统进行评估,首先依据设备代码自动生成测试用例,然后分配给各个测试进程。经过2个月时间的测试,目前已发现5029个崩溃和1018,经过验证,其中包含12个漏洞,10个1day漏洞和2个0day漏洞。

从表1的虚拟设备测试结果中看出,系统可以测试的设备分为块设备、网卡设备、显卡设备、usb设备、存储设备以及多媒体设备。同时,系统主要针对qemu-2.5.0、qemu-2.8.0、qemu-3.1.0这三个版本进行了测试。本文对测试出的异常进行分析,发现的漏洞类型有越界写、无限循环、堆溢出、空指针引用和断言错误。针对已获得的漏洞个数,对于已知的漏洞,本文都列出了其对应的cve编号,共计10个;对于系统发现2个未知的漏洞,我们设置编号为varas-qemu-01和varas-qemu-02。

表1虚拟设备测试结果汇总表

根据以上的数据分析,本发明提供的一种针对云计算系统虚拟设备的模糊测试方法及系统可以对kvm/qemu系统中的多类虚拟设备进行测试,同时具有发现不同类型的漏洞的能力。

最后所应说明的是,以上实施案例仅用以说明本发明的技术方案而非限制,尽管使用事例对本发明进行了详细说明,本领域的普通技术人员应当理解,可对本发明的技术方案进行修改或者等价替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1