探索未来测试的新维度:FuzzFactory - 基于途径的领域特定模糊测试
在软件安全领域,模糊测试(Fuzzing)已经成为一种强大的工具,用于发现潜在的漏洞和错误。而FuzzFactory,是一个针对AFL(American Fuzzy Lop)的扩展,它将传统的覆盖率引导模糊测试提升到一个新的水平,实现了领域特定的测试目标。通过引入“途径”这一概念,FuzzFactory允许用户无需修改AFL的核心搜索算法,即可对搜索过程进行指导。
什么是“途径”?
在FuzzFactory中,“途径”是模糊测试过程中保存的中间输入。这些输入可能不会增加代码覆盖率,但它们标志着在特定领域的进展。例如,PerfFuzz可以保存那些使循环执行次数增加的输入,而魔法字节模糊器则可以保存部分正确魔法字节的输入。
如何工作?
FuzzFactory提供了一个API(见include/waypoints.h
),让模糊测试算法与测试程序之间能交换信息。测试程序可以在执行期间提供自定义的领域特定反馈,并通过选择一个“归约函数”来指定如何聚合多个输入的反馈。聚合后的反馈用于确定某个输入是否应被标记为途径点。API调用可以通过手动修改测试程序或在编译时插入适当的注释实现。
FuzzFactory的价值所在
使用FuzzFactory,只需要29行代码就可以构建一个名为mem
的fuzzer,用于最大化内存分配函数的参数;仅需355行代码,就能创建cmp
,一个超越变量大小的魔法值、校验和和其他比较的fuzzer。更令人印象深刻的是,通过添加一个命令行标志,你可以组合cmp
和mem
,创建一个超级fuzzercmp-mem
。这个超级fuzzer不仅超过了其组件,而且在寻找内存分配问题上,甚至比AFL表现得更好!
实际上,cmp-mem
发现了两个新的libarchive
中的bug[#1165, #1237],并且无须任何种子输入就复现了一个已知的libpng
内存分配问题。
(图:评估FuzzFactory的
cmp-mem
组合性能)
文档和示例
FuzzFactory适用于已经熟悉AFL的用户。要构建定制版的afl-fuzz
,只需在项目根目录运行make
。
使用此afl-fuzz
,既可以模糊测试常规的AFL仪器化程序,也可以使用 -p
选项进行支持FuzzFactory API的测试程序。
选项1:通过LLVM基于域的乐器化获得领域特定反馈
要在根目录下构建FuzzFactory的LLVM基础域乐器化,确保安装了LLVM/Clang 6+,并让AFL找到llvm_config
,然后运行make llvm-domains
。这将构建一个特殊版本的afl-clang-fast
,以插件形式支持领域特定的乐器化。此外,还提供了六个与FuzzFactory一起使用的领域实现,对应论文中的六种领域。
选项2:通过手动API调用实现领域特定反馈
对于不想进行乐器化的用户,可以直接在测试程序中使用FuzzFactory宏来增强其功能。这些宏包括:
FUZZFACTORY_DSF_NEW(name, size, reducer, initial)
FUZZFACTORY_DSF_MAX(dsf, k, v)
FUZZFACTORY_DSF_BIT(dsf, k, v)
FUZZFACTORY_DSF_SET(dsf, k, v)
FUZZFACTORY_DSF_INC(dsf, k, v)
为了看到如何实际应用这些宏,可以对比demo
目录下的demo.c
和demo-manual.c
。
结论
FuzzFactory通过其创新的途径概念,为开发者提供了一种全新的方法,以高效且灵活的方式对特定领域进行模糊测试。无论你是寻求优化现有测试策略,还是希望探索新的测试边界,FuzzFactory都是一个值得尝试的工具。现在,就将你的测试带入新的层次,体验FuzzFactory带来的优势吧!