Fuzzinator: An Open-Source Modular Random Testing Framework
摘要
fuzzing工具一般包含以下几个相似且重要的组件:
- 目标系统的数据生成解决方案
- unique error检测器
- 自动化的测试用例规约器
- issue报告工具
本文介绍Fuzzinator
:一个开源的后测试框架,将上述几个组件模块化,使之相互独立,并串联起来,构成完成的框架。
1 介绍
模糊测试用于各种目标软件/系统:
- web引擎
- 操作系统内核
- 编译器
- 解释器
- 用户接口
- 等
同时也有很多测试用例生成方法帮助提高效率:
- 约束求解
- 覆盖率信息
- 演化方法
- 机器学习
- 等
SUT:system-under-test
- 测试用例生成后,传输给SUT:即使很简单的命令行工具也有不同的需求,有些只需要直接的输入,有些需要读取一个文件,有些更复杂,可能涉及到图形用户接口或网络通信。
- fuzzing tool需要自动识别SUT的异常行为,可能是crash, 非0退出,未捕获的异常信息或服务超时等
- 检测unique bugs也很重要,保留太多的测试用例会触发相同的error,同时也会浪费大量的资源和算力
除了上述大部分的fuzzing tool都通用的特性外,还有很多“雪中送炭”的特性:
- SUT能够随着项目演化自动更新,在最新的版本上进行fuzzing插桩保证计算力不被浪费
- 将最小化的failure样例和信息报告给issue跟踪系统,使项目团队能够快速应对
已有的研究一部分仅仅关注与测试用例生成组件,另一部分将几个组件耦合在一块,不能被他人重用
本文提出一个开源模糊测试框架Fuzzinator
,优点:模块化,高度可配置,可重用。。。
Fuzzinator
A. 架构
fuzz job:接收fuzzer生成测试用例,并逐一调用SUT执行测试用例。
reduce job
test case reducer生成已有failure输入的简化版本,然后将这些版本回传给同个SUT。
update job
检测SUT是否outdated,若是则pull latest version。
validation job
验证之前找到并记录的issue是否可以在当前版本的SUT上重现
B. 组件
- 在该框架中,每个fuzzer由一个函数表示,fuzzer的返回值都会被认为是一个新的测试用例
- SUT也是一个函数,接受fuzzer生成的测试用例,返回系统认为的issue的充分描述
- Reducer也遵循类似的逻辑,他们是函数接收SUT和测试用例,返回能使SUT返回相同issue描述的更简洁的输入
C. 样例
主要介绍具体配置,太细节了。。大致就是说明每个job如何配置
3 相关工作
总结
本文介绍了Fuzzinator
这个模糊测试框架和如何模块化的配置各个任务和组件。
这个框架使用不同的模糊测试生成器(AFL,Grammarinator,Generinator:RATS),测试多个项目。它帮助发现,管理,报告将近1000个issues。