AFLLibFuzzer 模糊测试概念初探

luyanpei

模糊测试(Fuzzing) 是一种自动化测试技术,通过对程序输入进行大量随机或半随机的“变异”来触发意外行为(崩溃、挂起、未定义行为等),从而发现潜在漏洞。下面分别详述两种主流覆盖率引导式模糊测试框架:AFL 和 LibFuzzer。


一、AFL(American Fuzzy Lop)

1. 原理与特点

  • 覆盖率引导:AFL 在程序被测代码中插桩(插入探针),能够在运行时收集基本块或边缘覆盖信息,将新输入是否覆盖到新的代码路径作为“优质样本”返回到输入池(corpus)。
  • 二进制/源代码插桩
    • 编译时插桩:使用 afl-gcc / afl-clang-fast 编译,插入轻量化边缘追踪代码。
    • QEMU 模式:对未编译源码的二进制进行动态插桩,但性能略慢。

2. 基本使用流程

  1. 准备种子文件:放在 in/ 目录下,代表程序合法的最小输入。

  2. 编译目标

    1
    afl-clang-fast -g -O2 target.c -o target_afl
  3. 启动模糊器

    1
    afl-fuzz -i in/ -o out/ -- ./target_afl @@
    • @@ 代表 AFL 会把变异后的输入文件路径替换到这里。
  4. 监控结果

    • 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:可与 ASanMSanUBSan 等一起开启,漏报率低。
  • 函数驱动(API):用户需提供一个或多个 LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 函数作为测试入口。

2. 基本使用流程

  1. 编写 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;
    }
  2. 编译并链接

    1
    clang -g -O1 -fsanitize=address,fuzzer target.c -o target_fuzzer
  3. 运行 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