全速模糊测试:通过覆盖引导追踪降低模糊测试开销
摘要
在覆盖引导模糊测试的三个主要组成部分中:(1) 测试用例生成,(2) 代码覆盖追踪,以及 (3) 崩溃分类,代码覆盖追踪是开销的主要来源。覆盖引导模糊测试通过静态或动态二进制插桩,或最近利用硬件支持,来追踪每个测试用例的代码覆盖。不幸的是,追踪所有测试用例会带来显著的性能损失——即使绝大多数测试用例及其覆盖信息因未增加代码覆盖而被丢弃。为了消除覆盖引导模糊测试不必要的追踪,我们引入了覆盖引导追踪的概念。覆盖引导追踪利用了两个观察结果:(1) 只有一小部分生成的测试用例增加了覆盖,因此需要追踪;(2) 增加覆盖的测试用例随时间变得越来越少。覆盖引导追踪通过将代码覆盖的当前边界编码到目标二进制文件中来实现,使其能在测试用例产生新覆盖时自行报告——而无需追踪。这充当了追踪的过滤器;将追踪的开销限制为仅针对增加覆盖的测试用例。因此,覆盖引导追踪选择以牺牲增加覆盖测试用例的处理时间为代价,来换取初始以原生速度执行测试用例的能力。为了展示覆盖引导追踪的潜力,我们基于静态二进制插桩工具 Dyninst 创建了一个名为 UnTracer 的实现。我们使用模糊测试社区常用的八个真实世界二进制文件对 UnTracer 进行了评估。实验表明,仅模糊测试一小时后,UnTracer 的平均开销低于 1%,模糊测试 24 小时后,UnTracer 的开销接近 0%,而使用流行的白盒和黑盒二进制追踪工具 AFL-Clang、AFL-QEMU 和 AFL-Dyninst 追踪每个测试用例分别带来 36%、612% 和 518% 的开销。
引用
@article{arxiv.1812.11875,
title = {Full-speed Fuzzing: Reducing Fuzzing Overhead through Coverage-guided Tracing},
author = {Stefan Nagy and Matthew Hicks},
journal= {arXiv preprint arXiv:1812.11875},
year = {2019}
}
备注
To appear in the 40th IEEE Symposium on Security and Privacy, May 20--22, 2019, San Francisco, CA, USA