模糊测试实战课
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/fuzzing-course-4hut 到 AI 助手。
技能介绍
为什么需要模糊测试
多数内存破坏漏洞——栈溢出、堆溢出、UAF、整数下溢——都藏在解析器、解码器这类处理不可信输入的代码里。单元测试只覆盖合法输入,人工审计在复杂指针运算面前也经常失手。模糊测试用自动化变异加覆盖率反馈,在数小时到数天内找出人类永远不会手动构造的边缘输入组合。
但真正的门槛不在理论:你要为目标写 harness、准备种子语料、配置 sanitizer、解读 ASAN 报告、对崩溃去重,还得忍受跑了很久却毫无发现的沉寂期。这门课程把这些环节拆成一套可执行的 checklist。
技能的核心工作流
- 环境与目标选择:在 Ubuntu 24.04 VM 上装好编译器与调试器,优先选输入驱动输出、无网络依赖的解析器——图像/媒体解码器是典型:字节进、图像出、执行确定。
- 种子语料与字典:语料质量优于数量。用合法 MP4/WebP 文件起步,配合格式感知字典加速到达深层代码路径。
- 覆盖率引导模糊测试:以
AFL++为变异引擎,编译期插桩,让ASAN/UBSAN把内存破坏立即变成可复现崩溃;并行 fuzzing 让吞吐接近线性扩展。 - 崩溃分诊与去重:按唯一栈签名区分真实 bug 与重复崩溃,再判断可利用性。
- 进程内 fuzzing:用 Google
FuzzTest把现有单元测试改写成FUZZ_TEST,同一二进制在 CI 里既能跑确定性测试,也能做长时间 fuzz campaign。
课程用 CVE-2024-47606(GStreamer)与 CVE-2023-4863(libWebP)做案例:前者靠持续 fuzzing 撞出有符号整数下溢,后者正是图像解码器模糊测试的典型战果。
适用边界与注意点
- 需要 C/C++、GDB 基础和 Week 1 的内存破坏漏洞知识,8GB RAM、8 核起步。
- Fuzzing 前期投入很重:搭 harness、连跑数天没有崩溃是正常的,真 bug 往往在数小时之后才浮出水面。
- 它擅长解析器类漏洞,对逻辑缺陷、依赖外部状态的漏洞不敏感。
- Fuzzing 产出的是崩溃线索而非漏洞结论:可利用性判断、补丁分析仍需人工完成。
- 8 核机器大约等于 8 倍吞吐,但先把种子语料做精,比单纯堆并行更划算。
使用场景
- 为图像解码器搭建 fuzz 环境:在 Ubuntu VM 编译 libWebP/GStreamer 并接入 ASAN,跑覆盖率引导模糊测试
- 解析器缺少 harness:给 MP4 demuxer 编写 fuzz target,配合法样本语料与格式字典后启动 AFL++
- 崩溃堆积难分:对 fuzzer 输出的 crash 按栈签名去重,用 ASAN 报告判断是真漏洞还是噪声
- 库已有单元测试:用 FuzzTest 把 TEST 改写成 FUZZ_TEST,在 CI 中跑长时间进程内 fuzzing
适合人员
- 渗透测试工程师,需要用 AFL++ 对目标解析器做 fuzz 并分诊崩溃是否可利用
- 安全研究员,计划通过 fuzzing 挖 CVE 级 0-day 并整理成漏洞报告
- 开发工程师,想给 C/C++ 库补 FuzzTest 模糊测试并接入 CI 持续回归
- 漏洞分析师,拿到 fuzzer 产出的 ASAN 报告后判断 bug 类型与严重程度