CN109032942A - 一种基于afl的模糊测试框架 - Google Patents
一种基于afl的模糊测试框架 Download PDFInfo
- Publication number
- CN109032942A CN109032942A CN201810820851.9A CN201810820851A CN109032942A CN 109032942 A CN109032942 A CN 109032942A CN 201810820851 A CN201810820851 A CN 201810820851A CN 109032942 A CN109032942 A CN 109032942A
- Authority
- CN
- China
- Prior art keywords
- test case
- variation
- byte
- test
- afl
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于AFL的模糊测试框架,包括测试用例预处理模块和AFL处理模块;在AFL处理模块中,测试用例选择子模块从测试用例队列中依次选择下一个待变异的测试用例;选择前,根据测试用例的历史变异情况,将那些有更大概率发现新路径的测试用例标识为特权测试用例,并优先被选为待变异的测试用例;测试用例变异数量确定子模块根据测试用例的历史变异情况,调整分配给各测试用例的能量,继而调整待变异测试用例的变异数量;测试用例变异子模块根据测试用例中的有效字节,来确定变异字节;然后根据变异数量和变异字节实施变异。本发明解决了目前AFL工具在测试用例生成策略方面的盲目性问题,以及无法针对高度结构化数据格式生成有效测试用例的不足。
Description
技术领域
本发明涉及信息安全技术领域,尤其涉及一种基于AFL的模糊测试框架。
背景技术
模糊测试是一种通过构造非预期的输入并监视目标软件的异常结果来发现软件故障的方法,它可以在错误发生之前及早发现错误。模糊测试已经成为发现程序中错误和安全漏洞的最有效的测试技术之一,它已被诸如微软、谷歌等主要软件公司成功地用于安全测试和质量保证。模糊测试通常通过产生随机输入数据并在这样的输入下执行程序来测试程序,其目标是尽可能多地执行程序路径来捕捉违反断言、程序崩溃等错误。虽然模糊测试生成了许多无效的测试用例,但由于计算开销较低,因此模糊测试比诸如动态符号执行等方法更快地生成测试用例。在实践中,这种权衡已经得到了验证,模糊测试人员在广泛使用的软件中发现了许多正确性错误和安全漏洞。
AFL(American Fuzzy Lop)是当前最流行的模糊测试工具之一,2013年由Google安全工程师Michal Zalewski发布,同时开源了AFL的源码,它可以高效地对二进制程序进行模糊测试,并挖掘可能存在的安全漏洞。AFL基于用户提供的初始测试用例及变异产生的新的测试用例运行被测程序,并从这些运行中收集低开销的程序覆盖信息。需要注意的是,AFL并不会保存所有变异生成的新的测试用例,而仅仅保存那些“有趣”的测试用例,即发现新路径的测试用例。AFL基于用户提供的初始测试用例及这些“有趣”的测试用例,不断重复上述过程。AFL的基本流程如图1所示。
1把用户提供的初始测试用例加载到测试用例队列中;
2从测试用例队列中获取下一个测试用例;
3在保持程序行为的前提下,尝试将当前测试用例修剪到不改变程序测量行为的最小尺寸;
4使用传统的模糊测试策略中的各种已有方法,重复变异当前测试用例;
5如果经过某种变异生成的新的测试用例触发了新的路径,则把这一测试用例加入到上述队列中;
6如果时间用尽或用户手动终止,则停止;否则转到步骤2。
AFL虽然可以有效地发现简单的漏洞,但是对于较为复杂的漏洞却缺乏洞察力,如对于具有复杂格式的输入数据缺乏针对性。针对上述不足,本发明基于AFL工具设计了一个模糊测试框架,主要通过对AFL的测试用例预处理模块和处理模块两部分进行改进,使AFL能够生成更有效的测试用例,更为重要的是使其具有对复杂数据格式生成测试用例的能力,从而提高模糊测试的效率和漏洞发现能力。
发明内容
有鉴于此,本发明提供了一种基于AFL的模糊测试框架,主要解决了目前AFL工具在测试用例生成策略方面的盲目性问题,以及无法针对高度结构化数据格式生成有效测试用例的不足。
为了解决上述技术问题,本发明是这样实现的:
一种基于AFL的模糊测试框架,包括:测试用例预处理模块和AFL处理模块;所述AFL处理模块包括测试用例选择子模块、测试用例变异数量确定子模块和测试用例变异子模块;
所述测试用例预处理模块,用于预先生成AFL所需的初始测试用例,形成测试用例队列;
所述测试用例选择子模块,用于从测试用例队列中依次选择下一个待变异的测试用例;每次选择之前,根据测试用例的历史变异情况,将那些有更大概率发现新路径的测试用例标识为特权测试用例,特权测试用例优先被选为待变异的测试用例;
所述测试用例变异数量确定子模块,用于根据测试用例的历史变异情况,调整分配给各测试用例的能量,根据所述能量确定待变异测试用例的变异数量;
所述测试用例变异子模块,用于根据测试用例中的有效字节,来确定变异字节;然后根据变异数量和变异字节实施变异。
优选地,测试用例预处理模块,对于针对测试用例为非结构化的程序,采用AFL方法生成初始测试用例;针对测试用例为结构化的程序,通过从样本语料库中学习上下文敏感的语法概率模型来描述结构化数据的语法特征和语义规则,并通过学习的语法概率模型,生成初始测试用例。
优选地,所述测试用例选择子模块在采用AFL方法选择待变异测试用例时,引入测试用例的分支覆盖率、覆盖预测因子和路径频次三个影响因子确定测试用例的分数,根据分数确定特权测试用例;特权测试用例优先被选为待变异的测试用例;
所述分支覆盖率cov(i)是指测试用例i触发的分支数占被测程序总分支数的比例;分支覆盖率越大,被纳入特权测试用例的可能性越大;
所述覆盖预测因子pred(i)是指由同一测试用例i变异产生的测试用例中触发新路径的测试用例数量占测试用例i总变异数量的比例;覆盖预测因子越大,被纳入特权测试用例的可能性越大;
所述路径频次freq(P)是指测试用例i所触发的路径P被测试用例队列中所有测试用例执行的次数;路径频次越大,被纳入特权测试用例的可能性越小。
优选地,所述测试用例选择子模块在选择待变异测试用例时,根据是否为特权测试用例和是否被变异过,确定测试用例是否为待变异测试用例:
从测试用例队列中选取一个测试用例,判断当前测试用例是否未被变异过,或是否为特权测试用例;如果满足其中一个条件,则选择当前测试用例作为下一个用于变异的测试用例;如果都不是,则从测试用例队列中选取下一个测试用例进行判断。
优选地,所述测试用例选择子模块确定测试用例的分数的方式为:
其中,score(i)为测试用例i的分数,α(i)为AFL所确定的计算因子。
优选地,所述测试用例变异数量确定子模块针对每个测试用例i,计算该测试用例所执行路径P的路径频次freq(P)以及有效字节比例eff(i);根据路径频次freq(P)和有效字节比例eff(i)调整分配给测试用例i的能量,根据所述能量确定变异数量;其中,路径频次freq(P)越大,则分配给测试用例i的能量越小;有效字节比例eff(i)越大,则分配给测试用例i的能量越大。
优选地,所述测试用例变异数量确定子模块计算测试用例i的能量energy(i)的方式为:
其中,β(i)为AFL对测试用例i的原始能量判断,δ为常量,且δ>1;如果计算获得的能量energy(i)大于限制值M,则将M作为energy(i)的计算结果。
优选地,所述测试用例变异子模块在AFL的确定性变异阶段确定测试用例的有效字节;在确定性变异阶段,根据所述有效字节的信息确定变异字节,不变异全无效字节;在破坏性变异阶段,根据所述有效字节的信息指导变异,如果当前随机选择的字节是有效字节,则一定变异;否则给予小概率变异。
优选地,所述测试用例变异子模块确定测试用例的有效字节的方式为:在AFL的确定性变异阶段的bitfip阶段收集;在该bitfip阶段对测试用例i的全部字节逐一进行翻转生成测试用例i′,如果测试用例i′触发了新的路径,则认为被翻转的字节是有效字节;统计有效字节,并维护在有效字节表中;在变异时,利用有效字节表识别有效字节;
当测试用例小于128字节,或者测试用例中有效字节比例超过一定的数值,那么认为测试用例的所有字节都是有效字节。
优选地,所述测试用例变异子模块在确定性变异阶段,所述根据所述有效字节的信息确定变异字节为:AFL初步确定出待变异字节,根据所述有效字节的信息判断待变异字节是否为全无效字节,如果是,则忽略对待变异字节的变异;否则,将待变异字节确定为变异字节。
有益效果:
(1)本发明针对结构化的程序,利用上下文敏感的语法概率模型来描述结构化数据,以生成格式规范的测试用例,解决现有技术无法针对高度结构化数据格式生成有效测试用例的不足。
(2)针对测试用例选择、变异数量确定均使用了测试用例的历史变异信息,在测试用例变异时,根据有效字节进行,从而解决测试用例生成策略方面存在的盲目性问题。
(3)本发明方法对下一个测试用例选择的改进就是将细粒度的执行信息纳入对特权测试用例的判定中,在保留AFL判定方法的同时,将那些有更大概率发现新路径的测试用例标识为特权测试用例,即引入分支覆盖率、覆盖预测因子和路径频次三个影响因子用于对特权测试用例的判定,从而以更快的速度触发更高的覆盖率。在进行测试用例选择时,不仅考虑是否为特权测试用例,还考虑是否被变异过,从而增加各个测试用例被变异的概率,进一步减小时间和空间上的浪费,提高模糊测试效率。此外,本发明还给出了一种测试用例的分数计算公式,计算简便,容易实现。
(4)本发明通过引入路径频次以及有效字节比例两个影响因子来调节测试用例能量分配,进而实现对模糊测试变异数量的确定,从而提高模糊测试的效率及覆盖率。其次,本发明给出的能量energy(i)的计算方式,采用正比和反比的方式构建有效字节比例和路径频次与能量的关系,简单,准确,易于计算,而且采用限制值M防止产生能量分配过高的情况,保证不陷入另一种恶性循环。此外,有效字节的获取可以借用AFL现有的阶段,只要增加对有效字节表的维护即可,实现简单。
(5)在进行变异时,本发明通过使用轻量级的程序分析技术识别测试用例的有效字节,在有效字节的应用阶段,根据测试用例的有效字节确定变异字节,从而减少AFL变异的盲目性。而且,有效字节的获取简单、方便,消耗不大,能够解决现有符号执行和污点分析技术带来的资源消耗增加的问题。其中,对于确定性变异阶段,对已经确定好的字节进行判断,如果确定变异的整个字节都是无效字节,那么就跳过对该字节的变异,从而减少没有意义的变异,提高AFL的效率。对于破坏性变异阶段,如果当前随机选择的字节是有效字节,则一定变异,否则给予小概率变异,因此,使得大多变异在有效字节上发生,最大范围的提升AFL变异的针对性,进而提高AFL的效率。
附图说明
图1为AFL基本流程。
图2为总体框架图。
图3为测试用例选择的影响因子。
图4为测试用例选择流程图。
图5为测试用例变异数量的影响因子。
图6为本发明改进变异算法流程。
具体实施方式
下面结合附图并举实施例,对本发明进行详细描述。
本发明针对现有的AFL工具在测试用例生成策略方面存在的盲目性问题以及无法为结构化复杂数据生成测试用例的不足,提出一种基于AFL的模糊测试框架。该框架主要对AFL的两个主要模块进行改进,分别是测试用例预处理模块和AFL处理模块(如图2所示)。程序的测试用例可以简单地分为结构化测试用例和非结构化测试用例,对于那些接收结构化测试用例的程序,测试用例预处理模块主要通过学习样本文件的语法及语义规则以生成符合规范的测试用例;AFL处理模块主要通过对AFL的测试用例选择、测试用例变异数量确定及变异算法进行改进,以变异并生成更有效的测试用例,从而发现较为深层次的漏洞。
结构化测试用例预处理:AFL无法为结构化文件生成高效的初始测试用例,因而在模糊测试的早期阶段便被拒绝,本发明通过预先生成的方式来为AFL提供初始测试用例。
测试用例选择:AFL按测试用例加入队列的顺序依次选择下一个用于变异的测试用例,为了提高AFL的效率,本发明对下一个测试用例选择的改进就是将细粒度的执行信息纳入对特权测试用例的判定中,在保留AFL判定方法的同时,将那些有更大概率发现新路径的测试用例标识为特权测试用例,即引入分支覆盖率、覆盖预测因子和路径频次三个影响因子用于对特权测试用例的判定,从而以更快的速度达到更高的覆盖率。
测试用例变异数量确定:AFL对于每次变异生成的测试用例数量是固定的,但不同的测试用例对于提高路径覆盖率及发现漏洞的贡献有所不同,故对其变异的数量投入也应不同,本发明通过引入路径频次以及有效字节比例两个影响因子来调节测试用例能量分配,进而实现对模糊测试变异数量的确定,从而提高模糊测试的效率及覆盖率。
变异算法的改进:AFL的变异算法具有盲目性,本发明通过使用轻量级的程序分析技术识别测试用例的有效字节,在有效字节的应用阶段,根据测试用例的有效字节确定变异字节,从而减少AFL变异的盲目性。
下面针对本发明各个模块的改进方式进行详细描述。
1、测试用例预处理模块
在测试用例预处理模块中,测试用例主要分为两种情况,一种是非结构化程序的测试用例,一种是结构化程序的测试用例。针对测试用例为非结构化的程序,AFL可以为其生成初始测试用例,然后输入到AFL处理模块中进行基于变异的模糊测试。然而,针对测试用例为结构化的程序,AFL无法为其生成具有符合语法格式的初始测试用例,因此需要对具有结构化的程序进行预处理。本发明的工作主要是在AFL工具的输入模块部分增加了对结构化程序测试用例的预处理,使其能够对高度结构化程序进行模糊测试,如XML,XSL,JavaScript,HTML等文件。具体来说,本发明的框架主要通过从样本语料库中学习一种上下文敏感的语法概率模型,参见Wang J,Chen B,Wei L,et al.Skyfire:Data-Driven SeedGeneration for Fuzzing[C]//Security and Privacy.IEEE,2017:579-594.,来描述高度结构化数据的语法特征和语义规则,并通过上述学习的语法概率模型,实现了基于上下文敏感的语法概率模型的测试用例生成算法,以此生成格式规范的测试用例。
2、AFL处理模块
在上一步中,测试用例预处理模块对结构化格式文件的测试用例进行预处理,其生成的测试用例作为AFL的初始输入,以进行模糊测试的后续步骤,即AFL处理模块。AFL处理模块包括测试用例选择子模块、测试用例变异数量确定子模块、测试用例变异子模块。为了进一步提高AFL的效率,AFL处理模块主要通过对这三个子模块的测试用例选择、测试用例变异数量确定及变异算法分别进行改进,进而变异并生成更为有效的测试用例。
(1)测试用例选择子模块
本发明提供的方案对下一个测试用例选择的改进就是将细粒度的执行信息纳入对特权测试用例的判定中,在保留AFL判定方法的同时,根据之前变异发现新路径的信息来预测相应测试用例后续产生新路径的概率,将那些有更大概率发现新路径的测试用例标识为特权测试用例,并优先选择,进而提高AFL的模糊测试效率。
因此,本发明在测试用例选择子模块中引入分支覆盖率、覆盖预测因子和路径频次三个影响因子用于对特权测试用例的判定,特权测试用例优先被选为待变异的测试用例。三个影响因子与AFL已有影响因子的关系如图3所示。
根据上述选择,确定了特权测试用例后,本发明进一步结合是否被变异过,来对测试用例是否进入变异阶段进行判读和选择。判读方式如图4所示。在选择下一个测试用例之前,首先会重新判断特权测试用例,并根据特权测试用例的判定结果进行标记,每次从测试用例队列中提取出一个测试用例,如果当前测试用例为特权测试用例或未曾变异过,就选择该测试用例作为下一个用于变异的测试用例,否则选取队列中的下一个测试用例进行上述操作。
本发明选择这三个影响因子的原因是:
分支覆盖率,指的是当前测试用例触发的分支数占被测程序总分支数的比例,分支覆盖率越大,代表着测试用例触发的路径分支越多,被纳入特权测试用例的可能性应该越大。本发明方法将分支覆盖率用于特权测试用例的判定是由于:(1)AFL本身对分支覆盖信息进行了收集,使用时不需要新增计算量;(2)对分支覆盖率越高的测试用例进行变异,发现新路径的可能性就越大。故基于分支覆盖率越大,被纳入特权测试用例的可能性越大的原则,本发明将分支覆盖率较高的测试用例判定为特权测试用例,优先对其进行变异。
覆盖预测因子,是指由同一测试用例变异产生的测试用例中发现新路径的测试用例数量占总变异数量的比例。覆盖预测因子通过收集测试用例变异的信息,根据先前发现新路径的比例来判断当前测试用例产生新路径的可能性。故基于覆盖预测因子越大,被纳入特权测试用例的可能性越大的原则,本发明对于覆盖预测因子较大的测试用例,将其纳入特权测试用例,优先进行变异。
路径频次,表示的是测试用例队列中执行相同路径的测试用例个数。路径频次高的测试用例意味着在队列中有大量的测试用例与当前测试用例有相同的路径,那么对这些路径进行变异的概率本身已经很高,如果不对该现象进行一定程度的控制,就有可能会导致覆盖相同路径的测试用例越来越多,不利于分支覆盖率的提高。故基于路径频次越大,被纳入特权测试用例的可能性越小的原则,本发明将路径频次较低的测试用例判定为特权测试用例,优先对其进行变异。
对三个新增影响因子的具体计算方式为:
定义1测试用例:设定符号i为测试用例。
定义2测试用例队列:设定非空集合Q,表示用于模糊测试的所有测试用例的集合。对于测试用例i都有可能被用于后续变异。
定义3分支:设定符号b代表分支;如果有两个基本块A、B,那么A→B代表基本块A到基本块B的转换,即使用分支b(A→B)来指代上述基本块的转换。分支与路径不同,路径包含多个分支。
定义4触发分支:代表测试用例i触发分支b,表示在测试用例i执行被测程序的过程中触发了分支b。
定义5位图:设定符号map代表位图,对于测试用例队列中的任意测试用例,都维护一个位图,即本发明方法为每一个测试用例维护一个位图,主要用于记录测试用例i触发的各分支及分支触发次数;map(i)b≠0代表该位图对应的测试用例i触发分支b,即且map(i)b的值代表测试用例i触发分支b的次数。
本发明方法同时还维护一个全局位图map,它满足公式1,其中,map(i)代表测试用例i的位图。
map=Ui∈Qmap(i) 公式1
定义6路径:设定符号P代表路径,路径P包含了许多分支,可以认为路径P是特定分支的集合。路径P表示执行被测程序的过程中命中分支的集合,代表测试用例i执行路径P,b∈P代表路径P包含分支b,P={b1,b2,…,bn},其中n为整数。
定义7有效变异:设定有限集合Mvalid(i),该集合包含了由测试用例i变异生成的测试用例中发现新路径的那些测试用例,Mvalid(i)={i1′,i′2,…,i′n},其中n为整数,i′n代表由i的第n个有效变异生成的测试用例。
定义8分支覆盖率:分支覆盖率代表测试用例触发分支数占被测程序总分支数的比例。分支覆盖率具体计算如公式2:
其中,cov(i)代表了测试用例i的分支覆盖率,COUNT(a,c)是计数函数,a为被计数的参数,c代表条件,COUNT(a,c)表示统计满足条件c的a的个数;测试用例i执行路径P,即map(i)b≠0表示测试用例i触发分支b,即则COUNT(b,map(i)b≠0)表示测试用例i触发的分支数量,其通过统计位图map(i)记载的测试用例触发的各分支信息实现,size(map)表示全局位图中分支的个数,其通过查询全局位图实现。
定义9覆盖预测因子:将先前的变异信息应用于测试用例选择,根据之前变异发现新路径的比例来预测对应测试用例后续产生新路径的概率,在测试用例每次被变异时,通过统计该测试用例的有效变异次数和该测试用例的总变异次数得到覆盖预测因子。每次选择测试用例变异时,覆盖预测因子都随之发生改变。如果当前测试用例的变异结果能够发现新路径,则其有效变异次数累加1。
pred(i)代表测试用例i的覆盖预测因子,覆盖预测因子表示由i变异产生的测试用例中发现新路径的测试用例数量占总变异测试用例数量的比例,覆盖预测因子pred(i)满足公式3。
其中,count(j,j∈Mvalid)代表有效变异的个数;s代表i在确定性阶段被变异的次数,len(i)代表测试用例i的长度,s·len(i)即在确定性阶段对测试用例i的变异次数;energy(i)代表测试用例i的能量,即在破坏性变异阶段对测试用例i的变异次数,energy(i)的计算方式可以采用常规的公式:
其中,energy(i)为AFL分配给测试用例i的能量;orig为常量,表示初始分配能量,通常取100;m代表测试用例队列中所有测试用例的总执行时间;c代表队列中所有测试用例分支覆盖率的总和;cov(i)代表测试用例i的分支覆盖率,dep(i)为测试用例i的测试深度;time(i)代表测试用例i的执行时间。
定义10路径频次:freq(P)代表测试用例队列中执行路径P的测试用例数量,路径频次的计算公式如公式4:
针对测试用例i选取路径频次时,选择测试用例i所触发的路径P的路径频次。
基于三个影响因子的特权测试用例判定过程具体为:
AFL本身对于特权测试用例的判定较为简单,设定Q为测试用例队列,对于测试用例i∈Q,其分值计算公式如公式5。
α(i)=time(i)·len(i) 公式5
其中,time(i)代表测试用例i的执行时间,len(i)代表测试用例i的长度。
本发明方法对于特权测试用例的判定在AFL的基础上加入了分支覆盖率、覆盖预测因子以及路径频次三个影响因子,对于测试用例i,其执行的路径为P,即则测试用例i的分数score(i)为:
其中,α(i)为AFL的计算因子,其计算公式,见公式5;cov(i)为分支覆盖率,其公式见公式2;pred(i)为覆盖预测因子,其计算公式见公式3;freq(P)为路径频次,其计算公式见4。在对特权测试用例判定时,根据每个测试用例的分数score(i)判定其质量,测试用例分数越高,代表着测试用例质量越高。测试用例的质量大于某一设定值,则判定为特权测试用例。
获得特权测试用例后,再按照图4示出的方法进行待变异测试用例的选择,具体过程已经在上文有具体描述,这里不赘述。
(2)测试用例变异数量确定子模块
本测试用例变异数量确定子模块的改进点是:在AFL进行用于确定变异数量的能量分配时,引入路径频次freq(P)及有效字节比例eff(i)两个影响因子实现对变异数量的分配。如图5所示。
路径频次freq(P)在上文已经介绍过,其代表测试用例队列中执行路径P的测试用例数量。本发明方法在每当有新的测试用例加入测试用例队列时,对比新加入的测试用例与队列中原有的测试用例,如果路径相同则路径频次加1。
路径频次随着模糊测试的进行而动态变化。对于路径频次freq(P)大于设定频次上限的路径称为高频路径,对于路径频次freq(P)小于设定频次下限的路径称为低频路径。如果赋予高频路径高的能量,就会导致该路径被变异的次数增多,进而导致执行该路径的测试用例越来越多,进入恶性循环。
那么,本发明为了纠正这种恶性循环,根据路径频次freq(P)调整测试用例i的能量分配,按照路径频次freq(P)的大小调整对能量的分配,路径频次freq(P)越大,则分配给测试用例i的能量越小。
有效字节比例代表了测试用例中可能造成执行路径发生改变的字节比例。假定测试用例i执行的路径为P,对测试用例i的全部字节byte逐一进行翻转生成测试用例i′,如果测试用例i′触发了新的路径,则认为被翻转的字节是有效字节。那么对于测试用例i,其有效字节比例eff(i)表示测试用例i中有效字节数占测试用例i字节总数的比例。其中,有效字节数可以在AFL的确定性变异阶段的bitfip阶段获取。在该阶段,对测试用例i的全部字节逐一进行翻转生成测试用例i′,如果测试用例i′执行新的路径,则认为被翻转的字节是有效字节;在翻转的过程中统计有效字节,并维护有效字节表。然后在需要时,计算出有效字节比例eff(i)即可。
如果赋予有效字节比例低的测试用例高的能量,就有很大的可能造成大量能量浪费在对无效字节的变异上。
因此,本发明方法在进行到AFL的字节翻转变异阶段时,统计有效字节比例eff(i)。根据有效字节比例eff(i)调整测试用例i的能量分配,有效字节比例eff(i)越大,则分配给测试用例i的能量越大。
基于上述分析,本发明具体实施方式给出了一种如何根据路径频次freq(P)和有效字节比例eff(i)调整测试用例i的能量分配的方式,其计算公式为:
其中,β(i)为AFL对测试用例i的原始能量判断,β(i)的计算见下式;δ为常量,且δ>1;M为常量,为了防止分配过高的能量,故对energy(i)>M的能量都赋予最高值M。
AFL的具体能量计算公式如下:
其中,β(i)为AFL分配给测试用例i的能量;orig为常量,表示初始分配能量,通常取100;m代表测试用例队列中所有测试用例的总执行时间;c代表测试用例队列中所有测试用例已触发的分支数总和;cov(i)代表测试用例i的分支覆盖率,dep(i)为测试用例i的测试深度;time(i)代表测试用例i的执行时间。
获得energy(i)后,AFL就可以根据能量确定变异数量了。
至此,就完成了一轮变异数量的确定。
(3)测试用例变异子模块
本申请人通过分析发现,测试用例多数以文件的形式给出,一般来说文件可以分为元数据和数据两部分,元数据是用于描述数据的数据,主要用于描述数据的相关信息,如文件名、文件大小、文件所在数据块、数据块大小、文件类型等等。文件解析工具首先会读取元数据,再根据元数据中携带的信息对数据进行读取并处理。相对于数据的变异,元数据的变异更有可能触发新的路径,故对元数据的变异所带来的性价比更高。举例来说,对一张PNG格式的图进行变异,即使变异所有的RGB字节得到的只是一张看上去完全不同的图片,并没有造成执行路径的不同。因此如果能尽量变异元数据的部分,或者尽量变异能够带来新路径的部分,则能够更有效率的获得有效的测试用例。
而有效字节就具有上述元数据特征。有效字节和无效字节进行区分的标准是:只有那些被翻转时造成执行路径与原始路径不一致的字节才被认为是有效字节,而不会造成路径发生改变的字节是无效字节。
基于上述分析,本发明测试用例变异子模块的改进点在于,如图6所示,在确定性变异阶段收集测试用例的有效字节信息并进行标记,在AFL的破坏性变异阶段和确定性变异阶段,根据上述标记的测试用例的有效字节确定变异字节。图6中所指的字节不一定是单字节,还可能是双字节、四字节。这样遵循的原理是:只有那些被翻转时造成执行路径发生改变的字节才有可能触发新的路径,而被变异的字节中包含全部或部分有效字节,因此能够提高模糊测试的效率,而且有效字节的获取简单、方便,消耗不大。
下面针对测试用例变异子模块的实施过程进行详细描述。
步骤一、通过确定性变异阶段的字节翻转阶段实现对有效字节信息的收集。
在变异阶段,如果确定性阶段没有被跳过,首先进行的就是按位翻转阶段——bitflip,此阶段能够根据不同的步长进行多种不同的翻转。本发明利用该确定性变异阶段的bitfip阶段收集有效字节。在该阶段对测试用例i的全部字节逐一进行翻转生成测试用例i′,如果测试用例i′触发新的路径,则认为被翻转的字节是有效字节。传统AFL在确定性变异阶段使用完有效字节之后就丢弃了,本发明需要增加的操作是:统计有效字节,并维护在有效字节表中。这样在后续的变异操作时,能够利用有效字节表识别有效字节。
不过,在一些特殊情况下,不会进行上述操作:如果测试用例文件小于128字节,则直接认定所有字节都是有效字节。或者,当已经判定某个测试用例中的有效字节比例超过一定的数值(例如90%)时,那么认为该测试用例的所有字节都是有效字节。
步骤二、将有效字节信息应用于确定性变异阶段的变异操作。
确定性变异阶段包含arithmetic和interest两个部分。其中,该arithmetic为整数加/减运算阶段,即在确定性变异阶段对字节值进行加减一个值,以改变原测试用例;interest为感兴趣值替换阶段,感兴趣部分的确定是在测试用例输入时由AFL确定的,然后用感兴趣值替换原测试用例中的值。
本发明方法在确定性变异阶段中的arithmetic、interest两个阶段会用到上述生成的有效字节表。这两个阶段会按照现有的策略确定出需要确定性变异的字节,本发明要做的是判断确定性变异的整个字节是否为无效字节,如果确定性变异的整个字节都是无效字节,那么就跳过对该字节序列的变异。
步骤三、将有效字节信息应用于破坏性变异阶段的变异操作。
havoc是破坏性阶段,在AFL中,该阶段会随机对测试用例进行多轮变异,每一轮的变异由16种方式组合而成,如随机选取某个位进行翻转。
本发明在havoc阶段通过有效字节表对变异操作进行改进。该阶段随机选取字节,如果当前随机选择的字节是有效字节,则一定进行变异;否则,给予小概率变异。可以给予一个小于p的随机概率进行变异,p是根据实验调参决定的。相对之前完全随机的选择,元数据被变异的概率提高了,触发新路径的概率也就随即提高。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种基于AFL的模糊测试框架,其特征在于,包括:测试用例预处理模块和AFL处理模块;所述AFL处理模块包括测试用例选择子模块、测试用例变异数量确定子模块和测试用例变异子模块;
所述测试用例预处理模块,用于预先生成AFL所需的初始测试用例,形成测试用例队列;
所述测试用例选择子模块,用于从测试用例队列中依次选择下一个待变异的测试用例;每次选择之前,根据测试用例的历史变异情况,将那些有更大概率发现新路径的测试用例标识为特权测试用例,特权测试用例优先被选为待变异的测试用例;
所述测试用例变异数量确定子模块,用于根据测试用例的历史变异情况,调整分配给各测试用例的能量,根据所述能量确定待变异测试用例的变异数量;
所述测试用例变异子模块,用于根据测试用例中的有效字节,来确定变异字节;然后根据变异数量和变异字节实施变异。
2.如权利要求1所述的框架,其特征在于,测试用例预处理模块,对于针对测试用例为非结构化的程序,采用AFL方法生成初始测试用例;针对测试用例为结构化的程序,通过从样本语料库中学习上下文敏感的语法概率模型来描述结构化数据的语法特征和语义规则,并通过学习的语法概率模型,生成初始测试用例。
3.如权利要求1所述的框架,其特征在于,所述测试用例选择子模块在采用AFL方法选择待变异测试用例时,引入测试用例的分支覆盖率、覆盖预测因子和路径频次三个影响因子确定测试用例的分数,根据分数确定特权测试用例;特权测试用例优先被选为待变异的测试用例;
所述分支覆盖率cov(i)是指测试用例i触发的分支数占被测程序总分支数的比例;分支覆盖率越大,被纳入特权测试用例的可能性越大;
所述覆盖预测因子pred(i)是指由同一测试用例i变异产生的测试用例中触发新路径的测试用例数量占测试用例i总变异数量的比例;覆盖预测因子越大,被纳入特权测试用例的可能性越大;
所述路径频次freq(P)是指测试用例i所触发的路径P被测试用例队列中所有测试用例执行的次数;路径频次越大,被纳入特权测试用例的可能性越小。
4.如权利要求3所述的框架,其特征在于,所述测试用例选择子模块在选择待变异测试用例时,根据是否为特权测试用例和是否被变异过,确定测试用例是否为待变异测试用例:
从测试用例队列中选取一个测试用例,判断当前测试用例是否未被变异过,或是否为特权测试用例;如果满足其中一个条件,则选择当前测试用例作为下一个用于变异的测试用例;如果都不是,则从测试用例队列中选取下一个测试用例进行判断。
5.如权利要求3所述的框架,其特征在于,所述测试用例选择子模块确定测试用例的分数的方式为:
其中,score(i)为测试用例i的分数,α(i)为AFL所确定的计算因子。
6.如权利要求1所述的框架,其特征在于,所述测试用例变异数量确定子模块针对每个测试用例i,计算该测试用例所执行路径P的路径频次freq(P)以及有效字节比例eff(i);根据路径频次freq(P)和有效字节比例eff(i)调整分配给测试用例i的能量,根据所述能量确定变异数量;其中,路径频次freq(P)越大,则分配给测试用例i的能量越小;有效字节比例eff(i)越大,则分配给测试用例i的能量越大。
7.如权利要求6所述的框架,其特征在于,所述测试用例变异数量确定子模块计算测试用例i的能量energy(i)的方式为:
其中,β(i)为AFL对测试用例i的原始能量判断,δ为常量,且δ>1;如果计算获得的能量energy(i)大于限制值M,则将M作为energy(i)的计算结果。
8.如权利要求1所述的框架,其特征在于,所述测试用例变异子模块在AFL的确定性变异阶段确定测试用例的有效字节;在确定性变异阶段,根据所述有效字节的信息确定变异字节,不变异全无效字节;在破坏性变异阶段,根据所述有效字节的信息指导变异,如果当前随机选择的字节是有效字节,则一定变异;否则给予小概率变异。
9.如权利要求8所述的框架,其特征在于,所述测试用例变异子模块确定测试用例的有效字节的方式为:在AFL的确定性变异阶段的bitfip阶段收集;在该bitfip阶段对测试用例i的全部字节逐一进行翻转生成测试用例i′,如果测试用例i′触发了新的路径,则认为被翻转的字节是有效字节;统计有效字节,并维护在有效字节表中;在变异时,利用有效字节表识别有效字节;
当测试用例小于128字节,或者测试用例中有效字节比例超过一定的数值,那么认为测试用例的所有字节都是有效字节。
10.如权利要求8所述的框架,其特征在于,所述测试用例变异子模块在确定性变异阶段,所述根据所述有效字节的信息确定变异字节为:AFL初步确定出待变异字节,根据所述有效字节的信息判断待变异字节是否为全无效字节,如果是,则忽略对待变异字节的变异;否则,将待变异字节确定为变异字节。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810820851.9A CN109032942B (zh) | 2018-07-24 | 2018-07-24 | 一种基于afl的模糊测试框架 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810820851.9A CN109032942B (zh) | 2018-07-24 | 2018-07-24 | 一种基于afl的模糊测试框架 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109032942A true CN109032942A (zh) | 2018-12-18 |
CN109032942B CN109032942B (zh) | 2020-10-02 |
Family
ID=64644740
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810820851.9A Active CN109032942B (zh) | 2018-07-24 | 2018-07-24 | 一种基于afl的模糊测试框架 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109032942B (zh) |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109596927A (zh) * | 2018-12-29 | 2019-04-09 | 蜂巢能源科技有限公司 | 用于电池管理系统bms的测试方法和测试系统 |
CN109739755A (zh) * | 2018-12-27 | 2019-05-10 | 北京理工大学 | 一种基于程序追踪和混合执行的模糊测试系统 |
CN109885479A (zh) * | 2019-01-07 | 2019-06-14 | 中国人民解放军战略支援部队信息工程大学 | 基于路径记录截断的软件模糊测试方法及装置 |
CN110162472A (zh) * | 2019-05-08 | 2019-08-23 | 安徽工业大学 | 一种基于fuzzing测试的测试用例生成方法 |
CN110175120A (zh) * | 2019-05-20 | 2019-08-27 | 北京理工大学 | 一种基于强化学习的模糊测试用例自适应变异方法和装置 |
CN111338952A (zh) * | 2020-02-25 | 2020-06-26 | 杭州世平信息科技有限公司 | 一种路径覆盖率反馈的模糊测试方法及装置 |
CN111581106A (zh) * | 2020-05-12 | 2020-08-25 | 全球能源互联网研究院有限公司 | 二进制程序漏洞测试方法、装置及可读存储介质 |
CN111897733A (zh) * | 2020-08-07 | 2020-11-06 | 北京理工大学 | 一种基于最小集合覆盖的模糊测试方法和装置 |
CN111897735A (zh) * | 2020-08-07 | 2020-11-06 | 北京理工大学 | 基于粒子群和多标准的模糊测试用例选择方法和装置 |
CN111897729A (zh) * | 2020-08-03 | 2020-11-06 | 北京理工大学 | 基于TensorFuzz的深度神经网络模糊测试框架和测试方法 |
CN112069061A (zh) * | 2020-08-19 | 2020-12-11 | 北京科技大学 | 深度学习梯度指导变异的软件安全漏洞检测方法及系统 |
CN112445709A (zh) * | 2020-11-30 | 2021-03-05 | 安徽工业大学 | 一种通过gan解决afl测试模型数据不平衡的方法及装置 |
CN113111351A (zh) * | 2020-01-10 | 2021-07-13 | 中国电信股份有限公司 | 测试方法、装置和计算机可读存储介质 |
CN114546816A (zh) * | 2020-11-25 | 2022-05-27 | 腾讯科技(深圳)有限公司 | 一种测试方法、平台、装置、电子设备及存储介质 |
CN114661577A (zh) * | 2022-01-26 | 2022-06-24 | 天津大学 | 一种基于确定性策略与覆盖引导的模糊测试方法及工具 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103605611A (zh) * | 2013-12-10 | 2014-02-26 | 浪潮电子信息产业股份有限公司 | 一种基于遗传算法的测试用例优化方法 |
EP3109763A1 (en) * | 2015-06-24 | 2016-12-28 | Tata Consultancy Services Limited | Method and system for generating functional test cases for software systems |
CN107241226A (zh) * | 2017-06-29 | 2017-10-10 | 北京工业大学 | 基于工控私有协议的模糊测试方法 |
-
2018
- 2018-07-24 CN CN201810820851.9A patent/CN109032942B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103605611A (zh) * | 2013-12-10 | 2014-02-26 | 浪潮电子信息产业股份有限公司 | 一种基于遗传算法的测试用例优化方法 |
EP3109763A1 (en) * | 2015-06-24 | 2016-12-28 | Tata Consultancy Services Limited | Method and system for generating functional test cases for software systems |
CN107241226A (zh) * | 2017-06-29 | 2017-10-10 | 北京工业大学 | 基于工控私有协议的模糊测试方法 |
Non-Patent Citations (2)
Title |
---|
JUNJIE WANG等: "Skyfire: Data-Driven Seed Generation for Fuzzing", 《2017 IEEE SYMPOSIUM ON SECURITY AND PRIVACY》 * |
蔡军等: "基于改进轮盘赌策略的反馈式模糊测试方法", 《四川大学学报》 * |
Cited By (26)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109739755A (zh) * | 2018-12-27 | 2019-05-10 | 北京理工大学 | 一种基于程序追踪和混合执行的模糊测试系统 |
CN109596927A (zh) * | 2018-12-29 | 2019-04-09 | 蜂巢能源科技有限公司 | 用于电池管理系统bms的测试方法和测试系统 |
CN109885479A (zh) * | 2019-01-07 | 2019-06-14 | 中国人民解放军战略支援部队信息工程大学 | 基于路径记录截断的软件模糊测试方法及装置 |
CN109885479B (zh) * | 2019-01-07 | 2022-02-01 | 中国人民解放军战略支援部队信息工程大学 | 基于路径记录截断的软件模糊测试方法及装置 |
CN110162472B (zh) * | 2019-05-08 | 2022-08-12 | 安徽工业大学 | 一种基于fuzzing测试的测试用例生成方法 |
CN110162472A (zh) * | 2019-05-08 | 2019-08-23 | 安徽工业大学 | 一种基于fuzzing测试的测试用例生成方法 |
CN110175120A (zh) * | 2019-05-20 | 2019-08-27 | 北京理工大学 | 一种基于强化学习的模糊测试用例自适应变异方法和装置 |
CN110175120B (zh) * | 2019-05-20 | 2020-11-27 | 北京理工大学 | 一种基于强化学习的模糊测试用例自适应变异方法和装置 |
CN113111351B (zh) * | 2020-01-10 | 2023-10-17 | 中国电信股份有限公司 | 测试方法、装置和计算机可读存储介质 |
CN113111351A (zh) * | 2020-01-10 | 2021-07-13 | 中国电信股份有限公司 | 测试方法、装置和计算机可读存储介质 |
CN111338952A (zh) * | 2020-02-25 | 2020-06-26 | 杭州世平信息科技有限公司 | 一种路径覆盖率反馈的模糊测试方法及装置 |
CN111338952B (zh) * | 2020-02-25 | 2024-03-29 | 杭州世平信息科技有限公司 | 一种路径覆盖率反馈的模糊测试方法及装置 |
CN111581106A (zh) * | 2020-05-12 | 2020-08-25 | 全球能源互联网研究院有限公司 | 二进制程序漏洞测试方法、装置及可读存储介质 |
CN111581106B (zh) * | 2020-05-12 | 2023-05-23 | 全球能源互联网研究院有限公司 | 二进制程序漏洞测试方法、装置及可读存储介质 |
CN111897729B (zh) * | 2020-08-03 | 2022-08-19 | 北京理工大学 | 基于TensorFuzz的深度神经网络模糊测试框架和测试方法 |
CN111897729A (zh) * | 2020-08-03 | 2020-11-06 | 北京理工大学 | 基于TensorFuzz的深度神经网络模糊测试框架和测试方法 |
CN111897735B (zh) * | 2020-08-07 | 2022-11-11 | 北京理工大学 | 基于粒子群和多标准的模糊测试用例选择方法和装置 |
CN111897733B (zh) * | 2020-08-07 | 2023-04-07 | 北京理工大学 | 一种基于最小集合覆盖的模糊测试方法和装置 |
CN111897735A (zh) * | 2020-08-07 | 2020-11-06 | 北京理工大学 | 基于粒子群和多标准的模糊测试用例选择方法和装置 |
CN111897733A (zh) * | 2020-08-07 | 2020-11-06 | 北京理工大学 | 一种基于最小集合覆盖的模糊测试方法和装置 |
CN112069061A (zh) * | 2020-08-19 | 2020-12-11 | 北京科技大学 | 深度学习梯度指导变异的软件安全漏洞检测方法及系统 |
CN114546816A (zh) * | 2020-11-25 | 2022-05-27 | 腾讯科技(深圳)有限公司 | 一种测试方法、平台、装置、电子设备及存储介质 |
CN112445709A (zh) * | 2020-11-30 | 2021-03-05 | 安徽工业大学 | 一种通过gan解决afl测试模型数据不平衡的方法及装置 |
CN112445709B (zh) * | 2020-11-30 | 2022-09-30 | 安徽工业大学 | 一种通过gan解决afl测试模型数据不平衡的方法及装置 |
CN114661577A (zh) * | 2022-01-26 | 2022-06-24 | 天津大学 | 一种基于确定性策略与覆盖引导的模糊测试方法及工具 |
CN114661577B (zh) * | 2022-01-26 | 2023-09-26 | 天津大学 | 一种基于确定性策略与覆盖引导的模糊测试方法 |
Also Published As
Publication number | Publication date |
---|---|
CN109032942B (zh) | 2020-10-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109032942A (zh) | 一种基于afl的模糊测试框架 | |
Vanhoucke et al. | An overview of project data for integrated project management and control | |
CN109284606A (zh) | 基于经验特征与卷积神经网络的数据流异常检测系统 | |
CN109739755A (zh) | 一种基于程序追踪和混合执行的模糊测试系统 | |
CN109063456B (zh) | 图像型验证码的安全性检测方法及系统 | |
CN108062394A (zh) | 一种数据集的标注方法及相关装置 | |
CN110232280A (zh) | 一种基于树结构卷积神经网络的软件安全漏洞检测方法 | |
Harman et al. | Automated test data generation for aspect-oriented programs | |
Li et al. | Measuring code behavioral similarity for programming and software engineering education | |
CN105868116A (zh) | 基于语义变异算子的测试用例生成和优化方法 | |
CN107067143A (zh) | 一种设备安全等级分类方法 | |
Prashar | TQM as business strategy: a meta-analysis review | |
CN109933977A (zh) | 一种检测webshell数据的方法及装置 | |
Xu et al. | Directed test suite augmentation: an empirical investigation | |
Fraser et al. | Behaviourally adequate software testing | |
CN109785912A (zh) | 一种用于目标污染物源解析的因子快速识别方法及装置 | |
CN101847179A (zh) | 通过模型预测流感抗原的方法及应用 | |
CN109101820A (zh) | 一种基于执行流图的Web应用安全漏洞预测方法 | |
Rathee et al. | Clustering for software remodularization by using structural, conceptual and evolutionary features | |
Yao et al. | Orderly generation of test data via sorting mutant branches based on their dominance degrees for weak mutation testing | |
Lin et al. | A priority based path searching method for improving hybrid fuzzing | |
CN110138638A (zh) | 一种网络流量的处理方法及装置 | |
CN107430590A (zh) | 数据比较 | |
Ngo et al. | Ranking warnings of static analysis tools using representation learning | |
CN113722230B (zh) | 针对模糊测试工具漏洞挖掘能力的集成化评估方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |