协同模糊测试和多机制融合方法

admin 2022年5月3日20:15:43评论128 views字数 6550阅读21分50秒阅读模式

模糊测试作为一种高效的漏洞检测方法被广泛应用,在检测应用程序、数据库、操作系统等软件的漏洞方面取得了卓越的成果。为了提升模糊测试技术的性能,研究者对目标程序进行了深入的研究,针对目标程序的特性,对模糊测试中的各个环节进行优化,提出了各种各样的优化方法,并基于这些方法开发了各种工具。由于这些方法针对程序的不同特点,对模糊测试的不同环节进行优化,因此可以通过组合这些方法来进一步提升模糊测试的性能。

通过组合不同方法来提升模糊测试性能的思想在模糊测试技术中并不少见,例如Driller通过在灰盒模糊测试中引入符号执行来解决灰盒模糊测试无法解决程序中复杂检查的问题,VUzzer中使用污点分析技术定位出输入中与比较指令有关的字节,通过变异这些字节来提升变异效率,使变异更容易扩大代码覆盖率。这些传统的组合方式是为了解决特定的问题,而本文中介绍的组合方法不是为了解决特定问题,而是为了实现现有方法之间的优势互补。这种互补主要体现在两个方面:一方面,针对程序的不同特性,研究者往往提出不同方法进行优化,然而在现实应用中,这些不同特性往往会出现在一个程序中,这时任何针对某一特性提出的方法都难以对程序进行充分的检测,这时可以通过使用不同方法并行检测程序,来提升对程序的检测效果,这种测试方法被称为协同模糊测试;另一方面,针对模糊测试技术的优化往往涉及到模糊测试的各个环节,而有些优化方法具有较强的独立性,因此将这些在不同环节具有较强独立性的方法组合起来,可以进一步提升模糊测试的效率,这种方法被称为多机制融合方法。协同模糊测试和多机制融合方法是对现有方法的组合,而具体的组合方式往往涉及具体方法,这使得它们更倾向于工程实践,而非理论研究,因此在该领域的研究论文较少。本文将介绍近几年提出的几篇针对协同模糊测试和多机制融合方法可行性及优化的论文,使读者对该领域有基本的了解。这几篇论文的概述如表12所示。

1 协同模糊测试研究近况

协同模糊测试和多机制融合方法

表2 多机制融合方法研究近况

协同模糊测试和多机制融合方法


1、协同模糊测试研究近况  

 协同模糊测试是并行模糊测试的分支,与传统并行模糊测试不同,它使用不同Fuzzer并行对程序进行测试,通过在不同Fuzzer间共享信息来实现优势互补,提升模糊测试性能。该方法克服了单一Fuzzer探测能力有限的局限性,利用不同Fuzzer增强了对程序的探测能力,使其能够更好应用于实现复杂、种类多样的现实程序。

1.1 EnFuzz协同模糊框架

  2019年,Chen等人[1]首次提出了协同模糊框架--”EnFuzz”。他们的基本思路如图1所示,有两个模糊测试工具fuzzer1和fuzzer2,其中fuzzer1擅长解决”Magic Str”问题,fuzzer2擅长解决”Magic Num”问题。fuzzer1单独运行时,只能探测到 T1-T3一条路径,而fuzzer2单独运行时,只能探测到T2-T6一条路径,使用通常的并行策略,即同时运行fuzzer1和fuzzer2对程序进行检测,两者之间不交换信息,则只能探测到T1-T3、T2-T6两条路径,无法探测到存在bug的T1-T4、T2-T5两条路径。但是,如果在fuzzer1和fuzzer2之间建立某种种子同步机制,在发现新路径时同步发现新路径的种子文件,fuzzer1和fuzzer2就能够探测到bug。例如,当fuzzer1通过”Magic Str”检查到达T1时,它可以将发现T1的种子文件同步给fuzzer2,fuzzer2使用这个文件就可以通过”Magic str”检查,到达”Magic Num”检查,由于fuzzer2擅长解决”Magic Num”问题,它就可以通过这个检查到达T4,发现bug。

协同模糊测试和多机制融合方法

图1 基本思路

  EnFuzz的基本架构如图2所示。首先基于三种指标手动选出差异足够大的Fuzzer作为 base fuzzer,之后监控每个fuzzer运行的结果,将它们找到的interesting seed分发到其他fuzzer中,最后,收集崩溃和覆盖率信息,将其写入结果报告。

协同模糊测试和多机制融合方法

图2 基本架构

 fuzzer选择阶段,基于三种指标人工选取具有较大差异的fuzzer。这三种指标分别是:基于种子突变和选择策略,通过fuzzer对种子的变异和选择策略的差异来衡量fuzzer之间的差异;基于覆盖信息粒度,通过fuzzer统计覆盖率信息的方式的差异来衡量fuzzer之间的差异;基于输入生成策略,该方法通过fuzzer使用基于生成的变异策略还是基于突变的变异策略来衡量Fuzzer之间的差异。

  选取具有较大差异的 base fuzzer 后,开始并行测试程序,同时监控程序对过程进行监控。监控程序基本架构如图3 所示。测试过程中,如果base fuzzer发现一个interesting seed,就将其发送到全局种子池;监控程序定期检查全局种子池,如果发现未分发的种子,就向所有base fuzzer分发这个种子

协同模糊测试和多机制融合方法

图3 监控程序基本架构

  测试阶段,作者选择了六种Fuzzer(AFL、AFLFast、FairFuzz、LibFuzzer、Radamsa、QSYM)作为base Fuzzer,在Google’s fuzzer-test-suite上进行测试,测试结果如图4所示,在计算资源相同的情况下,EnFuzz的性能强于每一个被选择的base fuzzer。同时,EnFuzz还具有良好的扩展性,可以轻易用于集成其他的模糊测试工具。

协同模糊测试和多机制融合方法

协同模糊测试和多机制融合方法

协同模糊测试和多机制融合方法

图4 测试结果

  EnFuzz的局限性在于:1、衡量 base fuzzer 多样性的标准不够丰富,也不够精确,无法自动选择 base fuzzer。2、该方法中使用的种子同步机制的可扩展性有改进空间,可以同步种子之外的其他信息,增强base fuzzer之间的协作。3、该方法使用静态方式选择 base fuzzer 集合并分配每个 base fuzzer 享有的计算资源,应该根据每个 base fuzzer 运行情况使用动态方法选择集合、分配资源。

  后续的研究对这些局限性进行了改善。2020年,Emre Güler等人[2]在他们的文章中提出了一种通过收集单独的Fuzzer的运行数据来判断一组Fuzzer协同运作时的表现的方法,并提出了一个能够自动选择用于协同模糊测试的Fuzzer集合的工具--Cupid。Cupid的主要思想是:收集每个Fuzzer在一组具有代表性的程序中单独运行的数据,并基于这个数据预测出一组互补性较强的Fuzzer。首先,人工选择一组具有代表性的程序h和对应的一组种子文件,使用Fuzzer测试这组程序,收集运行信息。运行信息包括该Fuzzer运行中覆盖到的分支和经过该分支的概率,运行信息只在开始时收集一次。之后,利用这些信息计算Fuzzer集合的互补性。Cupid使用平均分支覆盖数作为衡量Fuzzer互补性的指标,表示该Fuzzer集合平均能够探索的分支数。计算公式如图5所示,其中F表示Fuzzer集合,f表示每个Fuzzer,b表示一条分支,B表示由所有分支构成的集合,bf表示f经过这条分支的概率,BranchProbF(b)表示该集合经过分支b的概率,AverageBranchCovF表示平均分支覆盖数。Cupid会选择平均分支覆盖数较高的Fuzzer集合作为待选集合,用于协同模糊测试。

协同模糊测试和多机制融合方法

协同模糊测试和多机制融合方法

5 平均分支覆盖数计算公式

  该方法具有自动化程度高、易于扩展等优点,但是,测试程序和种子文件的选择会显著影响该方法的结果,如何选择合适的程序和种子还有待研究,同时该方法只支持静态选择Fuzzer集合,不支持在fuzz过程中动态调整。

1.2 CollabFuzz协同模糊框架

  2021年,Sebastian Österlund∗等人[3]实现了一个能够使用更复杂种子调度策略的协作模糊测试框架--CollabFuzz,它能够利用更多信息有选择地决定测试用例在Fuzzer间如何分配。CollabFuzz的基本架构如图6所示。CollabFuzz主要有三个部分组成:1、Manger,它的任务主要是根据用户提供的调度策略将测试用例分发给不同的Fuzzer。2、Fuzzer,它的任务是将测试用例变异后输入待测程序。3、Fuzzer driver,它的任务是承上启下,在Manger和Fuzzer之间传递测试用例。Manger之中还有用来储存测试用例的Storage模块、用于分析测试用例的Analysis workers和Analysis states模块。当一个Fuzzer发现一个新的测试用例时,将该测试用例通过Driver发送给Manager,储存在Storage模块,之后Manager模块调用Analysis workers对测试用例进行分析,将结果储存在Analysis states,最后Manager模块根据Scheduler中用户定义的调度策略和Analysis states中的分析结果将测试用例通过Driver分发给符合策略的Fuzzer中。CollabFuzz在EnFuzz的基础上增加了更丰富的种子分发策略,但是其依然没有摆脱EnFuzz中只共享种子的局限性。


协同模糊测试和多机制融合方法

6 CollabFuzz基本架构


2、多机制融合方法研究近况

  多机制融合方法是将针对模糊测试不同环节的优化方法组合起来,在同一个Fuzzer中实现。当优化方法彼此间没有冲突时,可以直接将它们集成到一个Fuzzer中,但是有些方法会涉及到多个环节,此时直接集成会出现冲突问题,反而会降低效率。

2.1 InterFuzz

  在解决优化方法冲突方面,2019年,Liang等人[4]首次提出了集成多种优化方法的模糊测试框架-- InteFuzz,在该框架中实现了seed selection阶段和mutation阶段优化方法的组合,并成功解决了由于这些方法彼此冲突而引起的性能下降问题。该框架主要解决了两个问题:1、seed selection和mutation优化方法主要用到两种覆盖率信息--分支覆盖和块覆盖,如果使用错误的覆盖率信息,优化方法就无法正确生效,因此在该框架中同时使用了分支覆盖和块覆盖。2、用于不同阶段的优化方法之间存在冲突,例如基于块覆盖的seed selection优化可能与由分支覆盖引导的mutation优化不兼容,或者seed selection阶段被认为有价值的种子在mutation阶段被认为不重要,因此被忽略或没有充分变异,在这种情况下性能反而会下降,因此需要方法消除这些方法之间的冲突。该框架可以为两种优化设置优先级,当发生冲突时,执行优先级更高的优化,以此消除冲突。

  第一个问题是通过改变位图结构和插桩方式解决的,该框架在AFL原生位图的基础上进行了扩展,AFL使用64KB位图记录分支覆盖信息,而InterFuzz使用128KB位图,前64KB记录分支覆盖信息,后64KB记录块覆盖信息。而插桩方式如图7所示,在AFL原生插桩方式中添加了一行记录块覆盖信息的代码。

协同模糊测试和多机制融合方法

7 插桩方式

  第二个问题是通过检查种子是否符合优化条件解决的。当seed selection优化优先时,首先判断是否符合选择条件,再判断是否符合变异条件,若不符合变异条件,则使用AFL自带的变异方法,否则使用mutation优化方法。当mutation优化优先时,首先判断是否符合变异条件,若符合则直接使用mutation优化方法,否则再判断是否符合选择条件,若符合则使用AFL自带的变异方法,否则丢弃种子。图8为两种算法。

协同模糊测试和多机制融合方法

协同模糊测试和多机制融合方法

8 优先算法

  InterFuzz框架基本结构如图9所示。该框架在AFL基础上集成了主流Fuzzer中的seed selection优化方法和mutation优化方法,扩展了位图,并添加了优先算法解决冲突问题。

协同模糊测试和多机制融合方法


9 InterFuzz基本结构

  实验方面,作者选择AFLFast和FairFuzz作为基线,并选择AFLFast的seed selection方法和FairFuzz的mutation方法作为InterFuzz中的优化方法,测试InterFuzz框架的性能。结果如图10所示。直接集成会导致性能下降,而使用InterFuzz集成会使性能得到大幅提升。

协同模糊测试和多机制融合方法


协同模糊测试和多机制融合方法

协同模糊测试和多机制融合方法

10 性能对比

2.2 AFL++

  对于没有冲突的优化方法,可以通过直接集成它们来提升性能,AFL++[5]就是一个很好的例子。AFL++在AFL的基础上集成了大量其他先进Fuzzer中使用的优化方法,包括AFLFast的能量调度方法、MOpt的变异操作调度方法、LAF-Intel的复杂检查拆解方法、RedQueen的I2S变异方法、Ngram覆盖率统计方法等,除此之外还提供了Custom Mutator API供用户接入自己设计的变异操作。经过对比,如图11所示,通过集成多种优化方法,AFL++在性能上有了显著提高。

协同模糊测试和多机制融合方法

11 AFL++各种设置性能对比


3、总结

  本文主要介绍了模糊测试中的协同模糊测试和多机制融合方法,首先阐述了它们的定义和与传统方法之间的差异,接着介绍了近年来学术界在协同模糊测试和多机制融合方法方面的研究,最后对这些研究进行了总结。

  在协同模糊测试方面,EnFuzz框架填补了协同测试的空白,用实验证明了不同Fuzzer互相配合,能够起到很好的效果。但是该研究还停留在十分初级的阶段,虽然后续的研究弥补了EnFuzz的部分缺陷,但依然存在其他改进空间。例如,目前的框架只能决定分发那些测试用例,不能决定这些测试用例何时被执行;模糊器集合只能静态选择,不能根据运行情况动态调整;选择模糊器集合时,只基于覆盖率信息,没有考虑其他信息;调度策略较为简单,缺少更高效的调度策略等。由此可见,该领域还有很大的发展空间。

  在多机制融合方法方面,InterFuzz证明了多机制融合方法可以利用现有的优化方法有效提升Fuzzer的性能,但是在组合不同优化方法时,需要充分考虑方法之间可能存在的冲突问题,对于这方面的研究还处于很初级的阶段,有很大的发展空间。而对于基本没有冲突优化方法,简单组合就可以获得显著的性能提升,因此在检测现实程序时可以考虑组合不同方法以增强检测效果。



参考文献

[1] Chen Y, Jiang Y, Ma F, et al. EnFuzz: Ensemble Fuzzing with Seed Synchronization among Diverse Fuzzers[C]. 28th USENIX Security Symposium (USENIX Security 19). 2019: 1967-1983.

[2] Güler E, Görz P, Geretto E, et al. Cupid: Automatic Fuzzer Selection for Collaborative Fuzzing[C]. Annual Computer Security Applications Conference. 2020: 360-372.

[3] Österlund S, Geretto E, Jemmett A, et al. CollabFuzz: A Framework for Collaborative Fuzzing[C]. Proceedings of the 14th European Workshop on Systems Security. 2021: 1-7.

[4] Liang J, Chen Y, Wang M, et al. Engineering a better fuzzer with synergically integrated optimizations[C]. 2019 IEEE 30th International Symposium on Software Reliability Engineering (ISSRE). IEEE, 2019: 82-92.

[5] Fioraldi A, Maier D, Eißfeldt H, et al. AFL++: Combining Incremental Steps of Fuzzing Research[C]. 14th USENIX Workshop on Offensive Technologies (WOOT 20). 2020.




原文始发于微信公众号(FuzzWiki):协同模糊测试和多机制融合方法

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月3日20:15:43
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   协同模糊测试和多机制融合方法http://cn-sec.com/archives/959112.html

发表评论

匿名网友 填写信息