使用控制变异的模糊测试覆盖率改进方法与流程

文档序号:11286134阅读:834来源:国知局
使用控制变异的模糊测试覆盖率改进方法与流程

本发明涉及一种提高模糊测试覆盖率的测试用例控制变异生成方法,属于信息安全的漏洞挖掘领域。



背景技术:

近几年来,伴随着计算机网络的发展,信息化的概念已被人们熟知,网络信息更是无处不在,网络信息技术在国民经济和国防建设中的应用越来越广泛深入,因此,承载网络信息的软件的安全性变得尤为重要。但是随着软件系统日益庞大,功能日益复杂,再加上软件从业人员安全知识不足,以及编程语言自身的安全缺陷,导致软件的安全漏洞层出不穷。在我们的生活中,经常可以听到这样的报道:某网站受到黑客攻击;某计算机系统受到攻击,造成客户数据丢失;目前又出现某计算机病毒,已扩散到全球……这些安全漏洞直接影响人们的工作和生活,侵害国民利益,甚至危害国家安全。因此,在危害发生前挖掘软件漏洞并进行修补,已经成为软件开发周期中不可或缺的重要一环。

目前为大家所熟知的漏洞挖掘技术包括补丁对比分析、面向二进制的符号执行、污点跟踪和模糊测试。其中,模糊测试技术是一种应用非常广泛的漏洞挖掘技术,它的原理是通过向目标应用程序注入畸形或意外数据,使之发生崩溃或异常行为来发现漏洞。因此模糊测试技术的核心问题是如何生成有效的畸形数据,其中高覆盖率是模糊测试有效性的重要标准。

当前比较主流的测试用例生成方法有两种,即基于规范的生成方法和基于变异的生成方法。其中基于规范的生成方法效果最好,覆盖率高,冗余度低,但是其致命缺点是在协议规范未知的情况下便无法进行数据建模,显然大部分的软件的协议规范不可能公开,因此此方法有很大的局限性。基于变异的生成方法比纯粹随机的变异生成方法有一定改善,但测试效率仍十分低下,覆盖率和冗余度均不理想。针对该问题,业界已经出现的优化方法有程序控制流分析、符号执行技术、污点跟踪与分析技术和遗传算法等。符号执行存在路径爆炸和复杂约束求解问题,难以应用到复杂软件上的测试。污点跟踪与分析技术每次只对个别路径进行测试,并且其原理导致很难做到测试的自动化;遗传算法可生成漏洞检测能力较强的测试用例,但是在用例生成与选择过程中付出高昂的时间代价。

综上分析,现有的优化模糊测试覆盖率的方法普遍存在时间代价高、测试范围不完整和自动化程度低的问题。针对这些问题,本发明将提出一种有效的模糊测试用例控制变异方法,可大大提高模糊测试覆盖率,实现快速、全面的自动化模糊测试。



技术实现要素:

本发明的目的是:针对目前优化模糊测试覆盖率方法时间代价高、测试范围不完整和自动化程度低等问题,提出一种控制变异生成测试用例的方法,使用简单高效的控制变异方法来增加代码覆盖率,无需进行大量的分析与计算,并在保证代码覆盖率的前提下,实现整体方案的自动化。

本发明的设计原理为:

考虑到程序中对数据的一种常见处理方法,即使用数值作为程序进入某个分支的判断条件。当测试用例因为变异到达某个程序分支,如果保持该变异字段的信息并声明为不可变异,将该测试用例作为种子测试用例,待到下次以该种子用例进行变异生成测试用例,将能够控制模糊测试在该探索到的新分支内进行进一步的测试。本发明使用插桩技术监控测试用例的执行路径,当有新分支出现后,记录该不可变异字段信息,控制模糊测试的变异范围。

本发明的技术方案是通过如下步骤实现的:

步骤1,提取目标程序可解析的合法文件作为初始用例,随机变异生成测试用例。

步骤1.1,提取一条目标程序可解析的合法报文作为初始用例。

步骤1.2,为该初始用例定义一个位图数据结构,其下标为字节偏移位置,若数据结构值为0,则表示该偏移位置字节可变异,若为1,则表示该偏移位置字节不可变异。此处将其初始化为0。

步骤2,对目标程序进行插桩,执行步骤1所生成的测试用例。

步骤2.1,初始用例进入控制变异模块中的随机变异模块。

步骤2.2,在随机变异模块中,对初始用例执行随机变异操作,主要以位或字节为单位,采用翻转、增减或插入的方式来使数据发生变异。

步骤3,收集插桩执行信息,生成控制信息并存入数据库。

步骤3.1,变异用例进入执行反馈模块中的插桩执行模块。

步骤3.2,生成执行路径信息。当程序进入插桩后的某个分支,将生成一个随机数作为该分支的标志值,并将该位置的元素值作加1操作,该元素值即为本次用例执行过程中该分支被执行的次数,初始值为0,同时记录该用例的执行路径,这些信息即为执行路径信息。这些信息用来与下一个测试用例的执行路径进行对比,得出是否发生分支跳转的信息。

步骤3.3,编译插桩模块将生成的执行路径信息输入控制信息生成模块。

步骤3.4,控制信息生成模块对变异用例的执行路径信息进行处理,生成控制信息。控制的组成是测试用例与不可变异字段信息。其中不可变异字段信息标志了该字段的变异是否会导致分支的改变。

步骤3.5,将生成的控制信息存储到控制信息数据库中。

步骤3.6,重复执行步骤3,直至覆盖应用程序的所有分支,并将所有控制信息存储到控制信息数据库中。

步骤4,从数据库中提取控制信息,指导种子用例进行控制变异,并进行模糊测试。

步骤4.1,从数据库中取出种子测试用例,进行初始化。

步骤4.2,对种子测试用例使用随机变异策略,指向第一个字段,查看该字段是否标记为不可变异,如果标记为不可变异,则指向下一字段,并查看不可变异标记位,如果没有标记,则对该字段进行变异,并执行fuzzing测试。

步骤4.3,查看是否发生了分支跳转。如果没有发生跳转,则指向下一个字段,并重复步骤4.2中的判断操作。如果发生了分支跳转,则保存该测试用例为种子用例,并记录不可变异信息。

有益效果

相比于目前的提高模糊测试覆盖率的方法,本专利中的测试用例变异策略控制调控方法优化了模糊测试的代码覆盖率,并且优化所耗的时间代价较低,测试范围相对完整,并且测试过程无需人工干预,具有更好的性能和效果。

附图说明

图1为本发明提出的提高模糊测试覆盖率的控制变异方法的系统原理图;

图2为本发明提出的提高模糊测试覆盖率的控制变异方法中控制变异流程图;

具体实施方式

为了更好的说明本发明的目的和优点,下面结合附图和实施用例对本发明方法的实施方式做进一步详细说明。在此,本发明的示意性实施用例及其中说明用于解释本发明,但并不作为对本发明的限定。

实施用例包含一台pc主机,参数环境为windows764位操作系统,intelcorei5cpu@3.10ghz,安装内存4gb。使用变异策略控制调控方法的程序记作msdrfuzz(mutationstrategydynamicregulationfuzz)。实验环境软件包括开源的zzuf、msdrfuzz和ffmpeg3.1.4。以下将详细描述具体实施方式步骤。

第一环节

本环节的目的是提取目标程序可解析的合法文件作为初始用例,并对测试用例进行初始化。具体实施步骤如下:

提取目标程序可解析的合法文件作为初始用例。

步骤1.1,提取一条目标程序可解析的合法报文作为初始用例。

步骤1.2,为该初始用例定义一个位图数据结构,其下标为字节偏移位置,若数据结构值为0,则表示该偏移位置字节可变异,若为1,则表示该偏移位置字节不可变异。此处将其初始化为0。

第二环节

本环节的目的是对初始用例进行随机变异。具体实施步骤如下:

步骤2.1,初始用例进入控制变异模块中的随机变异模块。

步骤2.2,在随机变异模块中,对初始用例执行随机变异操作,主要以位或字节为单位,采用翻转、增减或插入的方式来使数据发生变异。本方法采用5种变异因子,分别为flip_bit(以位为单位(1bit,2bit,4bit,8bit)的位翻转),arith(以字节为单位(1byte,2byte,4byte),将整数c加减一个整数),set_intresting(以字节为单位(1byte,2byte,4byte),将整数c设为0,1,-1,c+1,c-1),bytes_copy(超长数组复制(1byte,2byte,4byte))和bytes_delete(删除数组(1byte,2byte,4byte))。

步骤2.3,生成变异用例。

第三环节

步骤3.1,变异用例进入执行反馈模块中的插桩执行模块,本发明采用模糊测试工具afl[66](americanfuzzerlop)的编译插桩模块。

步骤3.2,生成执行路径信息。当程序进入插桩后的某个分支,将生成一个随机数作为该分支的标志值,并将该位置的元素值作加1操作,该元素值即为本次用例执行过程中该分支被执行的次数,初始值为0,同时记录该用例的执行路径,这些信息即为执行路径信息。这些信息用来与下一个测试用例的执行路径进行对比,得出是否发生分支跳转的信息。

步骤3.3,编译插桩模块将生成的执行路径信息输入控制信息生成模块。

步骤3.4,控制信息生成模块对变异用例的执行路径信息进行处理,生成控制信息。控制信息的组成是测试用例与不可变异字段信息。其中不可变异字段信息标志了该字段的变异是否会导致分支的改变。

步骤3.5,将生成的控制信息存储到控制信息数据库中。

步骤3.6,重复执行第三环节,直至覆盖应用程序的所有分支,并将所有控制信息存储到控制信息数据库中。

第四环节

本环节的目的是在控制信息数据库中测试用例的控制信息的指导下,进行控制变异操作。具体实施步骤如下:

步骤4.1,从数据库中取出种子测试用例,进行初始化。

步骤4.2,对种子测试用例使用随机变异策略,指向第一个字段,查看该字段是否标记为不可变异,如果标记为不可变异,则指向下一字段,并查看不可变异标记位,如果没有标记,则对该字段进行变异,并执行fuzzing测试。

步骤4.3,查看是否发生了分支跳转。如果没有发生跳转,则指向下一个字段,并重复步骤4.2中的判断操作。如果发生了分支跳转,则保存该测试用例为种子用例,并记录位图数据结构信息,即该字节的不可变异信息。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1