基于细粒度覆盖信息引导的协议漏洞挖掘测试方法与系统

文档序号:35661559发布日期:2023-10-06 16:11阅读:41来源:国知局
基于细粒度覆盖信息引导的协议漏洞挖掘测试方法与系统

本发明属于协议自动化安全测试,具体涉及基于细粒度覆盖信息引导的协议漏洞挖掘测试方法与系统。


背景技术:

1、协议模糊测试是一种自动化的协议漏洞挖掘测试技术,它通过向待测协议实体程序输入大量随机、不合法或未预料的数据,以期发现其潜在的漏洞或异常。为了使网络协议模糊测试过程中生成的测试用例更加符合协议规范的要求,提升测试用例的接受率,并且与此同时提升对协议实体程序代码的覆盖率。近年来,相关研究工作提出了基于语法生成与覆盖信息引导的模糊测试方法,解决了协议测试过程中存在的大量报文变异操作破坏报文的结构格式的问题,以及基于语法生成的黑盒协议模糊器缺乏覆盖信息反馈指导的问题。

2、基于语法生成和覆盖信息引导的协议漏洞挖掘测试相关工作有:peach*,pavfuzz,z-fuzzer与epf等。z-fuzzer在基于语法生成的黑盒协议模糊器boofuzz上引入覆盖信息反馈来指导后续报文变异。epf使用基于群体的模拟退火在模糊化过程中启发式地调度种子库中的测试用例,对种子库中的测试用例进行重组与突变,生成新的测试用例。pavfuzz通过学习不同数据模型的两个字段之间的关系,计算更新每个可变字段的变异权重,引导模糊测试朝着覆盖率最大化的方向进行。peach*在peach的基础上引入了覆盖率反馈机制,利用触发新路径覆盖的测试用例,构造出更高质量的测试用例。

3、但是,上述基于语法生成与覆盖信息引导的协议模糊测试方法对覆盖信息的利用粒度都较粗,仅考虑覆盖率增长的情况,并未考虑测试用例覆盖了协议实体程序的哪些分支,其中有些分支可能被多次覆盖,有些分支可能很少被覆盖。如果能够充分利用这些信息,在模糊测试过程中引导模糊器更多的去探索覆盖频度较低的分支,将会提高模糊器对协议实体程序的分支探索能力,进而发现更多潜在的协议漏洞。


技术实现思路

1、本发明提出了一种基于细粒度覆盖信息引导的协议漏洞挖掘测试方法。在模糊测试过程中,依据种子覆盖分支路径的覆盖频度计算种子的权重,优先选择权重最高的种子进行变异,引导新生成的测试用例覆盖更多稀有分支;给每个被选种子赋予初始能量值,依据覆盖信息反馈动态调整能量值,然后淘汰能量值低的种子;最后,在对种子变异的过程中,保持种子原有变异,陆续变异其他字段,使生成的测试用例在触发原有分支的基础上,探索更新的分支。

2、该方法分为预处理阶段、测试准备阶段和模糊测试阶段。在预处理阶段,对待测协议实体程序进行插桩编译,得到对应的二进制可执行程序,并定义待测协议的会话模型作为模糊测试阶段的输入。在测试准备阶段,构建执行引擎、创建模糊测试过程中所需的全局数据结构并且创建每个数据模型对应的初始种子库。模糊测试阶段包含种子选择、测试用例生成和测试用例评估等过程。种子选择:根据种子库中每个种子的细粒度分支覆盖信息计算出每个种子的权重,并对种子库中的种子按权重进行从大到小的排序,优先选择出权重最大的种子作为当前生成测试用例的基准。测试用例生成:在不破坏种子有益变异的基础上生成新的测试用例,即保持种子原来触发新分支的条件不变,继续变异其它可变字段。测试用例评估:检查测试用例是否触发了崩溃或者新分支路径。如果触发了新分支路径,则将该测试用例作为新的种子与其分支覆盖信息一起存入对应种子库。如果触发了崩溃,则将该测试用例加以保存,便于对崩溃的重现与分析。

3、本发明提出了一种基于细粒度覆盖信息引导的协议漏洞挖掘测试方法,包括三个主要阶段:预处理阶段、测试准备阶段、模糊测试阶段;其中模糊测试阶段中包含种子选择、测试用例生成和测试用例评估等过程。

4、1.预处理阶段

5、1-1.对协议实体程序源码的插桩编译

6、在模糊测试过程中,为了获取到待测协议实体程序的分支覆盖情况,需要对协议实体程序源码利用aflfast自带的gcc编译工具进行插桩和编译,生成对应的二进制的可执行程序;

7、1-2.定义数据模型集合

8、通过分析待测协议对应的请求数据包并且结合待测协议规范,使用boofuzz模糊测试框架提供的数据模型定义函数来定义协议的数据模型集合modelset={model1,...,modeli,...,modeln},i=1,...,n,其中n为待测协议数据模型总数,所定义的数据模型用以作为生成对应测试用例的协议规范模板;

9、1-3.定义会话模型

10、结合待测协议规范对会话报文序列的要求,使用boofuzz模糊测试框架提供的会话模型定义函数,将步骤1-2定义的数据模型集合modelset中的数据模型连接成会话模型sessionmodels={sessionseq1,...,sessionseqj,…,sessionseqm},j=1,...,m,其中sessionseqj代表会话模型sessionmodels中的一条会话序列,会话序列由数据模型集合modelset中若干个数据模型以一定的前后顺序关系组成,m为会话模型中会话序列的数量。

11、2.测试准备阶段

12、2-1.构建执行引擎

13、执行引擎是一个用来接收模糊测试过程中产生的测试用例的独立模块,用以执行插桩编译后生成的二进制可执行程序。

14、为了记录模糊测试过程中协议实体程序每个分支被覆盖的情况,在构建执行引擎时开辟大小为xm字节的共享内存sharemem(sharemem的大小为经验值,一般设为64k字节);

15、为了单独记录当前测试用例所覆盖到的分支情况,开辟了大小同为xm字节的临时共享内存temsharemem,在模糊测试过程中,如果当前测试用例可作为新的种子,临时共享内存存储的信息即可作为该种子对协议实体程序的分支覆盖信息。

16、2-2.创建模糊测试过程中所需的全局数据结构

17、为了能够统计每个分支被覆盖的次数,创建全局整形数组brancovarr,每个数组元素统计一个分支被覆盖的次数,为了与全局共享内存相对应,整形数组的长度取xm,每个元素都为整形,为4个字节,最大取值为232-1,足以用来统计对应分支在模糊测试过程中被覆盖的次数。全局整形数组brancovarr需要占用的内存大小为4*xm字节。

18、2-3.系统预热,初始化数据模型种子库

19、2-3-1.遍历步骤1-3中定义的会话模型sessionmodels,依次遍历取出其中的会话序列sessionseqj,转向步骤2-3-2;如果会话模型已经遍历结束,则已完成系统预热工作。

20、2-3-2.依据步骤2-3-1中得到的会话序列sessionseqj中数据模型的顺序关系,遍历会话序列sessionseqj得到数据模型modeli,转向步骤2-3-3;如果针对会话序列sessionseqj的遍历工作已完成,则重置协议实体程序为初始状态并且转向步骤2-3-1。

21、2-3-3.根据步骤2-3-2中遍历得到的数据模型modeli生成未经过变异的测试用例,将其作为数据模型modeli的种子库seedbanki中的初始种子seedi0(代表种子库seedbanki中的0号种子),将其输入到执行引擎中,并且创建该种子对应的分支覆盖信息数组seedbrancovarri0,遍历临时共享内存temsharemem,如果临时共享内存对应下标位置y不为零,即对应位置的下标所代表的分支被覆盖到了,将该下标y所代表的分支添加到该种子的分支覆盖信息数组seedbrancovarri0中,并且在遍历临时共享内存temsharemem的过程中更新全局整形数组brancovarr,如果临时共享内存对应下标位置y不为零,则brancovarr[y]所存储的数据值加一,用以统计更新每个分支被覆盖的次数。最后,将种子seedi0和其对应的分支覆盖信息数组seedbrancovarri0添加到数据模型modeli对应种子库seedbanki中,seedbanki={[seedi0,seedbrancovarri0]},并且清空临时共享内存temsharemem。转向步骤2-3-2,进行下一数据模型的种子库初始化工作。

22、3.模糊测试阶段

23、3-1.数据模型选择

24、3-1-1.遍历步骤1-3中定义的会话模型sessionmodels,依次遍历取出其中的会话序列sessionseqj,转向步骤3-1-2;如果会话模型已经遍历结束,则结束模糊测试工作。

25、3-1-2.依据步骤3-1-1中得到的会话序列sessionseqj中数据模型的顺序关系,遍历会话序列sessionseqj得到数据模型modeli,作为当前模糊测试阶段使用的数据模型,转向步骤3-2;如果针对会话序列sessionseqj的遍历已完成,则转向步骤3-1-1,选择新的会话序列。

26、3-2.种子选择

27、利用步骤3-1-2中所选择的数据模型modeli所对应的种子库seedbanki中每个种子的细粒度分支覆盖信息数组seedbrancovarr计算出每个种子的权重,并对种子库中的种子按权重进行从大到小的排序,优先选择出权重最大的种子供当前模糊测试阶段使用。具体步骤如下:

28、3-2-1.遍历种子库seedbanki,计算种子权重

29、如果种子库seedbanki中无种子,则代表该数据模型modeli在现阶段已经经过了充分的模糊测试,转向步骤3-1-2,在当前会话序列sessionseqj中选择新的数据模型,作为现阶段使用的数据模型;

30、如果种子库seedbanki中仅有一个种子,则无需进行种子排序,直接转向步骤3-2-3,选择该种子作为现阶段生成新测试用例的基准;

31、否则,创建种子库seedbanki对应的权重数组seedweighti=[],初始值为空。遍历步骤3-1-2中所选择的数据模型modeli所对应的种子库seedbanki={[seedi0,seedbrancovarri0],...,[seedik,seedbrancovarrik],...,[seedit,seedbrancovarrit]},k≤1,...,t,其中t为种子库seedbanki中种子的数量,从中依次选择出一个种子seedik,并且根据种子seedik的分支覆盖信息数组seedbrancovarrik计算种子seedik的权重weightik,种子的分支覆盖信息数组seedbrancovarrik记录了种子seedik覆盖到了协议实体程序的哪些分支。计算种子的权重的公式如下所示:

32、

33、其中weightik代表种子seedik的权重,seedbrancovarrik为该种子的分支覆盖信息数组,记录了该种子覆盖到了哪些分支,该数组的长度len(seedbrancovarrik)即为该种子覆盖的分支的数量,用r取值0到length(seedbrancovarrik)-1遍历数组seedbrancovarrik,其中brancovarr[seedbrancovarrik[r]]即为seedbrancovarrik[r]所代表的分支在模糊测试过程中被覆盖的次数,将其设为w,1/w2会随着w的增大而快速逼近于0,即种子覆盖的分支在模糊测试过程中被覆盖的频度越低,该分支对种子权重weightik值的贡献越大。计算出种子seedik的权重weightik后,将其权重信息存入种子库seedbanki对应的权重数组seedweighti=[…,weightik,...]。

34、以同样的方式将遍历种子库seedbanki过程中计算得到的每个种子的权重都存入种子库seedbanki对应的权重数组seedweighti,当对种子库的遍历结束后,得到种子权重数组seedweighti=[weighti0,...,weightik,...,weightit],k=1,...,t,其中t为种子库seedbanki中种子的数量,转向步骤3-2-2。

35、3-2-2.对种子库seedbanki中种子排序

36、利用步骤3-2-1得到的种子库seedbanki对应的权重数组seedweighti=[weighti0,...,weightik,...,weightit],对种子库seedbanki={[seedi0,seedbrancovarri0],...,[seedik,seedbrancovarrik],...,[seedit,seedbrancovarrit]}中的对应种子,按权重进行由大到小的排序。

37、3-2-3.选择种子

38、从经过步骤3-2-2排序后的种子库seedbanki中选择第一个种子,即权重最大的种子作为当前阶段生成测试用例的基准。假设选择出的权重最大的种子为seedik。并且初始化该种子的能量值seedenergyik=sc,sc取值为1,初始化该种子的阈值thresholdik=0.0001。转向步骤3-3,利用该种子seedik执行测试用例生成过程。

39、3-3.测试用例生成

40、在不破坏步骤3-2中选择的最优种子seedik有益变异的基础上生成新的测试用例,即保持种子原来触发新分支的条件不变,在此基础上继续变异其它可变字段,提高新生成的测试用例的针对性,以探索更深的代码层次。具体步骤如下:

41、3-3-1.获取当前种子seedik对应的数据模型modeli中所有的可变字段在种子seedik中的值fields={field1,...,fieldp,...,fieldq},p=1,...,q,其中q为数据模型modeli中可变字段的总数量。并且初始化变异到的字段位置标记位indexb=0。

42、3-3-2.遍历在步骤3-3-1中得到的所有可变字段在种子中的值fields,假设当前遍历到的字段值为fieldp。如果在遍历fields的过程中,已经遍历到了种子的最后字段所在位置,则重置标记位indexb为0,重新开始遍历,使下一轮变异从第一个未变异的字段开始变异。

43、3-3-3.如果步骤3-3-2中遍历到的字段值fieldp是种子seedik中未经过变异的值,并且该字段是处于标记位indexb后面的字段,则利用epf的变异引擎对该字段rieldp进行变异,得到当前字段fieldp的变异结果mutated_fieldp,并且将标记位indexb置为p;否则转向步骤3-3-2继续遍历fields。

44、3-3-4.使用在步骤3-3-3中得到的当前字段fieldp的变异结果mutated_fieldp替换种子seedik对应的字段值,得到新生成的测试用例testcase。

45、3-3-5.依据当前会话序列sessionseqj得到数据模型modeli的所有前置数据模型,然后根据前置数据模型生成未经过变异的前置报文序列premessseq,将步骤3-3-4中生成的测试用例testcase与前置报文序列premessseq组成报文序列messseq,并且将报文序列messseq注入执行引擎。转向步骤3-4进行测试用例评估。

46、3-4.测试用例评估

47、监控执行引擎状态并且评估当前测试用例。如果包含新测试用例的报文序列messseq导致执行引擎崩溃,则进行崩溃报告,保存触发崩溃的测试用例testcase;并且通过分析全局共享内存,评估该测试用例是否触发了新的分支覆盖,如果触发了新的分支覆盖,则将该测试用例作为种子,临时共享内存中存储了该测试用例的分支覆盖信息,遍历临时共享内存,统计该测试用例的分支覆盖信息并将其与该测试用例一同存入种子库。具体步骤如下:

48、3-4-1.监控执行引擎状态

49、监控执行引擎状态,如果包含新测试用例的报文序列messseq导致执行引擎崩溃,则进行崩溃报告,保存触发崩溃的测试用例testcase,便于模糊测试结束后对该崩溃进行复现分析。

50、3-4-2.评估是否触发新分支

51、遍历全局共享内存sharemem,判断当前执行过的测试用例testcase是否触发了新的分支。如果全局共享内存sharemem中出现了新的非零字节,则代表触发了新的分支。

52、如果触发了新分支,则把当前的测试用例作为新的种子seedix,并且创建该种子对应的分支覆盖信息数组seedbrancovarrix,遍历临时共享内存temsharemem,如果临时共享内存对应下标位置y不为零,即对应位置的下标所代表的分支被覆盖到了,将该下标所代表的分支添加到该种子的分支覆盖信息数组seedbrancovarrix中,并且在遍历临时共享内存temsharemem的过程中更新全局整形数组brancovarr,如果临时共享内存对应下标位置y不为零,则brancovarr[y]所存储的数据值加一,用以统计更新每个分支被覆盖的次数。最后,将种子seedix和其对应的分支覆盖信息数组seedbrancovarrix添加到当前数据模型modeli对应种子库seedbanki中,并且清空临时共享内存temsharemem。

53、3-4-3.更新检查种子能量值

54、根据步骤3-4-2的评估结果,调整步骤3-2-3所选择的现阶段模板种子seedik的能量值seedenergyik。如果评估结果为触发了新分支,则将种子seedik的能量值seedenergyik更新为初始值sc;否则,将种子seedik的能量值seedenergyik更新为seedenergyik×α(α为衰减因子,取值小于1,并且大于0,取值越小,种子能量值衰减幅度越大,本方法默认取值为0.97);

55、更新后,如果现阶段模板种子seedik的能量值seedenergyik<thresholdik,则代表该种子seedik的性能已不佳,从种子库seedbanki中删除该种子和该种子的分支覆盖信息数组,并且转向步骤3-2,从种子库seedbanki中选择新的种子,作为现阶段的模板种子;如果该种子能量值seedenergyik>=thresholdik,则转向步骤3-3-2,继续利用该种子生成新的测试用例。

56、本发明的另一个目的是提供基于细粒度覆盖信息引导的协议漏洞挖掘测试系统fcifuzz(fine-grained coverage information fuzzer),如图1所示,包括:

57、预处理模块。预处理模块的主要功能为对待测协议实体程序使用aflfast自带的gcc编译工具进行插桩编译,得到对应的二进制可执行程序;使用boofuzz模糊测试框架提供的数据模型定义函数来定义协议的数据模型集合modelset,结合待测协议规范对会话报文序列的要求,将定义的数据模型集合modelset中的数据模型连接成会话模型sessionmodels,作为模糊测试阶段的输入。

58、测试准备模块。测试准备模块的主要功能为构建执行引擎、创建模糊测试过程中所需的全局整形数组brancovarr、创建每个数据模型所对应的初始种子库。

59、模糊测试模块。模糊测试模块从预处理模块定义的会话模型sessionmodels中依次选取会话序列,然后依次选取会话序列中的数据模型,得到现阶段测试的数据模型modeli,最后执行其中的种子选择模块、测试用例生成模块与测试用例评估模块:

60、种子选择模块。该模块依据数据模型modeli所对应种子库seedbanki中种子seedik的分支覆盖信息数组seedbrancovarrik和测试准备阶段创建的全局整形数组brancovarr计算种子seedik的权重weightik,并对种子库中的种子按权重进行从大到小的排序,优先选择出权重最大的种子作为当前阶段生成测试用例的基准,并且初始化所选种子的能量值seedenergyik=sc。

61、测试用例生成模块。该模块根据种子选择模块所选择出的种子seedik,在不破坏种子seedik原有有益变异的基础上生成新的测试用例testcase。并且将生成的测试用例与对应的前缀报文序列premessseq组成报文序列messseq,将报文序列messseq注入执行引擎。

62、测试用例评估模块。该模块监控执行引擎的反应情况,如果包含新测试用例testcase的报文序列messseq导致执行引擎崩溃,则进行崩溃报告,保存触发崩溃的测试用例testcase;并且通过分析全局共享内存sharemem,评估该测试用例testcase是否触发了新的分支覆盖,如果触发了新的分支覆盖,则将该测试用例作为新种子;临时共享内存temsharemem中存储了新种子的分支覆盖信息,遍历临时共享内存,统计新种子的分支覆盖信息得到新种子对应的分支覆盖信息数组seedbrancovarr,并将其与新种子一同存入当前数据模型modeli的种子库seedbanki;并且根据评估结果,更新检查当前模板种子seedik的能量值seedenergyik。

63、本发明的有益效果是:

64、1.本发明采用了基于语法生成和细粒度覆盖信息引导的协议模糊测试方法,考虑了每个种子对覆盖频度较低分支的覆盖情况,引导模糊测试工作更多的覆盖被覆盖频度较低的分支,提高了模糊测试过程中充分挖掘漏洞的能力。

65、2.本发明为了能够更快的丢弃性能不佳的种子,给每个种子一个初始的能量值,在模糊测试的过程中,动态的调整该能量值,达到更快丢弃性能不佳种子的目的。并且在对性能较好的种子变异过程中,保持种子原有的有益变异不变,陆续变异其他字段,使生成的新测试用例尽量在仍然触发原有分支的基础上,探索更新的分支。

66、3.相对于现有基于语法生成与覆盖信息引导的协议模糊测试工具,本发明提出的基于细粒度覆盖信息引导的协议模糊测试方法,可以有效地解决现有基于语法生成与覆盖信息引导的协议模糊测试工具对对测试用例覆盖信息的利用粒度较粗,不能更有效的引导模糊测试覆盖更有价值的程序分支的问题。提高了模糊测试过程中对目标程序分支的探索能力与漏洞挖掘能力。

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