一种基于单元测试的软件脆弱性测试方法转让专利

申请号 : CN201110380418.6

文献号 : CN102495796B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 郭世泽赵静肖奇学朱峻茂郭瑞旭房珊瑶杨朝红吴志勇沈伟王雄李亚辉陈卓王岩

申请人 : 中国人民解放军总参谋部第五十四研究所

摘要 :

本发明为一种基于单元测试的软件脆弱性测试方法,首先加载运行目标测试程序,其次收集程序的运行时信息,判断程序路径各个环节的属性,识别各个代码区的属性并进行标记;分析程序路径各个环节的属性,将路径划分成各个单元,根据配置对各个单元进行符号执行,驱动程序执行不同分支;每个单元对应不同的代码区,对相应单元执行情况进行标记和归类;在程序执行各个不同分支路径过程中,分析路径的属性和程序的行为,基于同一根节点下的不同子路径,在各个单元上进行符号执行;基于各个单元前后执行的独立性,在每一个域上单独针对一个路径单元进行测试;本发明基于路径各个环节的属性,将其划分成各个单元进行测试,避免了测试在无关的代码区域进行测试。

权利要求 :

1.基于单元测试的软件脆弱性测试方法,其特征在于,包括以下步骤:

第一步:加载运行目标测试程序,即测试对象,给定目标测试程序输入,驱动目标测试程序执行;

第二步:基于动态二进制插桩监控目标测试程序运行时状态,收集目标测试程序的运行时信息,判断目标测试程序路径各个环节的属性,识别各个代码区的属性并进行标记;

第三步:分析目标测试程序路径各个环节的属性,将路径划分成各个单元,根据配置对各个单元进行符号执行,驱动目标测试程序执行不同分支;每个单元对应不同的代码区,对相应单元执行情况进行标记和归类;

第四步:在目标测试程序执行各个不同分支路径过程中,分析路径的属性和目标测试程序的行为,基于同一根节点下的不同子路径,在各个单元上进行符号执行;基于各个单元前后执行的独立性,在每一个域上单独针对一个路径单元进行测试;

第五步:基于测试需要和环境配置,对各个域提交的结果进行汇总,判断目标测试程序是否存在设计或实现缺陷。

2.如权利要求1所述的基于单元测试的软件脆弱性测试方法,其特征在于,所述的基于动态二进制插桩监控的详细步骤如下:模拟器在执行目标测试程序时,将目标测试程序翻译为等价的微指令,依据物理机器体系结构将微指令转换为本地指令执行;在指令翻译前,模拟器即可添加额外代码,完成对目标测试程序的动态插桩;动态二进制插桩包括收集指令的机器码、指令地址、目标测试程序运行上下文信息、目标测试程序溢出检查。

3.如权利要求1或2所述的基于单元测试的软件脆弱性测试方法,其特征在于,所述的符号执行的方法为:符号执行的输入被标记为代表任意数据的符号值,目标测试程序执行过程中输入符号相关的表达式,当目标测试程序发生分支时,分支条件即可表达为输入相关的布尔方程,不同的布尔方程反应不同的目标测试程序路径反应不同的目标测试程序输入,对符号方程进行变换求解,即可以自动生成目标测试程序的输入,从而提高测试的路径覆盖率。

4.如权利要求1或2所述的基于单元测试的软件脆弱性测试方法,其特征在于,所述的目标测试程序是否存在缺陷是通过断言来实现的。

说明书 :

一种基于单元测试的软件脆弱性测试方法

技术领域

[0001] 本发明涉及软件测试技术领域,具体涉及到虚拟化技术、动态二进制插桩技术、符号执行技术。

背景技术

[0002] 在软件生命周期中,软件测试是非常重要的一个环节,高效完备的测试是保证软件质量的重要手段。基于测试的粒度,软件测试可以分为系统测试、模块测试、策略级测试。基于测试收集数据的类型,软件测试可以分为性能测试、功能测试、稳定性测试等。此外,根据测试过程是否依赖于程序内部结构,软件测试可以分为白盒测试、黑盒测试、灰盒测试。
[0003] 基于分层和抽象的原则,计算机系统在不同层面上实现虚拟化技术,以提供多个同构或异构的平台。在硬件、系统以及应用程序各个层次上,虚拟化提供很好的物理隔离和逻辑隔离,并提供细粒度的运行时信息,在程序分析领域有广泛的应用。
[0004] 动态二进制插桩是指在程序运行时,除了正常执行原始程序外,在相关位置插入执行其他代码,用于完成程序运行时信息收集、分析、优化等工作。根据是否对原始程序执行逻辑产生影响,插桩可以分为有损插桩和无损插桩。插桩技术广泛运用于程序的分析和调试,根据是否对程序产生影响,插桩可以分为有损插桩和无损插桩,有损插桩依据特定意图改变程序的控制流和数据流,无损插桩主要用于收集程序的运行时信息,并不会对程序执行流产生影响。根据对象不同,插桩可分为源代码插桩和二进制插桩。前者是在编译时,对程序的源代码插入额外代码,后者是在运行时插入代码,用于收集或改变程序的运行状态。
[0005] 与实际执行不同,在符号执行中,程序的输入数据是一个符号,这个符号代表任何可能的输入,而不是局限某个特定的输入。程序在执行计算、拷贝、比较、分支跳转等语句时,都可以表达为对应的符号操作。符号执行在软件测试和程序证明中有着广泛的应用。

发明内容

[0006] 在传统测试方法中,普遍存在着代码覆盖率较低、测试效率低下的缺陷,无法根据实际需求,对特定的代码路径进行高效测试。有鉴于此,本发明提供了一种基于单元测试的软件脆弱性测试方法,用于发现程序潜在的设计缺陷。
[0007] 该基于单元测试的软件脆弱性测试方法是这样实现的:
[0008] 第一步:加载运行目标测试程序,即测试对象,给定目标测试程序输入,驱动目标测试程序执行;
[0009] 第二步:基于动态二进制插桩监控目标测试程序运行时状态,收集目标测试程序的运行时信息,判断目标测试程序路径各个环节的属性,识别各个代码区的属性并进行标记;
[0010] 所述的基于动态二进制插桩监控的详细步骤如下:模拟器在执行目标测试程序时,将目标测试程序翻译为等价的微指令,依据物理机器体系结构将微指令转换为本地指令执行;在指令翻译前,模拟器即可添加额外代码,完成对目标测试程序的动态插桩;动态二进制插桩包括收集指令的机器码、指令地址、目标测试程序运行上下文信息、目标测试程序溢出检查。
[0011] 第三步:分析目标测试程序路径各个环节的属性,将路径划分成各个单元,根据配置对各个单元进行符号执行,驱动目标测试程序执行不同分支;每个单元对应不同的代码区,对相应单元执行情况进行标记和归类;
[0012] 第四步:在目标测试程序执行各个不同分支路径过程中,分析路径的属性和目标测试程序的行为,基于同一根节点下的不同子路径,在各个单元上进行符号执行;基于各个单元前后执行的独立性,在每一个域上单独针对一个路径单元进行测试;
[0013] 所述的符号执行的方法为:符号执行的输入被标记为代表任意数据的符号值,目标测试程序执行过程中输入符号相关的表达式,当目标测试程序发生分支时,分支条件即可表达为输入相关的布尔方程,不同的布尔方程反应不同的目标测试程序路径反应不同的目标测试程序输入,对符号方程进行变换求解,即可以自动生成目标测试程序的输入,从而提高测试的路径覆盖率。
[0014] 第五步:基于测试需要和环境配置,对各个域提交的结果进行汇总,判断目标测试程序是否存在设计或实现缺陷。
[0015] 所述的目标测试程序是否存在缺陷是通过断言来实现的。
[0016] 本发明的有益效果为:
[0017] 基于路径各个环节的属性,将其划分成各个单元进行测试,避免了测试在无关的代码区域进行测试,而且采用虚拟化技术,可以对各个单元进行并行测试,从而极大地提高程序的测试效率。

附图说明

[0018] 图1为基于单元测试的程序脆弱性测试方案的系统框架;
[0019] 图2为基于单元测试的程序脆弱性测试方案的系统流程图;
[0020] 图3为程序路径单元划分示意图。

具体实施方式

[0021] 下面结合附图并举实施例,对本发明进行详细描述。
[0022] 本发明提供了一种基于单元测试的软件脆弱性测试方法,其基本思想是通过动态二进制插桩,将目标测试程序的执行路径根据各个环节的属性进行划分,得到多个路径单元。在测试的过程中,对单元内的目标测试程序路径或各个单元同时进行遍历测试,并汇总测试结果,从而发现目标测试程序在设计和实现方面的缺陷。
[0023] 图1为基于单元测试的程序脆弱性测试方案的系统框架。整个测试平台分成或干个域。其中域0代表整个测试的协调中心,负责单元测试任务的划分和测试结果的汇总。其他域负责各个路径单元的具体测试,并将测试结果提交至域0的单元划分模块。
[0024] 图2为基于单元测试的程序脆弱性测试方案的系统流程图。系统首先启动域0模块,然后依次加载操作系统和目标测试程序。在目标测试程序执行过程中,路径划分模块负责将各个路径单元的测试任务分配其他域,同时汇总各个域的测试结果。依据配置,系统在达到相关条件下退出,否则驱动目标继续进行测试。
[0025] 图3为程序路径单元划分示意图。程序在执行中,路径会穿越应用程序自身、库以及操作系统代码区。根据路径各个环节不同属性,将路径划分成各个子单元,如unit0,unit 1等。
[0026] 具体实现过程如下所示。
[0027] 1)加载目标测试程序
[0028] 1.1)启动域0模块,各个域都是基于虚拟化平台而实现,每个域包括虚拟机、客户操作系统、目标测试程序以及运行时监控模块。域0是整个系统的控制中心,负责启动和初始化各个域。如图1所示。
[0029] 1.2)加载目标测试程序
[0030] 目标测试程序是测试对象,启动各个域的外部环境后,需要加载和初始化目标测试程序。之后,给定目标测试程序输入,驱动目标测试程序执行。
[0031] 2)路径划分及并行测试
[0032] 2.1)动态监控
[0033] 动态监控基于动态二进制插桩技术,用于收集目标测试程序的运行时信息,判断目标测试程序路径各个环节的属性。如图3所示,目标测试程序在执行过程中,会交替穿越自身代码区、库以及系统代码区。在监控过程中,识别各个代码区的属性并进行标记。
[0034] 2.2)路径单元划分
[0035] 根据目标测试程序路径各个环节的属性,将路径划分成多个不同的单元,每个单元对应不同的代码区。根据测试需要和环境配置,对相应单元执行情况进行标记和归类。例如,对某个库的代码进行测试,那么就无需关心应用程序和操作系统代码部分,只对库代码区的各个单元进行测试。
[0036] 2.3)符号执行及并行测试
[0037] 单元划分结束后,即开始对各个单元进行符号执行。为了提高测试效率,本技术方案提出针对单元内路径和各个单元同时测试的并行方案。
[0038] 针对单元内路径。基于同一根节点下的不同子路径,在各个单元上进行符号执行。
[0039] 针对各个单元测试。基于各个单元前后执行的独立性,在每一个域上单独针对一个路径单元进行测试,从而使各个域测试并行话。
[0040] 2.4)结果汇总集筛选
[0041] 各个域的测试结束后,需要提交至域0进行汇总。路径划分模块基于测试需要和环境配置,对各个域提交的结果进行汇总。针对各个域的路径测试,可能存在交叉覆盖的情况,路径划分模块对测试结果进行筛选,同时挑选那些缺陷风险较高的新路径再次进行测试。目标测试程序已知的缺陷包括内存错误(缓冲区溢出、指针误用),并发死锁等,均可以用某种断言形式来表达。通过收集和分析目标测试程序的运行状态,在特定位置插入断言,对某些条件进行判定,若符合断言条件,则目标测试程序存在缺陷,否则目标测试程序运行正常。
[0042] 2.5)驱动目标测试程序持续测试
[0043] 为了提高目标测试程序测试路径覆盖率,需要进行都次测试。可以根据自身测试的结果路径为测试对象,再次进行路径遍历,也可以选取不同的目标测试程序输入,驱动目标测试程序执行其他路径进行测试。