在ClusterFuzz中配置libFuzzer和AFL++模糊测试环境
前言
模糊测试(Fuzzing)是现代软件安全测试中不可或缺的技术手段。本文将详细介绍如何在ClusterFuzz平台上配置两种主流的覆盖率引导模糊测试工具:libFuzzer和AFL++。通过本文,您将了解如何构建模糊测试目标、创建测试任务以及优化测试效果的关键技巧。
环境准备
编译器要求
两种模糊测试工具都需要使用Clang编译器提供的插桩功能:
- libFuzzer:需要Clang 6.0或更高版本
- AFL++:同样基于Clang,但需要额外构建
建议使用尽可能接近最新版本的Clang编译器,以获得最佳性能和最新功能。设置环境变量以便后续使用:
export CC=/path/to/clang
export CXX=/path/to/clang++
平台支持
- libFuzzer:支持Linux、macOS和Windows
- AFL++:仅支持Linux平台
构建模糊测试目标
libFuzzer构建方法
libFuzzer是最容易构建的模糊测试工具之一。基本构建命令如下:
$CXX -fsanitize=address,fuzzer fuzzer.cc -o fuzzer
构建完成后,可以进行简单测试:
./fuzzer -runs=10
最后打包构建结果:
zip fuzzer-build.zip fuzzer
AFL++构建方法
AFL++的构建过程稍复杂,需要先构建FuzzingEngine库:
# 构建afl-fuzz和FuzzingEngine.a
./build_afl.bash
然后编译目标程序:
$CXX -fsanitize=address -fsanitize-coverage=trace-pc-guard fuzzer.cc FuzzingEngine.a -o fuzzer
测试构建结果:
AFL_SKIP_CPUFREQ=1 ./afl-fuzz -i $INPUT_CORPUS -o output -m none ./fuzzer
最后打包所有必要文件:
zip fuzzer-build.zip fuzzer afl-fuzz afl-showmap
创建测试任务
在ClusterFuzz中创建模糊测试任务时,任务名称必须包含特定标识:
- libFuzzer任务:名称中必须包含"libfuzzer"
- AFL++任务:名称中必须包含"afl"
同时,任务名称还应包含使用的检测器类型(如asan、msan或ubsan)。例如:
- libFuzzer任务示例:"libfuzzer_asan_my_project"
- AFL++任务示例:"afl_asan_my_project"
创建任务步骤:
- 在Jobs页面填写"ADD NEW JOB"表单
- 填写名称和平台(LINUX)
- 在"Select/modify fuzzers"字段中选择对应的模糊测试器
- 根据选择的模糊测试器使用相应模板
- 上传构建好的zip文件作为"Custom Build"
- 点击"ADD"按钮添加任务
优化模糊测试效果
语料库修剪
为防止语料库无限增长,必须启用每日语料库修剪功能。在libFuzzer ASan任务的环境字符串中设置:
CORPUS_PRUNE = True
种子语料库
可以上传包含样本输入的zip文件作为种子语料库。种子语料库文件必须:
- 与模糊测试目标位于同一目录
- 命名为
<fuzz_target>_seed_corpus.zip
格式
字典文件
字典是模糊测试过程中可以插入的令牌列表。字典文件必须:
- 与模糊测试目标位于同一目录
- 命名为
<fuzz_target>.dict
格式
AFL++的限制
虽然ClusterFuzz支持AFL++,但不支持使用它进行语料库修剪和崩溃最小化。因此,建议同时使用libFuzzer来完成这些任务。
查看测试结果
可以通过以下方式查看测试结果:
- 查看机器人日志了解模糊测试过程
- 在Testcases页面查看发现的错误
- 查看崩溃统计和模糊测试统计(生产环境中通常需要等待一天)
结语
通过合理配置libFuzzer和AFL++,您可以在ClusterFuzz平台上建立高效的模糊测试环境。记住定期更新编译器版本、优化种子语料库和字典文件,以获得最佳测试效果。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考