1. 覆盖引导 Fuzzing(Coverage-Guided)与生成式 Fuzzing(Generation-Based)的原理差异与适用场景?请分别说明 AFL++ 和 libFuzzer 的工作机制。
请解释覆盖引导 Fuzzing(Coverage-Guided)与生成式 Fuzzing(Generation-Based)的原理差异与适用场景,并分别说明 AFL++ 和 libFuzzer 的工作机制?
- 覆盖引导与生成式 Fuzzing 的原理差异
- 适用场景
- AFL++ 与 libFuzzer 的工作机制
覆盖引导 Fuzzing(Coverage-Guided)通过持续反馈"哪些新代码路径被覆盖"来引导变异方向:它维护一个语料库,对输入进行变异,执行后检查是否触发新的边覆盖(edge coverage),若触发新覆盖则保留该输入并继续变异,从而不断探索新代码路径。生成式 Fuzzing(Generation-Based)则基于已知的输入格式/语法(如协议、文件格式)直接生成符合格式的输入,不依赖覆盖反馈,适合格式已知的解析器。AFL++ 的工作机制:通过编译插桩(afl-gcc/afl-clang-fast)记录每个输入执行的边覆盖,用维护的队列(corpus)变异输入,保留触发新覆盖的种子,并使用确定性变异与随机变异结合、fork-server 并行执行加速。libFuzzer 的工作机制:与目标代码在同一个进程内链接(in-process),通过 LLVMFuzzerTestOneInput 入口对输入进行变异,利用 SanitizerCoverage 获取覆盖反馈,集成 ASAN/UBSAN 等 sanitizer,在内存内快速执行,适合库函数级模糊测试。
覆盖引导是当前 Fuzzing 的主流,因为它能自动探索代码路径;生成式适合格式严格、语法已知的输入。AFL++ 是进程级插桩、fork server 驱动,libFuzzer 是进程内链接、聚焦库函数,二者各有适用场景。