Honggfuzz模糊测试工具使用指南
前言
Honggfuzz是一款由Google开发的高效模糊测试工具,支持多种操作系统和多种代码覆盖率收集方式。本文将详细介绍Honggfuzz的使用方法、功能特性以及常见问题解答。
系统要求
基本要求
- 支持POSIX标准的操作系统
- MacOSX系统
- Android系统
- Windows系统(需通过CygWin运行)
高级功能要求
- 使用硬件级代码覆盖率引导的模糊测试需要Linux内核版本≥4.2
- 支持Intel PT(处理器追踪)
- 支持Intel BTS(分支追踪存储)
- 支持指令/分支计数
输入语料库
虽然Honggfuzz可以无需输入语料库开始模糊测试(基于覆盖率反馈驱动模式),但准备一些初始测试用例有助于提高效率:
- 图像格式:Tavis Ormandy的Image Testsuite可用于测试图形库问题
- PDF格式:Adobe提供的测试PDF文件
兼容性列表
Honggfuzz支持以下操作系统:
| 操作系统 | 状态 | 备注 |
|---|---|---|
| GNU/Linux | 支持 | 使用ptrace() API,支持x86/x86-64反汇编 |
| FreeBSD | 支持 | 使用POSIX信号接口 |
| OpenBSD | 支持 | 使用POSIX信号接口 |
| NetBSD | 支持 | 使用ptrace() API,支持x86/x86-64反汇编 |
| Mac OS X | 支持 | 使用POSIX信号接口/Mac OS X崩溃报告,支持x86-64/x86反汇编 |
| Android | 支持 | 使用ptrace() API,支持x86/x86-64反汇编 |
| Windows | 支持 | 通过CygWin使用POSIX信号接口 |
| 其他Unix系统 | 可能支持 | 需要POSIX信号接口 |
使用模式详解
1. 无插桩的非持久性模糊测试(-x)
文件输入模式(使用___FILE___占位符)
honggfuzz -i input_dir -x -- /usr/bin/djpeg ___FILE___
STDIN输入模式(-s/--stdin_input)
honggfuzz -i input_dir -x -s -- /usr/bin/djpeg
2. 带插桩的非持久性模糊测试
编译时插桩(-z/--instrument,默认启用)
honggfuzz -i input_dir -z -- instrumented.djpeg ___FILE___
QEMU模式(无源码插桩)
honggfuzz -i input_dir -- <qemu_path>/qemu-x86_64 /usr/bin/djpeg ___FILE___
硬件级机制/计数器
honggfuzz -i input_dir --linux_perf_bts_edge -- /usr/bin/djpeg ___FILE___
honggfuzz -i input_dir --linux_perf_ipt_block -- /usr/bin/djpeg ___FILE___
honggfuzz -i input_dir --linux_perf_instr -- /usr/bin/djpeg ___FILE___
honggfuzz -i input_dir --linux_perf_branch -- /usr/bin/djpeg ___FILE___
3. 持久性模式(-P,可自动检测)
honggfuzz -i input_dir -z -P -- jpeg_persistent_mode
honggfuzz -i input_dir --linux_perf_bts_edge -P -- jpeg_persistent_mode
也可以组合使用多种插桩机制:
honggfuzz -i input_dir --linux_perf_bts_edge --linux_perf_instr -P -- jpeg_persistent_mode
4. 语料库最小化(-M)
直接在输入目录中最小化
honggfuzz -i input_dir -P -M -- jpeg_persistent_mode
将最小化结果保存到输出目录
honggfuzz -i input_dir --output output_dir -P -M -- jpeg_persistent_mode
命令行参数详解
Honggfuzz提供了丰富的命令行参数,主要分为以下几类:
基本参数
-i/--input: 指定输入语料库目录--output: 指定输出目录-P/--persistent: 启用持久性模糊测试-z/--instrument: 启用编译时插桩(默认)-x/--noinst: 禁用所有插桩反馈
性能控制
-t/--timeout: 设置超时时间(秒)-n/--threads: 设置并发线程数-r/--mutations_per_run: 设置每次运行的最大变异次数
输入输出控制
-s/--stdin_input: 通过STDIN提供输入-e/--extension: 设置输入文件扩展名-W/--workspace: 设置工作目录--crashdir: 设置崩溃文件保存目录
高级功能
--linux_perf_instr: 使用PERF_COUNT_HW_INSTRUCTIONS--linux_perf_branch: 使用PERF_COUNT_HW_BRANCH_INSTRUCTIONS--linux_perf_bts_edge: 使用Intel BTS计数唯一分支--linux_perf_ipt_block: 使用Intel PT计数唯一代码块
输出文件格式
Honggfuzz生成的崩溃报告文件名包含丰富的信息:
Linux/NetBSD格式示例: SIGSEGV.PC.4ba1ae.STACK.13599d485.CODE.1.ADDR.0x10.INSTR.mov____0x10(%rbx),%rax.fuzz
POSIX信号接口格式示例: SIGSEGV.22758.2010-07-01.17.24.41.tif
文件名各部分含义:
- 信号类型:如SIGSEGV、SIGILL等
- PC值:程序计数器值(仅ptrace() API)
- 堆栈签名:基于堆栈追踪生成
- 内存地址:
_siginfo_t.si_addr_值 - 指令:导致崩溃的汇编指令(x86/x86-64)
常见问题解答
命名由来
名称"honggfuzz"源自苏黎世Höngg地区的一次难忘事件,当时一位威尔士安全专家在出租车前往Höngg时高唱《Another one bites the dust》。
技术选择
-
为什么优先使用ptrace() API而非POSIX信号接口? ptrace() API在分析进程崩溃时更灵活,能获取更多信息。
-
为什么FreeBSD和Mac OS X不支持ptrace() API? 这些系统缺少关键的ptrace()操作,如PT_GETREGS(Mac OS X)和PT_GETSIGINFO。
许可信息
Honggfuzz采用Apache License 2.0许可协议。
结语
Honggfuzz作为一款功能强大的模糊测试工具,支持多种操作系统和多种代码覆盖率收集方式,是安全研究人员和开发人员进行问题挖掘的利器。通过合理配置各种参数,可以针对不同场景进行高效的模糊测试。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



