AFLLibFuzzer 模糊测试概念初探

模糊测试(Fuzzing) 是一种自动化测试技术,通过对程序输入进行大量随机或半随机的“变异”来触发意外行为(崩溃、挂起、未定义行为等),从而发现潜在漏洞。下面分别详述两种主流覆盖率引导式模糊测试框架:AFL 和 LibFuzzer。
一、AFL(American Fuzzy Lop)
1. 原理与特点
- 覆盖率引导:AFL 在程序被测代码中插桩(插入探针),能够在运行时收集基本块或边缘覆盖信息,将新输入是否覆盖到新的代码路径作为“优质样本”返回到输入池(corpus)。
- 二进制/源代码插桩:
- 编译时插桩:使用
afl-gcc
/afl-clang-fast
编译,插入轻量化边缘追踪代码。 - QEMU 模式:对未编译源码的二进制进行动态插桩,但性能略慢。
- 编译时插桩:使用
2. 基本使用流程
准备种子文件:放在
in/
目录下,代表程序合法的最小输入。编译目标:
1
afl-clang-fast -g -O2 target.c -o target_afl
启动模糊器:
1
afl-fuzz -i in/ -o out/ -- ./target_afl @@
@@
代表 AFL 会把变异后的输入文件路径替换到这里。
监控结果:
out/queue/
:已执行过的输入样本。out/crashes/
、out/hangs/
:触发崩溃或超时的变异样本,可用于后续分析。- AFL 实时在终端显示当前执行速度、路径数、发现崩溃等指标。
3. 高级特性
- 字典(Dictionary):在
-x dict.txt
中定义可用的关键字或二进制模式,提高变异效果。 - 持久化模式(Persistent Mode):在目标程序内部直接循环读取输入,避免每次重启进程开销,大幅提升速度。
- 灰盒策略:AFL 使用多种变异策略(bit flip、byte flip、arithmetic、interesting values 插入、clone etc.),并根据覆盖率反馈自动调整。
- 并行化:通过
-M
(master)和-S
(slave)模式,可在多台机器/多核上并行工作,自动同步 corpus。
二、LibFuzzer
1. 原理与特点
- 内联插桩:通过编译目标时链接
-fsanitize=fuzzer
,LLVM 在编译阶段插桩,直接在被测函数入口处做 fuzzing harness 调用。 - 集成 Sanitizer:可与
ASan
、MSan
、UBSan
等一起开启,漏报率低。 - 函数驱动(API):用户需提供一个或多个
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
函数作为测试入口。
2. 基本使用流程
编写 fuzzer harness:
1
2
3
4
5
6
7#include <stddef.h>
#include <stdint.h>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
// 将 data/size 作为输入调用目标库或函数
my_parse((const char*)data, size);
return 0;
}编译并链接:
1
clang -g -O1 -fsanitize=address,fuzzer target.c -o target_fuzzer
运行 fuzzer:
1
./target_fuzzer [seed_dir] [options]
- 默认在当前目录下创建
crash-*
、corpus
子目录,并持续增长 corpus。
- 默认在当前目录下创建
3. 高级用法
- 多入口函数:可定义多个
LLVMFuzzerRunDriver
调用或针对不同模块使用-DFUZZ_TARGET=name
条件编译。 - 自定义字典:通过
-dict=dict.txt
加载关键字。 - 参数调整:支持
-max_len
(最大输入长度)、-timeout
(超时)等参数。 - 覆盖率反馈:与 Sanitizer coverage 一起,可导出 LLVM Coverage 报表。
三、实践建议
特性 | AFL | LibFuzzer |
---|---|---|
插桩方式 | 边缘插桩(边界探针) | LLVM 内联插桩 |
性能 | 较快,但需 fork 进程 | 更快,内联循环调用 |
Sanitizer 集成 | 需额外手动加 ASAN_OPTIONS=... afl-fuzz |
与 AddressSanitizer 等直接集成 |
函数驱动 vs. 命令行 | 命令行参数输入 | 函数入口驱动 |
并行化 | 支持 master/slave | 需要自行启动多个实例共享 corpus |
目标覆盖 | Any 可接收文件路径的程序 | 需要源码级修改,适合库/函数做 fuzzing |
- 快速上手:若目标是命令行工具,用 AFL;若是库或函数,推荐 LibFuzzer。
- 结合使用:可先用 AFL 找高概率的崩溃,再用 LibFuzzer + ASan 精确定位内存漏洞;或反向,先 LibFuzzer 验证功能,再 AFL 作更广泛测试。
- 持续集成:在 CI 中集成两者,可定期对新代码做 fuzz 回归测试。
- Title: AFLLibFuzzer 模糊测试概念初探
- Author: luyanpei
- Created at : 2025-05-09 18:07:05
- Updated at : 2025-05-09 18:56:04
- Link: https://redefine.ohevan.com/2025/05/09/AFLLibFuzzer 模糊测试概念初探/
- License: All Rights Reserved © luyanpei