一种面向敏感区域的嵌入式软件测试用例生成方法

文档序号:6524520阅读:219来源:国知局
一种面向敏感区域的嵌入式软件测试用例生成方法
【专利摘要】本发明涉及一种面向敏感区域的嵌入式软件测试用例生成方法。本发明首先对二进制文件进行分析,对反汇编技术生成的汇编语言进行中间语言转换,并对转换结果进行插桩处理,得到插桩程序;然后利用所得的插桩程序进行敏感区域分析,确定出污点数据;其次利用种子测试用例动态执行程序,收集分支路径约束条件,在遇到分支跳转时,将当前收集到的约束集取反输出;最后分析收集到的约束集中的各个约束是否包含污点并进行处理,将化简后的约束集送入约束求解器求解,所得的最终结果就为能够生成覆盖污点数据输入可控的各分支路径的测试用例。本发明相较单一的静态分析技术或动态分析技术有着更高的分析效率。
【专利说明】一种面向敏感区域的嵌入式软件测试用例生成方法
【技术领域】
[0001]本发明属于软件测试【技术领域】,涉及一种面向敏感区域的嵌入式软件测试用例生成方法。
【背景技术】
[0002]如今嵌入式软件在各行各业都有着巨大的市场占有率,医学,教育,银行,军事,计算机等各个领域都深受嵌入式系统的影响,但由于嵌入式软件内存容量有限,实时性要求高,专用性较强,继承性差等特点使得嵌入式软件在空间以及时间资源等方面很大程度上被限制在了有限的条件下,同时由于嵌入式软件对于可靠性和安全性的要求比较高,因此对于嵌入式的缺陷检测提出了更高的要求。针对嵌入式软件进行安全检测,及时发现软件存在的漏洞,减少实际应用中带来的经济损失,已经成为嵌入式软件研究的一个热点领域。所以研究嵌入式软件,挖掘软件中存在的缺陷漏洞具有重大的实际意义。
[0003]如何针对特定的嵌入式软件生成与之相对应的测试用例集,成为检测嵌入式软件可靠性的重要标准,国内外研究学者在相关方面做了大量的研究工作,可以将相关技术按不同划分准则划分成不同的种类,其中按照分析对象不同可分成:
(I)源代码分析。这种分析方法以软件源代码为分析对象,与编译过程紧密相关。一般在编译生成的中间语言格式上进行分析,包括数据流分析,控制流分析,SSA分析,最弱条件分析,广泛用到格理论,模型检测理论等。源码分析也可以结合符号执行与约束求解器进行分析,优点是程序的全局信息比较完整,分析的难度较低,分析精度较好。缺点是很多软件的源代码难以获得,商业软件的源代码大多不予公开;有些已经长期部署并广泛应用的软件已经找不到相应的源代码,这种情况限制了源代码分析的可用性。
[0004](2)字节码分析。C#,java等语言编译后生成的是字节码,而不是二进制的机器码。如果没有进行过特殊的字节码混淆技术的处理,从字节码可以完整地提升至源代码,有比较好的结构信息和类型信息,分析难度较低,分析精度较好。但是这种方法适用于分析C#,java等语言的字节码,而对于C / C++语言或者已经部署了的C语言写的程序则无能为力。
[0005](3) 二进制代码分析。这种方法与前两种不同,直接以部署的二进制代码为分析对象,结合反汇编技术进行安全性分析。由于二进制代码是作为软件的最终体现形式,软件发布必然会带有二进制的执行程序,即使以源代码发布也可以编译为二进制可执行程序,有广泛的实用性,缺点是二进制程序缺乏低层的结构信息。
[0006]按照是否需要执行程序可以分为:
1:静态分析。典型的工具是Saturn和Fortify SCA,采用各种静念的分析方法,流敏感或者路径敏感的方法对软件进行分析,其中广泛用到符号执行,约束求解的路径名敏感分析技术。二进制分析的工具如Rose,也提供了静态分析二进制代码的功能,但是其分析能力较弱,精确性上存在较大问题。
[0007]2:动态分析。通过分析程序动态执行信息,获取可达路径对输入数据的约束,并在遇到受输入数据控制的分支跳转时将收集到的约束输出至求解器以判定另一分支路径是否可达,若可达,求解器则给出覆盖目标分支路径的测试用例,并利用生成的测试用例,发掘目标分支路径中的软件缺陷。动态分析更适合用来进行一些性能方面的分析,典型的二进制工具有Pin, Valgrind等。
[0008]但这两种分析技术均存在一定的局限性,主要体现在:静态分析技术只是针对程序的结构进行分析,并没有将程序进行实际的运行,因此收集到的约束条件不能完全做到对全路径的覆盖;动态分析技术虽然能够收集到覆盖更为全面的约束条件,但由于并没有对收集到的约束条件进行进一步的处理使得收集的约束条件过于庞大,造成约束求解开销过大,求解精度不闻等不足。

【发明内容】

[0009]本发明针对现有技术的不足,提供了一种面向敏感区域的嵌入式软件测试用例生成方法。该方法综合考虑了两种分析技术,取它们各自所具有的优势,提出一种动静结合的分析技术。
[0010]本发明方法具体包括以下步骤:
步骤I)对二进制文件进行分析,对反汇编技术生成的汇编语言进行中间语言转换,并对转换结果进行插桩桩处理,得到插桩程序。
[0011]步骤2)利用所得的插桩程序进行敏感区域分析,确定出污点数据。
[0012]步骤3)利用种子测试用例动态执行程序,在运行过程中监控输入符号变量,收集分支路径约束条件,在遇到分支跳转时,将当前收集到的约束集取反输出。
[0013]步骤4)分析收集到的约束集中的各个约束是否包含污点数据并进行处理,将化简后的约束集送入约束求解器求解,所得的最终结果就为测试用例。
[0014]本发明的有益效果:
1.该技术综合考虑了静态分析技术和动态分析技术所具有的优点与缺点,将两种技术的优点加以利用,同时避免两种技术存在的缺点,实现一种动静结合的分析技术,相较单一的静态分析技术或动态分析技术有着更高的分析效率。
[0015]2.该技术对收集到的约束条件进行了化简,最大程度减少了收集到的约束数量,减轻了求解器求解的复杂性从而提高了求解的精度。
【专利附图】

【附图说明】
[0016]图1为针对软件进行分析的系统模块。
[0017]图2为程序的分支形成的树形结构。
【具体实施方式】
[0018]从代码分析安全性使用的技术考虑,结合当前广泛使用的静态分析技术和动态分析技术,利用这两方面技术既有的优势,静态分析程序结构,然后动态执行程序并收集路径约束求解,其具体实现包括以下步骤:
步骤I)对二进制文件进行分析,对反汇编技术生成的汇编语言进行中间语言转换,并对转换结果进行插桩桩处理,得到插桩程序。[0019]步骤2)利用所得的插桩程序进行敏感区域分析,确定出污点数据。
[0020]步骤3)利用种子测试用例动态执行程序,在运行过程中监控输入符号变量,收集分支路径约束条件,在遇到分支跳转时,将当前收集到的约束集取反输出。
[0021]步骤4)分析收集到的约束集中的各个约束是否包含污点数据并进行处理,将化简后的约束集送入约束求解器求解,所得的最终结果就为测试用例。
[0022]其中步骤I)具体包括如下步骤:
I)利用反汇编技术对二进制文件进行反汇编处理,得到二进制文件相应的汇编程序。
[0023]2)利用Valgrind对反汇编得到的汇编程序进行转换,可以将经过反汇编生成的汇编程序进一步提升至中间语言。
[0024]3)对中间语言做进一步分析,针对中间语言对变量的输入、赋值处理,在变量所在相应位置插桩函数,所得到的最终结果就是插桩程序。
[0025]其中步骤2)具体包括如下步骤:
I)确定敏感区域:将容易引起缓冲区溢出的printf、memcpy、memset和strcpy危险函数的调用确认为敏感区域。
[0026]2)将与敏感区域相关的输入数据确认为污点数据。
[0027]3)然后查看程序变量是否与污点数据进行了运算,如果是,则其运算结果也是污点数据。这样通过该方法确定污染数据的流向,实现对污染数据的流向分析。
[0028]其中步骤3)包括如下步骤:
I)利用种子测试用例作为输入动态驱动程序执行,并对执行过程中所遇到的变量进行符号化,用符号变量代替实际变量符号化执行程序。
[0029]2)收集符号化执行时路径经过的分支条件,收集的全部约束就是该路径的一组约束条件。
[0030]3)通过将这组约束条件依次求反得到指向其他分支的路径约束条件,重复执行
3-2,3-3步得到程序的全部路径约束。
[0031]其中步骤4)具体包括如下步骤:
I)对收集到的路径约束进行分析,遍历其中的每一个约束条件。
[0032]2)根据约束条件中的符号变量是否是污点数据进行处理,如果该约束条件包含污点数据则确定为最终要输入约束求解器的符号变量,反之则忽略该符号变量。
[0033]3)将收集到的该路径上的符号变量送入约束求解器求解,最终就可以得到对应路径上的测试用例。
[0034]以下结合附图对本发明作进一步说明。
[0035]系统主要由两个模块构成,如附图1所示,程序分析和执行监控模块,约束求解和测试用例生成模块。
[0036]程序分析和执行监控模块
本模块主要针对二进制程序进行处理,利用反汇编技术将二进制程序转换成汇编程序,然后对汇编程序进行中间语言处理并插桩相应的函数,获取敏感区域信息,并将处理后的程序重新编译成二进制程序。之后,输入种子测试用例驱动重新编译的二进制程序运行,在运行过程中监控输入符号变量,收集分支路径约束条件,在遇到分支跳转时,将当前收集到的约束集取反输出。[0037]约束求解和测试用例生成模块
由于收集到的路径可达约束可能不存在污点数据,所以将其送入约束求解器求解之前,须先对约束进行化简,并将其转换为约束求解器所需输入格式,这样可以减少约束求解器的求解开销。在对路径约束求解构造测试用例时,采用STP求解器,STP的全称为SimpleTheorem Prover,由MIT的Vijay Ganesh领导的小组开发,主要用于约束求解类问题。该求解器已比较完善,目前国际上有很多比较成熟路径生成工具都采用STP solver,比如ΕΧΕ、KLEE、CATCHCONV ;信息记录器负责记录静态分析生成的敏感区域信息,提供相关信息支持基于贪心策略种子测试用例选择算法。
[0038]基于贪心策略种子测试用例选择算法
基于动态测试用例的输入可控分支路径遍历算法如下:
1.使用种子测试用例作为输入驱动程序执行,在本次执行路径上符号化执行目标程
序;
2.分析执行路径并提取依赖于输入符号变量的路径约束
3.对各分支约束取反
4.求解约束,构建新测试用例
5.重复执行上述步骤直到路径覆盖完全;
附图2对算法进行了具体说明。假设程序路径树如图,树的每个叶结点到根节点路径均形成一条程序执行路径。在第一次执行时,执行路径(1,2,4,9),则可以生成执行路径为(1,3,…)(1,2,5), (1,2,4,8)的测试用例,依次将上述3个新用例作为种子用例,直到产生覆盖到所有叶结点的测试用例。算法最终将覆盖到所有输入可控的分支可达路径。
`[0039]针对精确可达路径覆盖方法的收集到的约束条件过于繁多,我们进一步提出针对敏感区域覆盖的路径生成方法,目标测试用例集仅须覆盖静态分析过程中检查出的敏感区域,当敏感区域完全覆盖时,即结束算法迭代。经验证,该方法可在不丢失缺陷覆盖率的前提下,有效降低算法复杂度。
[0040]敏感区域分析
敏感区域分析通过对二进制代码反编译行生成的Valgrind中间代码分析来完成,属于静态分析方法。所谓敏感区域,指的是软件漏洞可能发生的地方,比如printf,memcpy等危险函数的调用,或者串指令rep stos的识别。真实软件的二进制代码指令数通常规模巨大,通过静态分析技术对其中的敏感区域标识,有助于软件缺陷发掘的进一步进行。本文中定义的二进制代码敏感区域主要包括以下几种类型:指针识别、危险函数识别,特别是缓冲区操作函数的的识别,以及内存分配与回收系统调用的识别。
[0041]化简约束条件
将与敏感区域相关的输入数据确认为污点数据,根据污点数据具有传播的特性查看程序变量是否与污点数据进行了运算,如果是,则其运算结果也是污点数据。这样通过该方法确定污染数据的流向,实现对污染数据的流向分析,根据最终所确定的污点数据集去化简基于贪心策略种子测试用例选择算法收集到的路径约束条件,若约束条件中不包含污点数据则删除该分支条件反之则需要送入求解器求解,最终即可得到相应路径的测试用例。
[0042]本发明通过分析现有的两种的分析技术,提出一种基于这两种方法的改进方法,针对污点数据进行处理而忽略非污点数据,有效减少动态符号化执行过程中收集到的变量,从而减少了求解器的求解开销,提高了求解的速度与精度。
【权利要求】
1.一种面向敏感区域的嵌入式软件测试用例生成方法,其特征在于该方法包括以下步骤: 步骤I)对二进制文件进行分析,对反汇编技术生成的汇编语言进行中间语言转换,并对转换结果进行插桩处理,得到插桩程序; 步骤2)利用所得的插桩程序进行敏感区域分析,确定出污点数据; 步骤3)利用种子测试用例动态执行程序,在运行过程中监控输入符号变量,收集分支路径约束条件,在遇到分支跳转时,将当前收集到的约束集取反输出; 步骤4)分析收集到的约束集中的各个约束是否包含污点数据并进行处理,将化简后的约束集送入约束求解器求解,所得的最终结果就为测试用例。
2.根据权利要求1所述的一种面向敏感区域的嵌入式软件测试用例生成方法,其特征在于:步骤I)具体是: 1-1.利用反汇编技术对二进制文件进行反汇编处理,得到二进制文件相应的汇编程序; 1-2.利用Valgrind对反汇编得到的汇编程序进行转换,将经过反汇编生成的汇编程序进一步提升至中间语言; 1-3.对中间语言做进一步分析,针对中间语言对变量的输入、赋值处理,在变量所在相应位置插桩函数,所得到的最终结果就是插桩程序。
3.根据权利要求1所述的一种面向敏感区域的嵌入式软件测试用例生成方法,其特征在于:步骤2)具体包括如下步骤: 2-1.确定敏感区域:将容易引起缓冲区溢出的printf、memcpy、memset和strcpy危险函数的调用确认为敏感区域; 2-2.将与敏感区域相关的输入数据确认为污点数据; 2-3.查看程序变量是否与污点数据进行了运算,如果是,则其运算结果也是污点数据。
4.根据权利要求1所述的一种面向敏感区域的嵌入式软件测试用例生成方法,其特征在于:步骤3)具体包括如下步骤: 3-1.利用种子测试用例作为输入动态驱动程序执行,并对执行过程中所遇到的变量进行符号化,用符号变量代替实际变量符号化执行程序; 3-2.收集符号化执行时路径经过的分支条件,收集的全部约束就是该路径的一组约束条件; 3-3.通过将这组约束条件依次求反得到指向其他分支的路径约束条件,重复执行3-2,3-3步得到程序的全部路径约束。
5.根据权利要求1所述的一种面向敏感区域的嵌入式软件测试用例生成方法,其特征在于:步骤4)具体包括如下步骤: 4-1.对收集到的路径约束进行分析,遍历其中的每一个约束条件; 4-2.根据约束条件中的符号变量是否是污点数据进行处理,如果该约束条件包含污点数据则确定为最终要输入约束求解器的符号变量,反之则忽略该符号变量; 4-3.将收集到的该路径上的符号变量送入约束求解器求解,最终得到对应路径上的测试用例。
【文档编号】G06F11/36GK103714000SQ201310703581
【公开日】2014年4月9日 申请日期:2013年12月18日 优先权日:2013年12月18日
【发明者】方景龙, 程攀, 万季, 王兴起, 王大全 申请人:杭州电子科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1