mcpField
O
offensive-fuzzing

offensive-fuzzing

github.com/snailsploit安全9.7k194 次安装2 周前更新
代码仓库

关于 offensive-fuzzing

面向安全研究人员的模糊测试方法与工具指南,涵盖目标分析、测试构建、模糊测试运行及崩溃分诊。内容按不同模糊测试类型和目标场景组织,并提供命令与示例流程。

主要功能

  1. 01模糊测试类型与工具对照
  2. 02目标研究和测试流程
  3. 03Harness 与种子语料构建
  4. 04并行运行及停滞处理
  5. 05崩溃分诊与分析
  6. 06内核及多语言场景参考

适用场景

  1. 01为新目标选择模糊测试方法
  2. 02为 C/C++ 程序搭建测试流程
  3. 03分析并归类测试发现的崩溃
  4. 04规划内核或语言生态测试

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/snailsploit/claude-red --skill offensive-fuzzing

安装后在 Claude Code 中输入/offensive-fuzzing确认已加载。

详细介绍

漏洞利用型模糊测试

模糊测试器类型

类型覆盖率速度工具
黑盒差快Peach、Boofuzz
灰盒良好快AFL++、Honggfuzz、libFuzzer、WinAFL
快照良好最快Nyx、wtf、Snapchange
白盒最佳慢KLEE、QSYM、SymSan
集成最佳快AFL++ + Honggfuzz + libFuzzer

灰盒子类型: 定向(AFLGo、UAFuzz)、语法(AFLSmart、Tlspuffin)、合谋(QSYM、Driller)、内核(syzkaller、kAFL、wtf)。

核心工作流

Research target → Choose analyses → Build harness → Seed corpus → Instrument → Fuzz → Triage crashes → Report
1. 调研目标
  • 梳理所有输入面(文件、网络、IPC、系统调用、IOCTL)
  • 找出高价值区域:之前修补过的代码、复杂解析器、新增代码、输入接收点
  • 对于内核模块:不要只关注 copy_from_user,还要检查 DMA-BUF 操作、页故障处理程序、VM 操作结构体、分配回调
2. 插桩和构建
# AFL++ (preferred for GreyBox)
CC=afl-clang-fast CXX=afl-clang-fast++ cmake -DCMAKE_BUILD_TYPE=Release .. && make -j

# libFuzzer + ASan/UBSan (C/C++)
cmake -DCMAKE_CXX_FLAGS="-fsanitize=fuzzer,address,undefined -O1 -g" ..

# CmpLog build for hard compares
AFL_LLVM_CMPLOG=1 CC=afl-clang-fast CXX=afl-clang-fast++ make clean all

Windows(MSVC): Project Properties → C/C++ → Address Sanitizer: Yes (/fsanitize=address)

3. 编写 Harness

libFuzzer(C++):

#include <cstdint>
#include <cstddef>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
    parse_or_process(data, size);
    return 0;
}

Honggfuzz HF_ITER(持久模式——大型目标的首选):

#include "honggfuzz.h"
int main(int argc, char** argv) {
    initialize_target(); // runs once
    for (;;) {
        size_t len; uint8_t *buf;
        HF_ITER(&buf, &len);
        FILE* s = fmemopen(buf, len, "r");
        target_function(s);
        fclose(s);
        reset_target_state();
    }
}

AFL++ 持久模式(__AFL_LOOP):

while (__AFL_LOOP(10000)) {
    // re-read input and process
}

macOS IPC(Mach 消息模糊测试):

void *lib_handle = dlopen("libexample.dylib", RTLD_LAZY);
pFunction = dlsym(lib_handle, "DesiredFunction");
4. 构建种子语料库
  • 从目标的测试套件、缺陷报告和真实样本中提取
  • 对文件格式进行网络爬取(Common Crawl);按 MIME 类型筛选
  • 最小化:afl-cmin -i raw_corpus -o seeds -- ./target @@
  • 裁剪输入:afl-tmin -i crash -o crash.min -- ./target @@
5. 启动模糊测试

AFL++ 并行运行(主实例 + 使用 cmplog 的次要实例):

afl-fuzz -M f1 -i seeds -o findings -x dict.txt -- ./target @@
afl-fuzz -S s1 -i seeds -o findings -c 0 -- ./target @@

libFuzzer:

./target_libfuzzer corpus/ -max_total_time=3600 -workers=4

仅二进制(QEMU):

afl-fuzz -Q -i seeds -o findings -- target.exe @@

快照(AFL++ Nyx):

NYX_MODE=1 AFL_MAP_SIZE=1048576 afl-fuzz -i seeds -o findings -- ./target_nyx @@

集成(AFL++ + Honggfuzz 共享语料库):

# Terminal 1
afl-fuzz -M fuzzer1 -i seeds -o sync_dir -- ./target @@
# Terminal 2
../honggfuzz/honggfuzz -i sync_dir/fuzzer1/queue -W sync_dir/hfuzz \
  --linux_perf_ipt_block -t 10 -- ./target ___FILE___
6. 监控并解除停滞

如果进度停滞:

  • 启用 CmpLog:在 AFL++ 次要实例上使用 -c 0
  • 添加字典:使用 -x dict.txt 或 AFL_TOKEN_FILE
  • 切换到定向模糊测试(AFLGo),针对特定 BB/函数
  • 在难以覆盖的分支上使用合谋辅助(QSYM、Driller)
  • 对目标创建快照以提高 exec/s
  • MOpt 调度器使用 AFL_MAP_SIZE=1048576、-L 0
7. 分析崩溃
# 1. Minimize
afl-tmin -i crash -o crash.min -- ./target @@
# 2. Symbolize
ASAN_OPTIONS=abort_on_error=1:symbolize=1 ./target crash.min 2>asan.log
# 3. Hash + bucket
./cov-tool --bbids ./target crash.min > cov.hash
./bucket.py --key "$(cat cov.hash)" --log asan.log --out triage/

Sanitizer 环境变量速查:

ASAN_OPTIONS=abort_on_error=1:symbolize=1:detect_stack_use_after_return=1
UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=1
TSAN_OPTIONS=halt_on_error=1:history_size=7
MSAN_OPTIONS=poison_in_dtor=1:track_origins=2

Oracle 选择

缺陷类别Oracle
内存安全ASan、HWASan(AArch64,开销较低)
未初始化读取MSan
并发TSan
未定义行为UBSan
类型安全TypeSan
堆加固Scudo Hardened Allocator
逻辑缺陷差分 / 幂等性 Oracle
内核内存KASAN、KMSAN、KCSAN
内核 UBKUBSan(CONFIG_UBSAN_TRAP=y)
CFIKCFI(-fsanitize=kcfi,Clang 18)
仅二进制QASAN(QEMU+ASan)、DynamoRIO

属性 Oracle 模式:

  • 幂等性:f(x) == f(f(x))
  • 差分:比较两个实现,按输出不匹配进行分类
  • 不变量:长度单调递增、校验和相等、解析后进行架构验证

专用目标

内核(Linux)—— syzkaller
{
  "target": "linux/arm64",
  "http": ":56700",
  "workdir": "/path/to/workdir",
  "kernel_obj": "/path/to/kernel",
  "image": "/path/to/rootfs.ext3",
  "sshkey": "/path/to/id_rsa",
  "procs": 8,
  "enable_syscalls": ["openat$module_name", "ioctl$IOCTL_CMD", "mmap"],
  "type": "qemu",
  "vm": { "count": 4, "cpu": 2, "mem": 2048 }
}
  • 限制 enable_syscalls,以加深对特定子系统的覆盖
  • 使用 syz-extract 提取自定义模块所需的常量
  • 启用 CONFIG_KASAN=y、CONFIG_KCFI=y、CONFIG_DEBUG_INFO_BTF=y
  • 使用 kcov 过滤器和 syz_cover_filter 引导覆盖
  • 网络模糊测试:通过 TUN/TAP + 伪系统调用(syz_emit_ethernet)注入
  • 崩溃解码:./scripts/decode_stacktrace.sh vmlinux ... < dmesg.log

syzkaller 重现:

syz-execprog -repeat=0 -procs=1 -cover=0 -debug target.repro
EDR / Windows 扫描引擎

WTF 快照 Harness 骨架(mpengine.dll / mini-filter):

g_Backend->SetBreakpoint("nt!KeBugCheck2", [](Backend_t *Backend) {
    const uint64_t BCode = Backend->GetArg(0);
    Backend->Stop(Crash_t(fmt::format("crash-{:#x}", BCode)));
});

FilterConnectionPort 模糊测试:

HANDLE hPort;
FilterConnectCommunicationPort(L"\\PortName", 0, NULL, 0, NULL, &hPort);
FilterSendMessage(hPort, fuzzData, sizeof(fuzzData), NULL, 0, &bytesReturned);

IOCTL 模糊测试模式:

HANDLE hDev = CreateFile(L"\\\\.\\DeviceName", GENERIC_READ|GENERIC_WRITE, ...);
DeviceIoControl(hDev, ioctlCode, inputBuf, inputLen, outBuf, outLen, &ret, NULL);
  • 在初始化后、解析/分派循环开始前创建快照
  • 使用 IDA Lighthouse 可视化覆盖情况
  • 监控:DRIVER_VERIFIER_DETECTED_VIOLATION (0xc4)、IRQL_NOT_LESS_OR_EQUAL (0xa)
  • WinDbg:.symfix; !analyze -v; k; !heap -p -a @rax

在 Linux 上跨平台运行 mpengine.dll(loadlibrary + HF_ITER + Intel PT):

// Bypass Lua VM to avoid stability issues
insert_function_redirect((void*)luaV_execute_address, my_lua_exec, HOOK_REPLACE_FUNCTION);
for (;;) {
    HF_ITER(&buf, &len);
    ScanDescriptor.UserPtr = fmemopen(buf, len, "r");
    __rsignal(&KernelHandle, RSIG_SCAN_STREAMBUFFER, &ScanParams, sizeof ScanParams);
}
Rust
# Full Rust fuzzing pipeline
cargo test                                         # 1. property tests
cargo +nightly miri test                           # 2. UB via interpreter
cargo +nightly careful test                        # 3. runtime bounds checks
cargo fuzz run fuzz_target_1 -- -max_total_time=3600  # 4. libFuzzer crashes
RUSTFLAGS="--cfg loom" cargo test --release        # 5. concurrency (if needed)
cargo fuzz coverage fuzz_target_1                  # 6. coverage report

重点关注不安全代码块中的:Vec::from_raw_parts、未经检查的索引、transmute 大小不匹配、指针运算、FFI 整数截断。

嵌入式 / 仅二进制
  • LibAFL:模块化 Rust 框架;Unicorn 引擎、快照模块、LBRFeedback(在 Intel 上无需插桩)、SAND 解耦式净化
  • Retrowrite / QASAN:无需源代码即可通过二进制重写实现覆盖率检测和 ASan
  • Nautilus:基于语法的结构化格式模糊测试
语言生态系统
  • Go 1.18+:go test -fuzz=Fuzz -run=^$ ./...
  • Python:Atheris(CPython 原生扩展模糊测试)
  • Rust:cargo-fuzz 或 honggfuzz-rs
  • JS 引擎:使用扩展插桩的 Fuzzilli(通过 __builtin_return_address(0) 跟踪 PC)
  • Wasm 运行时:wasmtime-fuzz、wafl,用于在 V8/Wasmer/Wasmtime 之间进行差分模糊测试
  • 智能合约:Echidna、Foundry-fuzz(Solidity);Move-Fuzz(Aptos/Sui)

CI/CD 集成

- name: Build with afl-clang-fast
  run: CC=afl-clang-fast make -j
- name: Fuzz (smoke, 15 min)
  run: timeout 15m afl-fuzz -i seeds -o findings -- ./target @@ || true
- name: Upload crashes
  if: always()
  uses: actions/upload-artifact@v4
  with:
    path: findings/**/crashes/*

使用 ClusterFuzzLite 进行持续的长期模糊测试;在不同运行之间缓存语料库。

崩溃分析速查

Linux:

ulimit -c unlimited && sysctl -w kernel.core_pattern=core.%e.%p
gdb -q ./target core.* -ex 'bt' -ex 'info reg' -ex q
addr2line -e ./target 0xDEADBEEF

Windows:

# Enable local dumps
New-Item 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps' -Force
# PageHeap
gflags /p /enable target.exe /full

内核 KASAN/KMSAN:

dmesg -T | egrep -i 'kasan|kmsan' -A 60
./scripts/decode_stacktrace.sh vmlinux /lib/modules/$(uname -r)/build < dmesg.log

**可复现性:**固定 CPU 调速器,仅在安全的情况下禁用 ASLR,固定 RNG 种子,在持久模式下保存输入序列,并在每次崩溃时记录二进制哈希和消毒器选项。

工具索引

工具用途
AFL++通用 GreyBox、CmpLog、MOpt、Nyx
HonggfuzzIntel PT、崩溃检测、HF_ITER
libFuzzer进程内模糊测试、提供源代码
syzkallerLinux/Windows 内核系统调用模糊测试
wtf快照模糊测试、Windows 目标
NyxAFL++ 快照模式(Intel PT)
SnapchangeAWS 快照模糊测试
LibAFL自定义 Rust 模糊测试框架
AFLGo针对目标 BB/函数的定向模糊测试
kAFL内核和操作系统模糊测试
Jackalope二进制覆盖率引导模糊测试(Windows/macOS)
cargo-fuzzRust libFuzzer 集成
AtherisPython 模糊测试
Nautilus基于语法的模糊测试
AFLTriage自动化崩溃分诊
afl-covAFL++ 覆盖率分析
ClusterFuzz分布式模糊测试基础设施

评论

支持 Markdown