一种面向二进制的混合模糊测试方法

文档序号:6638188阅读:370来源:国知局
一种面向二进制的混合模糊测试方法
【专利摘要】本发明提供了一种面向二进制的混合模糊测试方法,包括:采用模糊测试作为前端处理,其中利用测试用例来驱动被测试程序的执行;采用二进制代码覆盖率监测处理作为中间层处理,其中在被测试程序的执行过程中,记录被测试程序覆盖的基本块,由此计算模糊测试的覆盖率;当计算出的模糊测试的覆盖率不再提高时,执行作为后端处理的符号执行处理,在符号执行处理中生成覆盖与当前测试用例的路径不同的其它路径的新的测试用例,然后将新的测试用例反馈至模糊测试,使得模糊测试利用新的测试用例来驱动被测试程序的执行。
【专利说明】一种面向二进制的混合模糊测试方法

【技术领域】
[0001] 本发明涉及计算机【技术领域】,更具体地说,本发明涉及一种面向二进制的混合模 糊测试方法。

【背景技术】
[0002] 随着计算机科学技术和互联网技术飞速发展,软件安全问题层出不穷,软件安全 一直备受关注。在软件安全性测试领域,模糊测试和符号执行是两种使用较为广泛的测试 方法。
[0003] 模糊测试(Fuzzing)是目前安全性测试领域最常用的技术手段,其基本思想是向 目标程序提供大量的畸形输入并监控目标系统的异常结果来发现软件缺陷。模糊测试的基 本流程为:
[0004] 1)确定待测试的目标程序,分析程序输入数据的基本结构信息,程序输入包括命 令行参数、文件、网络数据包、环境变量等;
[0005] 2)依据待测目标程序和输入数据的基本结构信息的不同,选择相应的测试用例生 成方案,生成模糊测试数据;
[0006] 3)将测试输入逐个推送至目标程序,驱动程序执行并监控程序运行状态;
[0007] 4)将引起程序异常的测试用例和系统状态进行记录;
[0008] 5)进一步分析系统异常原因,确定该异常信息是否可被进一步利用(该阶段为非 必须阶段)。
[0009] 模糊测试技术的优势在于其不需要任何关于软件或协议的先验知识,且测试过程 简单、高效,自动化程度高。但由于测试用例生成策略的限制,模糊测试存在一定的局限性。 其生成的测试用例具有单一性,多个用例往往覆盖程序的同一条路径,无法保证测试的代 码覆盖率,致使测试过程不全面。
[0010] 传统模糊测试技术的不足促进了符号执行技术的发展。
[0011] 符号执行是一种验证程序正确性的方法,其基本思想是将目标程序的具体输入用 符号变量表示,根据程序语义,使用符号变量解释执行程序,在程序的执行过程中使用符号 变量表示程序变量,在程序的分支跳转处使用符号表达式表示跳转条件。程序的最终输出 是由符号变量组成的逻辑或算术表达式,称为路径约束条件。对路径约束条件进行可满足 性的判断,通过对约束条件取反,进行符号变量的求解,生成新的测试用例,新生成的测试 用例可以覆盖程序中新的路径。
[0012] 符号执行试图通过分析程序中所有可执行路径,达到程序状态空间的完全遍历。 在理论上,符号执行可以保证较高的测试覆盖率,但具体使用中存在路径爆炸,约束求解耗 时耗能等问题。
[0013] 目前,对于源代码的安全性测试已经有将模糊测试和符号执行相结合的方法。非 专利文献 I (Internat ional Conference on Software Engineering,29 卷,416-426 页) 针对C程序提出了一种混合执行的测试方法,模糊测试和符号执行交替执行,同时从广度 上和深度上探索程序状态空间。非专利文献1在源代码符号执行工具CUTE上实现了该算 法,实验结果表明在相同的系统开销下,该方法相比于单独的模糊测试和符号执行都可达 到较高的测试覆盖率,能探索更大的程序状态空间。
[0014] 但是,非专利文献1中提出的方法只适用于源代码层面,无法针对二进制程序进 行分析。


【发明内容】

[0015] 本发明所要解决的技术问题是针对现有技术中存在上述缺陷,提供一种能够针对 二进制程序的混合模糊测试方法,该将模糊测试和符号执行相结合,同时从广度上和深度 上探索程序状态空间。通过该方法可以在合理的系统资源开销下,获得较高的测试覆盖率。
[0016] 为了实现上述技术目的,根据本发明,提供了一种面向二进制的混合模糊测试方 法,包括:采用模糊测试作为前端处理,其中利用测试用例来驱动被测试程序的执行;采用 二进制代码覆盖率监测处理作为中间层处理,其中在被测试程序的执行过程中,记录被测 试程序覆盖的基本块,由此计算模糊测试的覆盖率;当计算出的模糊测试的覆盖率不再提 高时,执行作为后端处理的符号执行处理,在符号执行处理中生成覆盖与当前测试用例的 路径不同的其它路径的新的测试用例,然后将新的测试用例反馈至模糊测试,使得模糊测 试利用新的测试用例来驱动被测试程序的执行。
[0017] 优选地,符号执行处理采用动态符号执行技术。
[0018] 优选地,在符号执行处理中,对被测试程序的输入进行符号化处理,抓取当前测试 用例的执行轨迹,使用中间语言对轨迹文件进行形式化描述,生成当前路径的约束条件,采 用基于代的路径搜索算法对路径约束条件取反,借助约束求解器求解路径约束条件,最终 生成覆盖与当前测试用例的路径不同的其它路径的新的测试用例。
[0019] 优选地,模糊测试在接收到从符号执行处理反馈来的新的测试用例之前,利用基 于变异的策略生成的测试用例来驱动被测试程序的执行。
[0020] 优选地,所述面向二进制的混合模糊测试方法用于软件安全性测试。
[0021] 本发明的混合模糊测试方法针对的是二进制程序,相比于源代码测试更具适用性 和实际价值。本发明的混合模糊测试方法在每次切换到符号执行时,只进行一次符号执行 操作,并非重复执行符号执行,增强了符号执行的可用性。将模糊测试和符号执行相结合提 出混合模糊测试方法,该方法引入符号执行指导部分测试用例的生成,构成一个带反馈式 的模糊测试系统,消除了传统模糊测试生成测试用例的盲目性,整个系统在合理的资源开 销下,可以达到更高的测试覆盖率。

【专利附图】

【附图说明】
[0022] 结合附图,并通过参考下面的详细描述,将会更容易地对本发明有更完整的理解 并且更容易地理解其伴随的优点和特征,其中:
[0023] 图1示意性地示出了根据本发明优选实施例的面向二进制的混合模糊测试方法 的系统架构简图。
[0024] 图2示意性地示出了根据本发明优选实施例的面向二进制的混合模糊测试方法 的系统架构详图。
[0025] 图3示意性地示出了根据本发明优选实施例的混合模糊测试系统的伪代码实现 的示例。
[0026] 图4示意性地示出了本发明具体实施例采用的基于代的路径遍历算法。
[0027] 图5示意性地示出了根据本发明优选实施例的针对Linux系统下的常用二进制程 序Is的中间语言片段的具体示例。
[0028] 需要说明的是,附图用于说明本发明,而非限制本发明。注意,表示结构的附图可 能并非按比例绘制。并且,附图中,相同或者类似的元件标有相同或者类似的标号。

【具体实施方式】
[0029] 为了使本发明的内容更加清楚和易懂,下面结合具体实施例和附图对本发明的内 容进行详细描述。
[0030] 对二进制代码分析,相比源代码分析具有以下优势:首先,对二进制可执行程序分 析不依赖于源代码,可以很好地保护商业机密。其次,在源代码编译成最终的二进制程序的 过程中,可能会有编译器优化或代码混淆器引入的隐蔽软件缺陷。因此,源代码正确,二进 制程序不一定正确,只有对最终的二进制程序进行测试分析,才可能发现此类问题。最后, 现有的不同软件是由不同的编程语言((:工++、从¥八、脚本语言等)编写而来,目前还不存在 跨编程语言的源代码安全性分析系统,对源代码进行分析,需要对不同的编程语言的语法 和语义信息建立不同的模型后进行分析。但它们最终的二进制代码都是统一形式的机器指 令,因此,对二进制程序分析不受编程语言差异的影响。
[0031] 本发明提出的混合模糊测试方法的系统架构简图如图1所示,系统架构详图如图 2所示。
[0032] 如图1和图2所示,根据本发明优选实施例的面向二进制的混合模糊测试方法包 括:
[0033] 采用模糊测试100作为前端处理,其中利用测试用例来驱动被测试程序的执行 (模糊测试1〇〇初始地可以利用基于变异的策略生成的测试用例来驱动被测试程序的执 行,即,模糊测试1〇〇在接收到从符号执行处理300反馈来的新的测试用例400之前,利用 基于变异的策略生成的测试用例来驱动被测试程序的执行);
[0034] 采用二进制代码覆盖率监测处理200作为中间层处理,其中在被测试程序的执行 过程中,记录被测试程序覆盖的基本块,由此计算模糊测试100的覆盖率;
[0035] 当计算出的模糊测试100的覆盖率不再提高时,执行作为后端处理的符号执行处 理300,其中符号执行处理300生成覆盖与当前测试用例的路径不同的其它路径的新的测 试用例400,然后将新的测试用例400反馈至模糊测试100,使得模糊测试100利用新的测 试用例400来驱动被测试程序的执行。
[0036] 具体地说,例如如图2所示,符号执行处理300可采用动态符号执行技术,首先对 被测试程序的输入进行符号化处理,抓取当前测试用例的执行轨迹,使用中间语言对轨迹 文件进行形式化描述,生成当前路径的约束条件,采用基于代的路径搜索算法对路径约束 条件取反,借助约束求解器求解路径约束条件,最终生成覆盖与当前测试用例的路径不同 的其它路径的新的测试用例400 ;然后将新的测试用例400反馈至模糊测试100,使得模糊 测试100利用新的测试用例400来驱动被测试程序的执行。
[0037] 而且,在具体实施时,可以重复执行上述方法的过程。
[0038] 上述面向二进制的混合模糊测试方法用于软件安全性测试。
[0039] 为了更详细地描述本发明的具体实施细节,下面将详细描述本发明的具体实施方 式及具体实例。
[0040] 混合模糊测试系统的伪代码实现的实例如图3所示。算法的基本流程为:算法输 入为可执行程序和本次测试的目标(例如测试用例数量,覆盖率),3-15行是循环的主体: 循环过程首先将覆盖率提高标志( C〇Verage_flag)设为真(3行);在执行模糊测试的同 时监测代码覆盖率情况,直到程序覆盖的基本块数量不再增加时,将c 〇Verage_flag设为 假(4-10行);此时结束内层循环,转为符号执行,产生新的输入,继续执行循环体(13-15 行)。
[0041] 传统的模糊测试作为整个混合模糊测试系统的前端,采用基于变异或者基于生成 的测试用例生成方法,持续不断地产生测试用例,将生成的测试用例注入到目标程序中,驱 动程序执行。在目标程序的执行过程中,通过二进制代码覆盖率监测实时计算测试覆盖率。 [0042] 混合模糊测试系统在代码覆盖率不再提高时转入后端符号执行,代码覆盖率不再 提高意即所覆盖的基本块的数量不再增加。符号执行模块作为混合模糊测试系统的后端, 主要任务是在程序执行过程中收集路径约束条件,通过一定的路径搜索策略生成新的路径 约束条件,最后使用特定的约束求解器求解生成覆盖其他路径的测试用例,以此提高模糊 测试的测试覆盖率。在符号执行过程中,对二进制程序的分析,实质上是对内存单元和寄 存器分析。汇编指令虽然能表示出机器语言的所有操作,但并未将这些操作所产生的影响 (s ide effect)体现出来,也就无法将标志寄存器EFlags的状态体现出来。程序执行到 分支跳转指令时,会根据EFlags中的某些标志位决定是否跳转,EFlags是一个32位寄存 器,由状态标志位,控制标志位和系统标志位组成。符号执行系统收集路径约束条件时,主 要依据轨迹中的条件转移指令(jcc),条件转移指令依据EFlags的值决定执行不同的分 支。而EFlags中的值又依赖于前面能影响EFlags寄存器的机器指令,因此在将该机器指 令转换成汇编指令的同时将其对EFlags寄存器的影响表示出来,就可以确定条件转移指 令处该选择的路径。需采用某种中间语言(Intermediate Language)来表示指令及指令对 于EFlags寄存器的影响。
[0043] 符号执行得到的路径约束条件是由符号变量表示的表达式组成的函数,为构造新 的路径约束条件,需采用一定的路径搜索策略。本发明的具体实施例可以采用一种基于代 的路径遍历算法(Generat ion Search, GS),如图4所示。GS算法的基本思想是:对于当 前输入所产生的路径约束条件,依次对约束条件进行取反操作,生成下一代路径约束条件 集,重复该过程,即可遍历程序中所有可执行路径。相比于深度遍历和广度遍历每次产生一 个新的路径,GS算法每次可产生多个新的路径约束,从而求解产生多个新的输入。符号执 行模块作为模糊测试系统的后端,是当模糊测试在执行过程中监测到代码覆盖率不再提高 时,转为符号执行,由符号执行产生通往其他路径的新输入,并不是循环执行符号执行以搜 索程序中所有的路径,因此本文在符号执行过程中只产生第一代的新的约束条件,通过约 束求解器求解产生新的输入。
[0044] 【具体实例】
[0045] 对Linux系统下的常用二进制程序Is(以列表形式显示目录内容)进行安全性分 析。目标程序Is的外部输入由一系列选项参数及目标路径组成,采用基于变异的测试用例 生成策略随机产生测试用例。使用生成的测试用例驱动目标程序Is运行。
[0046] Is程序开始运行,同时启动二进制代码覆盖率监测模块。每个测试用例执行完毕 后,分析该用例覆盖的基本块,将该测试用例加入到以往所有执行过的测试用例中,构成一 个新的测试用例集,然后计算整个测试用例集的代码覆盖率(也可以计算用例集覆盖的不 同的基本块数量)。
[0047] 当二进制代码覆盖率监测模块监测到新执行的测试用例无法提高整个测试用例 集的覆盖率时,暂停模糊测试的执行过程,转入后端的符号执行。符号执行模块将最后一次 执行的测试用例作为具体输入,抓取Is程序执行该测试用例的执行轨迹。将轨迹文件通 过逆向工程提升为某种中间语言,收集本次执行过程的路径约束条件。约束条件关注条件 跳转类指令,以Is轨迹文件的中间语言片段图5为例,对于比较指令"cmp$Oxffffffff,% ecx",其含义是比较寄存器ecx的值与立即数Oxffffffff的大小,BIL显式表达并计算出 该比较指令所影响到的EFlags寄存器中各个标志位的变化,其中零标志位ZF由于两操作 数相减结果不为零置为"false"。下一条指令"je 0x000000009d4e403e"为条件转移类指 令,当EFf lags寄存器的ZF标志位为1时跳转到0x000000009d4e403e地址处继续执行,否 则顺序执行接下来的指令。在这里,由于ZF = 0,程序没有发生跳转。此时收集到的路径 约束条件为"…八(ECX〈-1)八…",省略号表示其他约束条件,各个约束条件使用"且"连 接。
[0048] 为构造新的路径约束条件,从而探索到其他新的路径,采用GS算法较为关键的一 步是对约束取反。对于图4的约束条件进行取反的结果为:"…八=(ECX〈-1)",(ECX〈-1) 之后的约束条件舍弃,之前的约束条件保留。由于新的约束条件是对原约束条件取反,使得 程序在"je 0X000000009d4e403e"指令处发生跳转,从而探索到程序中新的路径。若本条 路径上有n个约束条件,经过一次符号执行后采用GS算法得到第一代的结果,就可以构造 n个新的路径约束条件,借助约束求解器进行可满足性判断及约束求解,可以生成覆盖特定 路径的具体的测试用例。
[0049] 将经过符号执行生成的测试用例注入到Is程序中,同样地进行代码覆盖率的监 测和计算。最后,继续执行模糊测试。重复该过程。直到达到Is程序的测试需求(如要求 达到的覆盖率、执行的测试用例数)时,终止混合模糊测试的执行。
[0050] 可以理解的是,虽然本发明已以较佳实施例披露如上,然而上述实施例并非用以 限定本发明。对于任何熟悉本领域的技术人员而言,在不脱离本发明技术方案范围情况下, 都可利用上述揭示的技术内容对本发明技术方案作出许多可能的变动和修饰,或修改为等 同变化的等效实施例。因此,凡是未脱离本发明技术方案的内容,依据本发明的技术实质对 以上实施例所做的任何简单修改、等同变化及修饰,均仍属于本发明技术方案保护的范围 内。
【权利要求】
1. 一种面向二进制的混合模糊测试方法,其特征在于包括: 采用模糊测试作为前端处理,其中利用测试用例来驱动被测试程序的执行; 采用二进制代码覆盖率监测处理作为中间层处理,其中在被测试程序的执行过程中, 记录被测试程序覆盖的基本块,由此计算模糊测试的覆盖率; 当计算出的模糊测试的覆盖率不再提高时,执行作为后端处理的符号执行处理,在符 号执行处理中生成覆盖与当前测试用例的路径不同的其它路径的新的测试用例,然后将新 的测试用例反馈至模糊测试,使得模糊测试利用新的测试用例来驱动被测试程序的执行。
2. 根据权利要求1所述的面向二进制的混合模糊测试方法,其特征在于,符号执行处 理采用动态符号执行技术。
3. 根据权利要求1或2所述的面向二进制的混合模糊测试方法,其特征在于,在符号执 行处理中,对被测试程序的输入进行符号化处理,抓取当前测试用例的执行轨迹,使用中间 语言对轨迹文件进行形式化描述,生成当前路径的约束条件,采用基于代的路径搜索算法 对路径约束条件取反,借助约束求解器求解路径约束条件,最终生成覆盖与当前测试用例 的路径不同的其它路径的新的测试用例。
4. 根据权利要求1或2所述的面向二进制的混合模糊测试方法,其特征在于,模糊测试 在接收到从符号执行处理反馈来的新的测试用例之前,利用基于变异的策略生成的测试用 例来驱动被测试程序的执行。
5. 根据权利要求1或2所述的面向二进制的混合模糊测试方法,其特征在于,所述面向 二进制的混合模糊测试方法用于软件安全性测试。
【文档编号】G06F11/36GK104375942SQ201410758900
【公开日】2015年2月25日 申请日期:2014年12月11日 优先权日:2014年12月11日
【发明者】董芳泉, 董超群, 张慧, 张垚, 杨书轩, 程来旺 申请人:无锡江南计算技术研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1