Fuzzing 调研笔记

黎 浩然/ 23 10 月, 2023/ 动态分析/DYNAMICANALYSIS, 研究生/POSTGRADUATE/ 0 comments

Classification of Fuzzers

测试样例反馈(Test case feedback)

按测试用例是否根据程序的执行情况更新生成Fuzzers分为Dumb Fuzzers和Smart Fuzzers。

Dumb Fuzzers简单地选择一种测试用例生成方法并坚持使用。第1代的Fuzzers往往属于此类。

Dumb Fuzzers的优点是不特定于任何给定程序,因此可以相对容易地应用于许多不同的程序。

Dumb Fuzzers的缺点是它们的测试用例不太可能导致错误或漏洞的发现,从而增加测试时间。

尽管Dumb Fuzzers仍在使用,但研究主要集中在 Smart Fuzzers。Smart Fuzzers 会为输入做出更智能的选择,以便更好地测试特定程序。这是通过根据程序行为修改输入生成过程来实现的(李等,2018)。例如,如果注意到包含字符串“abc”的输入种子可以更深入地进入程序,则Fuzzers可能会使未来的种子更有可能包含此字符串。

对应用程序结构的了解(Knowledge of application structure)

模糊测试器(Fuzzers)按照它们对应用程序结构知识的了解程度分为三种主要类型:

  1. 黑盒模糊测试器:
    • 无需任何关于应用程序结构的知识。
    • 只关注输入和输出,不分析程序的代码执行路径。
  2. 白盒模糊测试器:
    • 通过符号执行技术,对测试程序进行深度分析以系统地增加代码覆盖率。
    • 通过分析不同输入如何影响程序状态来指导测试。
  3. 灰盒模糊测试器:
    • 介于黑盒和白盒模糊测试器之间,可能会使用一些程序源代码或执行信息,但不如白盒模糊测试器那样全面。
    • 可以利用程序分析(例如代码覆盖率信息)来指导模糊测试进度。

测试样例生成方法(Test case generation method)

模糊测试中生成测试用例的方法是非常重要的,不同的生成方法会影响到测试的效果和效率。

  1. 基于变异的模糊测试器 (Mutational-based fuzzers):
    • 从一组初始有效输入(称为”种子”)开始,并通过变异这些输入来生成新的测试用例。
    • 变异可以包括随机翻转位、重新排序输入数据的部分等。
  2. 基于生成的模糊测试器 (Generational-based fuzzers):
    • 使用一个蓝图(例如,输入模型或语法)来从头构建有效的输入。
    • 例如,如果测试程序需要一个JPG图片,基于生成的模糊测试器会按照某种配置或模型来生成有效的JPG文件。
  3. 随机模糊测试器 (Random fuzzers):
    • 完全随机地生成测试用例,没有依据任何先前的输入或模型。
    • 这种方法往往效率较低,因为随机生成的输入很可能会被测试的程序立刻拒绝。

程序探索方法(Program exploration approach)

基于它们如何探索和测试程序,有两种主要的模糊测试器:

  1. 有目的的模糊测试器 (Directed fuzzers)
    • 专注于触及程序的特定部分,生成的测试用例目标明确。
  2. 基于覆盖率的模糊测试器 (Coverage-based fuzzers)
    • 旨在通过测试用例覆盖尽可能多的代码,提高代码覆盖率。
    基于覆盖率的Fuzzers可以使用不同的指标来跟踪其进度:包括行覆盖率、基本块覆盖率、基本分支覆盖率、N-gram分支覆盖率、上下文敏感分支覆盖和内存访问感知分支覆盖率。 行覆盖率根据Fuzzers是否触发新的代码行来跟踪进度。基本块覆盖率跟踪Fuzzers是否触发新块,其中一个块由 Fuzzers 定义。基本分支覆盖率将基本块覆盖率进一步推广,不仅考虑已访问的块,而且考虑先前访问块。当前和先前访问的块的元组被跟踪并用于衡量进度。 N-gram分支覆盖率进一步概括了这个指标,并查看了模糊测试器访问的最后N个块,而不仅仅是最后两个(基本分支覆盖率)。当N =0时,此指标等同于基本块覆盖率,因为只考虑当前的块。当 N 很大时,会考虑访问块的完整路径,因此这个指标通常被称为路径覆盖率指标。这些指标通常用于白盒和灰盒Fuzzers,并通常通过代码插装获得。如图2所示。

https://github.com/google/oss-fuzz

Share this Post

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注

*
*