Fuzzinator: An Open-Source Modular Random Testing Framework

Fuzzinator: An Open-Source Modular Random Testing Framework

摘要

fuzzing工具一般包含以下几个相似且重要的组件:

  1. 目标系统的数据生成解决方案
  2. unique error检测器
  3. 自动化的测试用例规约器
  4. issue报告工具

本文介绍Fuzzinator:一个开源的后测试框架,将上述几个组件模块化,使之相互独立,并串联起来,构成完成的框架。

1 介绍

模糊测试用于各种目标软件/系统:

  1. web引擎
  2. 操作系统内核
  3. 编译器
  4. 解释器
  5. 用户接口

同时也有很多测试用例生成方法帮助提高效率:

  1. 约束求解
  2. 覆盖率信息
  3. 演化方法
  4. 机器学习

SUT:system-under-test

  1. 测试用例生成后,传输给SUT:即使很简单的命令行工具也有不同的需求,有些只需要直接的输入,有些需要读取一个文件,有些更复杂,可能涉及到图形用户接口或网络通信。
  2. fuzzing tool需要自动识别SUT的异常行为,可能是crash, 非0退出,未捕获的异常信息或服务超时等
  3. 检测unique bugs也很重要,保留太多的测试用例会触发相同的error,同时也会浪费大量的资源和算力

除了上述大部分的fuzzing tool都通用的特性外,还有很多“雪中送炭”的特性:

  1. SUT能够随着项目演化自动更新,在最新的版本上进行fuzzing插桩保证计算力不被浪费
  2. 将最小化的failure样例和信息报告给issue跟踪系统,使项目团队能够快速应对

已有的研究一部分仅仅关注与测试用例生成组件,另一部分将几个组件耦合在一块,不能被他人重用

本文提出一个开源模糊测试框架Fuzzinator,优点:模块化,高度可配置,可重用。。。

Fuzzinator

QQ截图20181025092107.png

A. 架构

fuzz job:接收fuzzer生成测试用例,并逐一调用SUT执行测试用例。

  1. reduce job

    test case reducer生成已有failure输入的简化版本,然后将这些版本回传给同个SUT。

  2. update job

    检测SUT是否outdated,若是则pull latest version。

  3. validation job

    验证之前找到并记录的issue是否可以在当前版本的SUT上重现

B. 组件

  • 在该框架中,每个fuzzer由一个函数表示,fuzzer的返回值都会被认为是一个新的测试用例
  • SUT也是一个函数,接受fuzzer生成的测试用例,返回系统认为的issue的充分描述
  • Reducer也遵循类似的逻辑,他们是函数接收SUT和测试用例,返回能使SUT返回相同issue描述的更简洁的输入

C. 样例

主要介绍具体配置,太细节了。。大致就是说明每个job如何配置

3 相关工作

总结

本文介绍了Fuzzinator这个模糊测试框架和如何模块化的配置各个任务和组件。

这个框架使用不同的模糊测试生成器(AFL,Grammarinator,Generinator:RATS),测试多个项目。它帮助发现,管理,报告将近1000个issues。