模糊测试交给智能体:它做决定,工具管执行
GitHub 安全实验室开源了一条面向 C 和 C++ 项目的自动模糊测试流水线:给它一个仓库名,它自己找入口、写测试桩、跑 AFL++、读覆盖率报告、改进测试桩、给崩溃分类并写出漏洞报告。设计上把决定交给智能体、把执行交给工具。作者同时提醒:它会在宿主机上直接运行模型选定的构建命令,只应放在用完即弃的环境里。
编辑标为重要,发布已满 30 天,从立即关注降到这一档。
本页目录11 节
记录
信号正文
#它想替掉的那部分人工
持续模糊测试不是一劳永逸的。接入多年的项目仍然藏着严重缺陷,原因几乎总是同一个:得有人盯着覆盖率,给没人触达的代码写新的测试桩,再把崩溃逐个分类。作者想知道这部分人工有多少可以交给智能体。
三层结构
- 一个脚本把各阶段串起来
- 每个阶段一份任务流描述,本质上是告诉智能体这一步做什么的提示
- 一组通过 MCP 提供的工具,真正去跑 AFL、编译测试桩、保存崩溃、读覆盖率
作者最在意的一条规则是职责分开:智能体负责决定,工具负责执行。智能体决定测什么、测试桩怎么写、下一个去追哪个覆盖缺口;工具只暴露基本操作。智能体从不直接调用 AFL 或编译器。所有状态都在一个 SQLite 数据库里,阶段之间只通过数据库传递。
每个测试桩会编译两次:一份带插桩用于引导模糊测试,一份带覆盖率统计用于事后回放队列、产出人读得懂的行覆盖和分支覆盖。
覆盖率反馈循环
每一轮,智能体让 AFL 跑一段时间,回放得到覆盖率报告,读未覆盖的分支,然后从几种动作里选一种:加一个能触达该分支的种子、改测试桩去调用更多接口、把判断条件里比较的常量补进字典,或者判断这是冷门错误路径而跳过。
时间预算每轮翻倍,从 30 秒到 960 秒,每个目标约 32 分钟。连续两轮的行覆盖率增量都低于 1 个百分点时,循环认为收益递减而停下。
分类与报告
循环结束后,每个崩溃被最小化、在内存检查器下回放取得调用栈、按栈顶去重;已知崩溃会在当前版本上重放,看上游是否已修。然后智能体读测试桩和崩溃函数,从公开接口回溯调用链,写出报告。
报告给出七种结论之一,其中最要紧的区分是:真正可从公开接口触达并利用的漏洞,还是测试桩自己的错误。每份报告附根因分析、可达性论证、修复补丁和回归测试草稿。补丁标着「需要复核」,作者明说:分析受限于模型对代码的理解,它确实会出错,结论应当看作给人准备的起点。
两处值得留意
运行环境:流水线在宿主机上直接运行模糊测试器、编译器和模型选定的任意构建命令,中间没有容器。作者的原话是,被提示注入的智能体原则上能做你这个用户能做的任何事,所以只应在一次性环境里、不带提升权限地运行。
模型选择:默认用 Claude Sonnet 5。理由是一些前沿模型会对输出加安全护栏,而它通过了全部内部测试。
文章没有给出这条流水线到目前为止找到了多少漏洞。
为什么是现在
为什么重要
#这是一份写得足够细的参考设计:哪些事交给模型判断,哪些事用确定的工具去做,什么时候停。它要解决的不是模糊测试本身,而是模糊测试一直以来扩展不开的那部分人工。
背景
技术背景
#模糊测试向程序喂大量变异出来的输入,靠覆盖率反馈去探索新的代码路径。测试桩是把被测函数包起来、让模糊测试器能调用它的一小段代码。结构化的文本输入很难靠按位变异撞出来,所以需要字典和针对格式的变异器。
关注人群
谁该关注
#下一步
学习路径
#- 先读《工具使用与函数调用》:工具粒度怎样影响智能体的可靠性
- 读本站 Copilot 代码审查复盘:更好的工具为什么会让智能体更差
- 对照 DeepSeek DSec:攻防类任务为什么要更强的隔离
- 在一次性环境里拿一个小项目试跑,先看它的崩溃分类准不准
关系网络
在技术网络中的位置
#当前技术与相邻技术、技能和背景知识的连接,点击节点可继续探索。
延伸思考
后续问题
#- 你的流程里,哪些步骤应该由模型判断,哪些应该写成确定的工具?
- 让模型选定的命令在哪里运行,运行环境用完之后会被销毁吗?
- 崩溃分类的结论由谁复核,复核的成本比人工分类低多少?
发布记录
收录于
#收录这条信号的技术简报,新的在前;最后一行是它那一周的周回顾。标签是它在那一期所在的栏目。
来源参考