一种基于gpu二进制代码翻译的高效模糊测试方法
技术领域
本发明属于网络信息安全
技术领域
,具体来说,涉及一种基于GPU二进制代码翻译的高效模糊测试方法。背景技术
模糊测试是依靠计算机软件自动执行,测试效率相对人来讲远远高出几个数量级。模糊测试技术本质是依赖随机函数生成随机测试例,随机性意味着不重复、不可预测,可能有意想不到的输入和结果。根据概率论的“大数定律”,只要我们重复的次数足够多、随机性够强,那些概率极低的偶然事件就必然会出现。模糊测试技术就是大数定律的典范应用,足够多的测试用例和随机性,就可以让那些隐藏的很深很难出现的Bug成为必然现象。很显然,模糊测试是非常耗时,因为进行模糊测试时,通常需要用到插桩技术,并要求设备具有高吞吐量的计算能力。
目前,大多数模糊测试方法都采用传统的CPU架构或仿真器,然而这是非常低效的。由于无法访问被测软件的源代码,针对这些平台的实际模糊测试就需要通过仿真器或者很多物理设备来完成,这将是非常低效耗时的工作,并且这些要求往往是不切实际的。模糊测试是一个非常适合并行化处理的问题,通过测试用例生成器可以同时生成成千上万个测试用例,这些测试用例可以通过不同测试程序实例并行执行。理论上来说,可以通过数千个线程执行测试程序用例,同时测试数千个不同的输入,这将大大提高模糊测试效率。
现有技术中的缺陷在于,GPU非常擅长执行这种并行任务,然而除了将基于 GPU的神经网络用于模糊测试用例生成外;缺乏基于GPU的大规模模糊测试并行执行方法。
发明内容
针对现有技术存在的缺乏基于GPU的大规模模糊测试并行执行方法的问题,本发明提供了一种基于GPU二进制代码翻译的高效模糊测试方法。
为实现上述技术目的,本发明采用的技术方案如下:
一种基于GPU二进制代码翻译的高效模糊测试方法,包括步骤:
S1、初始化标准测试程序相关测试用例;
S2、生成GPU二进制代码可执行的测试用例,进入步骤S3;
S3、将生成的测试用例输入到GPU测试程序实例,并输出测试结果;进入步骤 S4;
S4、对步骤S3中输出测试结果进行异常检测;在步骤S4中,将异常输出归并到异常结果集中。在步骤S4中,还包括同时针对当前测试用例集进行种子变异,生产变异种子集合。
S5、判断是否满足模糊测试结束条件,满足,则停止模糊测试流程;不满足,返回步骤S2中。在步骤S5中,当不满足模糊测试结束条件时,测试用例生成器通过新的变异种子集合生产新的测试用例集,进行下一次测试迭代。
进一步地,在步骤S3中,GPU测试程序实例通过CPU2GPU二进制代码翻译器将模糊测试程序的CPU二进制代码翻译成GPU PTX架构的二进制代码。
进一步地,CPU2GPU二进制代码翻译器的具体翻译步骤包括:
S11、将CPU二进制代码编译为中间表示代码LLVM IR;
S12、将中间表示代码LLVM IR通过LLVM优化编译器编译链接为PTX二进制代码。
进一步地,在步骤S11中,CPU二进制代码编译方式包括两种:其一,当CPU 二进制代码有源代码,则直接从源代码通过LLVM翻译器得到中间表示代码LLVM IR;其二,当只有CPU二进制代码,则需要通过二进制代码翻译器,将CPU二进制代码映射到中间表示代码LLVM IR。
进一步地,CPU2GPU二进制代码翻译器组件包括测试程序源代码、翻译器、中间表示代码IR、二进制翻译器和优化编译器;
测试程序源代码,为软件程序源代码;
翻译器,针对不同的源代码使用不同翻译器;
中间表示代码IR,通过不同翻译器,将源代码翻译成LLVM IR代码;
二进制翻译器,将测试程序CPU二进制代码译为中间表示代码IR;
优化编译器,中间表示代码IR优化编译为适应于GPU架构的二进制代码,采用LLVM优化器和LLVM后端编译器,并实现GPU二进制代码线程实例调度与隔离以及相应的内存管理优化。
进一步地,在步骤S2中,采用测试用例生成器,一次生成多个不同测试用例。
进一步地,每个测试用例被输入到独立的GPU测试程序线程实例,都会得到一个相关的测试结果。
本发明相比现有技术,具有如下有益效果:
1、充分利用二进制翻译技术实现GPU执行代码的生产,并实现GPU的地址空间管理机制实现GPU并行代码的内存隔离,实现模糊测试的多输入用例并行调度;
2、通过模糊测试的模糊生产器为目标程序提供大量的随机化输入,将这些大量的随机输入实现每个输入都可以独立于其他输入单独执行。
附图说明
图1为本发明一种基于GPU二进制代码翻译的高效模糊测试方法的流程图;
图2为本发明一种基于GPU二进制代码翻译的高效模糊测试方法的基本流程图;
图3为本发明GPU二进制代码翻译框架流程图。
具体实施方式
为了便于本领域技术人员的理解,下面结合实施例与附图对本发明作进一步的说明,实施方式提及的内容并非对本发明的限定。
实施例1
如图1所示,一种基于GPU二进制代码翻译的高效模糊测试方法,包括步骤:
S1、初始化标准测试程序相关测试用例;
S2、生成GPU二进制代码可执行的测试用例,进入步骤S3;在步骤S2中,采用测试用例生成器,一次生成多个不同测试用例。每个测试用例被输入到独立的 GPU测试程序线程实例,都会得到一个相关的测试结果。
S3、将生成的测试用例输入到GPU测试程序实例,并输出测试结果;进入步骤 S4;在步骤S3中,GPU测试程序实例通过CPU2GPU二进制代码翻译器将模糊测试程序的CPU二进制代码翻译成GPU PTX架构的二进制代码。
S4、对步骤S3中输出测试结果进行异常检测;在步骤S4中,将异常输出归并到异常结果集中。同时针对当前测试用例集进行种子变异,生产变异种子集合。
S5、判断是否满足模糊测试结束条件,满足,则停止模糊测试流程;不满足,返回步骤S2中。当不满足模糊测试结束条件时,测试用例生成器通过新的变异种子集合生产新的测试用例集,进行下一次测试迭代。
实施例2
如图1和2所示,一种基于GPU二进制代码翻译的高效模糊测试方法,包括步骤:
S1、初始化标准测试程序相关测试用例;
S2、生成GPU二进制代码可执行的测试用例,进入步骤S3;在步骤S2中,采用测试用例生成器,一次生成多个不同测试用例。每个测试用例被输入到独立的 GPU测试程序线程实例,都会得到一个相关的测试结果。
S3、将生成的测试用例输入到GPU测试程序实例,并输出测试结果;进入步骤 S4;在步骤S3中,GPU测试程序实例通过CPU2GPU二进制代码翻译器将模糊测试程序的CPU二进制代码翻译成GPU PTX架构的二进制代码。该GPU二进制代码不仅限于PTX架构,只要LLVM支持的GPU,如RTX架构等。
CPU2GPU二进制代码翻译器的具体翻译步骤包括:
S11、将CPU二进制代码编译为中间表示代码LLVM IR;
S12、将中间表示代码LLVM IR通过LLVM优化编译器编译链接为PTX二进制代码。
在步骤S11中,CPU二进制代码编译方式包括两种:其一,当CPU二进制代码有源代码,则直接从源代码通过LLVM翻译器得到中间表示代码LLVM IR;其二,当只有CPU二进制代码,则需要通过二进制代码翻译器,将CPU二进制代码映射到中间表示代码LLVM IR。
CPU2GPU二进制代码翻译器组件包括测试程序源代码、翻译器、中间表示代码IR、二进制翻译器和优化编译器;
测试程序源代码,为软件程序源代码;可以使C/C++/go/rust等程序源代码。
翻译器,针对不同的源代码使用不同翻译器;如Clang翻译C/C++源代码到 LLVMIR代码,Gollvm翻译go源代码到LLVM IR代码,rustc翻译rust源代码到 LLVM IR代码等。
中间表示代码IR,通过不同翻译器,将源代码翻译成LLVM IR代码;
二进制翻译器,因无源代码须将测试程序CPU二进制代码译为中间表示代码IR;该组件即是实现CPU二进制代码翻译成中间表示代码IR(如LLVM IR代码)。其中可以有很多工具实现二进制机器码提升为LLVM位码工具,例如remill、McSema、 dagger、llvm-mctoll、retdec、reopt、rev.ng、bin2llvm、fcd、RevGen、Fracture、libbeauty 等等。
优化编译器,中间表示代码IR优化编译为适应于GPU架构的二进制代码,采用LLVM优化器和LLVM后端编译器,并实现GPU二进制代码线程实例调度与隔离以及相应的内存管理优化。
S4、对步骤S3中输出测试结果进行异常检测;在步骤S4中,将异常输出归并到异常结果集中。同时针对当前测试用例集进行种子变异,生产变异种子集合。
S5、判断是否满足模糊测试结束条件,满足,则停止模糊测试流程;不满足,返回步骤S2中。当不满足模糊测试结束条件时,测试用例生成器通过新的变异种子集合生产新的测试用例集,进行下一次测试迭代。
由于CPU二进制代码程序运行于x86/aarch64/amd64等架构,NVIDIA GPU使用PTX(Parallel Thread eXecution,RTX)指令集架构。因此,我们不能直接执行我们想要模糊测试的二进制文件于GPU环境。解决方案有两种:
方法一:基于GPU开发一个嵌入式CPU模拟器。然而,为GPU开发一个CPU 模拟器代价高昂,而且性能很差。
方法二:将CPU的x86/aarch64/amd64二进制代码翻译成GPU的PTX二进制代码。这样它们就可以直接在GPU上执行而无需进行仿真处理。
实现CPU2GPU二进制代码翻译器,通过该翻译器将模糊测试程序的CPU二进制代码翻译成GPU PTX架构的二进制代码。在GPU中开启多个线程实例并行调度 PTX架构的二进制代码测试程序,同时实现成千上万个模糊测试程序并行线程用例,通过输入不同的测试用例并进行异常检测,完成一次测试迭代。通过种子变异迭代生成多批测试用例集,实现多次迭代模糊测试,直到预设的模糊测试结束条件结束该模糊测试过程。
由于模糊测试是基于CPU的二进制可执行程序,不可将被测程序的二进制代码直接在GPU上运行,因为在GPU上运行代码与在CPU上运行代码有很大的差异。
首先,GPU与CPU基于不同的体系架构和指令集,导致GPU不能直接执行 x86/aarch64等架构的指令。但是模糊测试只可基于二进制代码进行测试,如何基于二进制代码生成GPU汇编代码并运行成为问题的难点。
其次,GPU没有操作系统。传统的并行化Fuzzer需要启动多个进程,并要求可以分别处理不同的输入,而不干扰其他进程,也就是说,如果一个输入导致一个进程崩溃,其他进程必须不受影响。但是,由于GPU没有进程和地址空间隔离的概念,任何内存问题都会导致整个Fuzzer崩溃,如何实现GPU模糊测试程序的并行实例成为另一挑战。
另外,GPU无法对系统调用进行响应,也即GPU程序将无法执行打开文件、使用网络等操作。因此,GPU需要对系统调用进行仿真,或将其通过CPU中继到主机操作系统执行,这将使GPU系统响应效率产生影响。
最后,GPU复杂的内存管理机制。由于GPU具有非常复杂的内存层次结构,多种不同类型的内存,并且每种类型的内存都有不同的易用性和性能;而GPU的性能又高度依赖于内存的访问模式,例如控制线程何时访问内存以及如何访问内存,这些对性能的影响是至关重要的。此外,GPU的内存容量是有限的,这使得正确管理内存布局和访问模式变得更加困难。拥有16GB的设备内存听起来可能令人印象深刻,但把它分给成千上万个执行线程,每个线程就只有微不足道的几KB内存空间了。
本发明相比现有技术,具有如下有益效果:
1、充分利用二进制翻译技术实现GPU执行代码的生产,并实现GPU的地址空间管理机制实现GPU并行代码的内存隔离,实现模糊测试的多输入用例并行调度;
2、通过模糊测试的模糊生产器为目标程序提供大量的随机化输入,将这些大量的随机输入实现每个输入都可以独立于其他输入单独执行。
以上对本申请提供的一种基于GPU二进制代码翻译的高效模糊测试方法进行了详细介绍。具体实施例的说明只是用于帮助理解本申请的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以对本申请进行若干改进和修饰,这些改进和修饰也落入本申请权利要求的保护范围内。