首页> 中国专利> 一种基于单元测试的软件脆弱性测试方法

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

摘要

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

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-01-11

    未缴年费专利权终止 IPC(主分类):G06F11/36 授权公告日:20130424 终止日期:20151125 申请日:20111125

    专利权的终止

  • 2013-04-24

    授权

    授权

  • 2012-07-18

    实质审查的生效 IPC(主分类):G06F11/36 申请日:20111125

    实质审查的生效

  • 2012-06-13

    公开

    公开

说明书

技术领域

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

背景技术

在软件生命周期中,软件测试是非常重要的一个环节,高效完备的测试是保证软件 质量的重要手段。基于测试的粒度,软件测试可以分为系统测试、模块测试、策略级测 试。基于测试收集数据的类型,软件测试可以分为性能测试、功能测试、稳定性测试等。 此外,根据测试过程是否依赖于程序内部结构,软件测试可以分为白盒测试、黑盒测试、 灰盒测试。

基于分层和抽象的原则,计算机系统在不同层面上实现虚拟化技术,以提供多个同构 或异构的平台。在硬件、系统以及应用程序各个层次上,虚拟化提供很好的物理隔离和 逻辑隔离,并提供细粒度的运行时信息,在程序分析领域有广泛的应用。

动态二进制插桩是指在程序运行时,除了正常执行原始程序外,在相关位置插入执 行其他代码,用于完成程序运行时信息收集、分析、优化等工作。根据是否对原始程序 执行逻辑产生影响,插桩可以分为有损插桩和无损插桩。插桩技术广泛运用于程序的分 析和调试,根据是否对程序产生影响,插桩可以分为有损插桩和无损插桩,有损插桩依 据特定意图改变程序的控制流和数据流,无损插桩主要用于收集程序的运行时信息,并 不会对程序执行流产生影响。根据对象不同,插桩可分为源代码插桩和二进制插桩。前 者是在编译时,对程序的源代码插入额外代码,后者是在运行时插入代码,用于收集或 改变程序的运行状态。

与实际执行不同,在符号执行中,程序的输入数据是一个符号,这个符号代表任何 可能的输入,而不是局限某个特定的输入。程序在执行计算、拷贝、比较、分支跳转等 语句时,都可以表达为对应的符号操作。符号执行在软件测试和程序证明中有着广泛的 应用。

发明内容

在传统测试方法中,普遍存在着代码覆盖率较低、测试效率低下的缺陷,无法根据实际 需求,对特定的代码路径进行高效测试。有鉴于此,本发明提供了一种基于单元测试的软件 脆弱性测试方法,用于发现程序潜在的设计缺陷。

该基于单元测试的软件脆弱性测试方法是这样实现的:

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

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

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

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

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

所述的符号执行的方法为:符号执行的输入被标记为代表任意数据的符号值,程序 执行过程中输入符号相关的表达式,当程序发生分支时,分支条件即可表达为输入相关 的布尔方程,不同的布尔方程反应不同的程序路径反应不同的程序输入,对符号方程进 行变换求解,即可以自动生成程序的输入,从而提高测试的路径覆盖率。

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

所述的程序是否存在缺陷是通过断言来实现的。

本发明的有益效果为:

基于路径各个环节的属性,将其划分成各个单元进行测试,避免了测试在无关的代 码区域进行测试,而且采用虚拟化技术,可以对各个单元进行并行测试,从而极大地提 高程序的测试效率。

附图说明

图1为基于单元测试的程序脆弱性测试方案的系统框架;

图2为基于单元测试的程序脆弱性测试方案的系统流程图;

图3为程序路径单元划分示意图。

具体实施方式

下面结合附图并举实施例,对本发明进行详细描述。

本发明提供了一种基于单元测试的软件脆弱性测试方法,其基本思想是通过动态二 进制插桩,将程序的执行路径根据各个环节的属性进行划分,得到多个路径单元。在测 试的过程中,对单元内的程序路径或各个单元同时进行遍历测试,并汇总测试结果,从 而发现程序在设计和实现方面的缺陷。

图1为基于单元测试的程序脆弱性测试方案的系统框架。整个测试平台分成或干个 域。其中域0代表整个测试的协调中心,负责单元测试任务的划分和测试结果的汇总。 其他域负责各个路径单元的具体测试,并将测试结果提交至域0的单元划分模块。

图2为基于单元测试的程序脆弱性测试方案的系统流程图。系统首先启动域0模块, 然后依次加载操作系统和目标程序。在程序执行过程中,路径划分模块负责将各个路径 单元的测试任务分配其他域,同时汇总各个域的测试结果。依据配置,系统在达到相关 条件下退出,否则驱动目标继续进行测试。

图3为程序路径单元划分示意图。程序在执行中,路径会穿越应用程序自身、库以 及操作系统代码区。根据路径各个环节不同属性,将路径划分成各个子单元,如unit0, unit1等。

具体实现过程如下所示。

1)加载测试目标程序

1.1)启动域0模块,各个域都是基于虚拟化平台而实现,每个域包括虚拟机、客 户操作系统、目标程序以及运行时监控模块。域0是整个系统的控制中心, 负责启动和初始化各个域。如图1所示。

1.2)加载目标程序

目标程序是测试对象,启动各个域的外部环境后,需要加载和初始化目标程 序。之后,给定程序输入,驱动程序执行。

2)路径划分及并行测试

2.1)动态监控

动态监控基于动态二进制插桩技术,用于收集程序的运行时信息,判断程序 路径各个环节的属性。如图3所示,程序在执行过程中,会交替穿越自身代 码区、库以及系统代码区。在监控过程中,识别各个代码区的属性并进行标 记。

2.2)路径单元划分

根据程序路径各个环节的属性,将路径划分成多个不同的单元,每个单元对应 不同的代码区。根据测试需要和环境配置,对相应单元执行情况进行标记和归 类。例如,对某个库的代码进行测试,那么就无需关心应用程序和操作系统代 码部分,只对库代码区的各个单元进行测试。

2.3)符号执行及并行测试

单元划分结束后,即开始对各个单元进行符号执行。为了提高测试效率,本技 术方案提出针对单元内路径和各个单元同时测试的并行方案。

针对单元内路径。基于同一根节点下的不同子路径,在各个单元上进行符号执 行。

针对各个单元测试。基于各个单元前后执行的独立性,在每一个域上单独针对 一个路径单元进行测试,从而使各个域测试并行话。

2.4)结果汇总集筛选

各个域的测试结束后,需要提交至域0进行汇总。路径划分模块基于测试需要和环 境配置,对各个域提交的结果进行汇总。针对各个域的路径测试,可能存在交叉覆盖的 情况,路径划分模块对测试结果进行筛选,同时挑选那些缺陷风险较高的新路径再次进 行测试。程序已知的缺陷包括内存错误(缓冲区溢出、指针误用),并发死锁等,均可 以用某种断言形式来表达。通过收集和分析程序的运行状态,在特定位置插入断言,对 某些条件进行判定,若符合断言条件,则程序存在缺陷,否则程序运行正常。

2.5)驱动程序持续测试

为了提高程序测试路径覆盖率,需要进行都次测试。可以根据自身测试的结果路径为 测试对象,再次进行路径遍历,也可以选取不同的程序输入,驱动程序执行其他路径进行测 试。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号