1.Fuzzing测试的价值
Fuzzing通过随机或变异输入,不断调用目标函数,寻找崩溃、内存泄漏、未定义行为。LibFuzzer是LLVM项目的覆盖率引导型模糊测试引擎,与C/C++项目集成紧密。它通过插桩(SanitizerCoverage)收集代码覆盖,变异输入以覆盖新路径。
参考:https://vrhyh.cn/category/siji.html
2.LibFuzzer的工作流程
开发者编写一个LLVMFuzzerTestOneInput函数(参数为constuint8_t*data,size_tsize),该函数接受模糊输入并调用被测API。LibFuzzer会不断生成随机数据,调用该函数,监控是否崩溃。当发现新覆盖率时,将输入保存到corpus中,用于后续变异。
3.与Sanitizer结合
AddressSanitizer(ASan):检测内存错误(越界、use-after-free)。
UndefinedBehaviorSanitizer(UBSan):检测未定义行为(整数溢出、空指针解引用)。
MemorySanitizer(MSan):检测未初始化内存。
编译时加上-fsanitize=fuzzer,address,链接时同样。
4.案例:解析器安全测试
某公司开发了一个JSON解析器(C++)。为了确保健壮性,编写了fuzz目标:调用解析器函数,输入为任意字节。使用LibFuzzer运行24小时,发现了3个崩溃:一个是大整数解析导致std::length_error未捕获,另一个是递归深度过大导致栈溢出,第三个是UTF-8解码的越界读取。修复后解析器更加稳定。
参考:https://vrhyh.cn/category/xinli.html
5.持续fuzzing与OSS-Fuzz
Google的OSS-Fuzz项目提供免费持续fuzzing服务,支持C/C++项目。只需集成LibFuzzer并提交项目。OSS-Fuzz会大规模运行fuzzing并报告问题。许多开源项目(如OpenSSL、SQLite)通过它修复了数百个漏洞。
6.优化fuzzing效率
种子corpus:提供初始有效输入(如一些JSON例子),加速覆盖率增长。
字典:提供输入格式的关键字(如"null",":")帮助变异器生成有效数据。
自定义mutator:针对特定格式,实现更智能的变异。
7.总结
LibFuzzer为C++开发者提供了高效的fuzzing工具,能自动化发现隐藏的bug。在涉及解析用户输入的软件(网络协议、文件格式、脚本引擎)中,fuzzing应成为标准安全测试流程的一部分。
参考:https://vrhyh.cn