一种模糊测试种子用例变长字段修剪方法与流程

文档序号:11590214阅读:923来源:国知局

本发明涉及一种在糊测试过程中利用变长字段修剪种子测试用例的方法,属于信息安全中漏洞挖掘领域。



背景技术:

随着信息网络技术在国民经济和国防建设中扮演着越来越重要的角色,作为信息网络载体的软件的安全性变得尤为重要。但是,由于软件编写语言自身的安全性问题,软件从业人员安全知识缺乏和软件系统日益复杂等原因,使软件不可避免地存在安全漏洞。这些安全漏洞严重影响了社会秩序和损害了国民经济。因此,在危害发生前挖掘软件安全漏洞并修补越来越成为安全研究人员保障信息网络安全的重要使命。

模糊测试技术是一项非常有效的漏洞挖掘技术,它通过向目标应用程序注入畸形或意外数据,使之发生崩溃或异常行为进而发现漏洞。由于其高效快捷、部署简单、应用广泛的优秀特点,被安全研究人员和黑客广泛研究与使用。模糊测试的有效性主要依赖于测试用例的生成,数量和质量决定了模糊测试的成本和有效性。

目前模糊测试用例的主要生成方法可分为基于生成和基于变异。基于生成的方法是指通过对软件输入数据格式语法进行解析,建立用于生成测试用例的数据模板,依据模板进行局部变异而生成测试用例。由于基于生成的方法在充分理解输入数据格式语法信息下进行数据变异,因此能够获得质量较高的测试用例,并且控制测试用例的数量。该方法的缺点是需要软件输入数据的格式语法信息,但由于信息网络的安全性和隐秘性的需求,通常无法获得输入数据的格式语法信息,因此应用范围较窄。基于变异的方法是指对软件合法输入文件进行字节或比特的随机变异进而生成模糊测试用例(其中软件合法输入文件在模糊测试领域中被称作种子文件)。基于变异的方法不依赖于输入数据的格式语法信息,因此具有更加广泛的应用范围。但是,在基于变异的方法中,模糊测试生成用例的数量和质量是一个非常棘手的问题。

在基于变异的模糊测试用例生成方法中,以种子文件中的比特、字节或字为变异单位,根据以往漏洞触发原理,制定若干变异因子,逐个作用于变异单位进而生成测试用例。但是随着种子文件的增大,生成的测试用例数成倍增长。巨大数量的测试用例从两个方面直接影响模糊测试效率,其一是测试时间代价高,增加了测试的成本;其二是测试用例中存在众多等价类测试用例,等价类测试用例具有相同的测试效果,造成了测试用例的冗余。因此,如何减少在基于变异的方法中所生成的等价类测试用例,进而提高模糊测试效率具有非常重要的意义。

通过研究发现,程序的输入规范中通常含有大量的变长字段格式,变长字段格式为长度+内容。变长字段被程序作两部分解析,即分别对长度字段和紧随其后的固定长度内容进行不同的处理。内容字段的长度由紧邻相接的长度字段决定,无论内容字段长度如何,都会被作相同的处理,即覆盖相同的代码模块。在模糊测试进行变异用例生成时,对内容字段进行变异时通常获得相同的测试效果,从而导致变长字段格式中的内容长度越大,则产生的等价类测试用例越多。因此,对变长字段进行修剪能够有效地减少等价类测试用例的生成,从而降低测试用例冗余。



技术实现要素:

本发明的目的是:针对目前基于变异的模糊测试生成大量的等价类测试用例,造成了测试成本增加和测试用例冗余,提出模糊测试种子用例变长字段修剪方法,达到减少等价类测试用例的生成、降低测试用例冗余的目的,从而能够提高模糊测试的效率。

本发明的设计原理为:长度字段修剪的原理即是在不改变种子用例格式规范的前提下,减小变长字段格式中的内容长度,由此减少等价类测试用例的生成数量。其中,是否改变种子用例格式规范通过对修剪前后种子用例执行轨迹进行判断,如果修剪后的用例执行轨迹未发生改变,则判定修剪未造成该种子用例的格式发生改变。

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

步骤1,对种子用例进行预修剪,利用变长字段修剪的方法修剪种子用例,具体实现方法为:

步骤1.1,读取种子用例文件,开辟内存存放种子用例二进制格式的数据内容,并记录内容长度大小。

步骤1.2,预判断,从用例内容的第一个字段开始(根据长度字段的可能取值范围,该字段长度值可以取一个字节或两个字节大小),判断该值的长度是否大于用例内容长度,如果大于或等于,则判断其不可能为长度字段,指向下一个字段继续预判断;如果小于,则判断其可能为长度字段,进行下一步处理。

步骤1.3,修剪变长字段内容,记录该字段值为l后将其置1,并删除紧随其后的l-1个字节。

步骤1.4,回写种子用例文件,将修剪后的用例二进制内存数据写入新的种子用例文件。

步骤2,在步骤1的基础上,对修剪前后的种子用例进行插桩执行,检测预修剪后的种子用例格式规范是否被破坏,具体实现方法为:

步骤2.1,对目标程序进行插桩,在代码编译文件中的跳转指令处插入汇编代码,当程序执行到该分支处,该汇编代码可以将标识该分支被执行的固定数据写入共享内存。

步骤2.2,对初始种子文件进行插桩执行,获得共享内存中各执行分支的标识数据集合,对该集合进行校验和计算得到初始执行路径标识。

步骤2.3,对修剪后的种子文件进行插桩执行,获得共享内存中各执行分支的标识数据集合,对该集合进行校验和计算得到修剪后执行路径标识。

步骤3,基于步骤2得到的修剪前后的种子用例执行路径标识,判断修剪是否保留及下一步处理,具体实现方法为:

步骤3.1,比较修剪前后的种子用例执行路径标识,如果相同,判断修剪后的种子用例未发生格式规范上的破坏,则修剪保存;如果不同,则修剪丢弃。

步骤3.2,判断修剪是否结束,检查修剪字段是否指向用例内容的结尾,如果是,则输出此时的修剪成果作为最终的修剪输出。

步骤3.3,迭代修剪,如果修剪未结束,在本次修剪的基础上,指向下一个字段从步骤1.2开始循环执行。

有益效果

相比于目前的减小模糊测试冗余方法:第一,本发明在测试用例生成前,通过对种子用例进行修剪以减少生成的冗余测试用例数,可以与用例生成过程中使用变异算法或白盒技术减小冗余的方法并用;第二,本发明利用种子用例格式规范上的特点删除变长字段,并使用插桩执行的方式来保证格式规范的完整性,可以快速并大量地减少冗余测试用例的生成,其过程可实现自动化。该方法能够有效的减小模糊测试冗余,提高模糊测试效率。

附图说明

图1为本发明提出的变长字段修剪方法流程图;

图2为可变长字段修剪的示例,描述修剪前后的变化;

图3为本发明提出的修建方法原理图。

具体实施方式

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

实验环境是一台pc主机,参数为windows764位操作系统,intelcorei5cpu@3.10ghz,安装内存4gb。实施样本采用模糊测试工具peach提供的png图片格式文件集,具体使用开源版peachv3.1.124本身提供的数量为69个的测试样本文件(其大小范围在104~4350byte),部分文件描述如表1所示。

表1部分修剪用例样本

以converseen-0.9.5.2作为判断修剪前后实验样本执行路径有无发生改变的目标程序(converseen是一款linux平台下使用c++编写的图片处理软件)。peach具有对一个初始用例预先生成大量测试用例的功能,利用该功能在样本文件修剪前后对其实施预生成测试用例实验,以判断测试用例冗余减小情况。

第一环节

本环节的目的是利用变长字段修剪方法得到预修剪后的种子用例。修剪流程如附图1所示,具体实施步骤如下:

步骤1.1,编程实现从peach的69个png样本集中读取第一个种子用例pengbrew.png,开辟4351个字节大小的数组内存保存二进制格式的数据,并记录其内容长度大小4350。

步骤1.2,指针指向数组内存的第一个字段(该字段在两次修剪过程中分别为一个字节大小和两个字节大小),将该字段值与该内容长度大小4350进行比较。如果该字段值大于4350,说明该字段不可能为长度字段,则指向下一个字段继续进行预判断处理;如果该字段值小于4350,则进行下一步处理。

步骤1.3,如果该字段通过预判断,判为可能的长度字段,则进行如下处理:如图2所示,例如可修剪的变长字段值为0x0014;将该字段的值设置为0x0001;删除紧随其后的19个字节;将其type字段及其位置后的数组元素向前搬移,最终得到修剪后的用例。

步骤1.4,将得到的新用例内存数组回写进新的种子用例文件,并记录其长度。

第二环节

本环节的目的是利用插桩执行得到修剪后的种子用例的执行路径标识,为下一步处理提供数据。具体实施步骤如下:

步骤2.1,对目标程序converseen-0.9.5.2进行插桩,在代码编译文件中的跳转指令处插入汇编代码,当程序执行到该分支处,该汇编代码可以将标识该分支被执行的固定数据写入共享内存。

步骤2.2,对初始种子文件进行插桩执行,获得共享内存中各执行分支的标识数据集合,对该集合进行校验和计算得到初始执行路径标识,记作route0。

步骤2.3,对修剪后的种子文件进行插桩执行,获得共享内存中各执行分支的标识数据集合,对该集合进行校验和计算得到修剪后执行路径标识route1。

第三环节

本环节的目的是判断进行预修剪后的种子用例是否保持格式规范上的完整性及迭代修剪。具体实施步骤如下:

步骤3,基于步骤2得到的修剪前后的种子用例执行路径标识,判断修剪是否保留及下一步处理,具体实现方法为:

步骤3.1,比较修剪前后的种子用例执行路径标识,如果route0等于route1,判断修剪后的种子用例未发生格式规范上的破坏,则修剪保存;如果route0不等于route1,则修剪丢弃。

步骤3.2,判断修剪是否结束,检查修剪字段是否指向用例内容的结尾,如果是,则输出此时的修剪成果作为最终的修剪输出。

步骤3.3,迭代修剪,如果修剪未结束,则指向下一个字段从步骤1.2开始循环执行。

本实例实施结果说明:

(1)pengbrew.png的原用例大小4350,修剪后得到4105,减少字节数为245个;

(2)对69个用例修剪结果进行统计,可计算出变长字段修剪方法在本次实施实例中减少的冗余字节为16.01%。

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