来源笔记
Fuzzing with Agents? Generators Are All You Need
摘要
Gentoo 使用一个 LLM 编码代理,基于源代码和可选的谓词级反馈,为目标程序编写特定的模糊测试输入生成器。论文在 7 个 Java 基准上声称,这些代理生成的生成器通常比人工编写的生成器有更高的分支覆盖率,而且让覆盖率引导的变异大多变得不再必要。
问题
- 结构化输入的模糊测试器常常失败,因为随机输入或轻微变异后的输入无法满足到达深层程序逻辑所需的语法和语义约束。
- 人工编写的领域特定生成器可以解决这个问题,但需要大量手工工作,而且通常只适用于单一目标。
- 论文想回答的是,AI 编码代理能否自动写出这种强生成器,从而减少或取消对覆盖率引导和变异的依赖。
方法
- Gentoo 给 LLM 编码代理终端访问权限、模糊测试目标以及库的源代码,然后要求它迭代编写和改进一个 JQF 输入生成器。
- Gentoo-S 加入静态谓词排序:它构建跨过程控制流图,用 WALA 计算分支支配分数,并告诉代理哪些分支结果会卡住最多代码。
- Gentoo-L 用代理基于源代码检查给出的谓词排序替代静态分析。Gentoo-Base 不提供谓词指导。
- 在模糊测试过程中,Gentoo-S 和 Gentoo-L 会收集每个谓词的分支计数,这样代理就能看到哪些高价值分支很少被走到,并为这些条件补充生成逻辑。
- 核心思路很直接:检查程序,推断什么样的输入结构和语义能打开难分支,然后把这些规则直接编码进生成器,而不是依赖变异去发现它们。
结果
- 评估覆盖 7 个真实世界的 Java 库,并将 3 个 Gentoo 变体 与 人工编写的生成器 对比。
- 代理合成的生成器在 7 个基准中的 6 个 上取得了比人工生成器更高的分支覆盖率,其中 7 个中的 4 个 达到 统计显著 的提升。
- 相对于人工编写的生成器,报告的平均覆盖率提升为 11% 到 21%,具体取决于配置。
- 对代理合成的生成器来说,使用覆盖率引导的变异而不是随机生成,在典型情况下只带来 不到 3% 的提升,论文说这些差异 没有统计显著性。
- 对人工编写的生成器,覆盖率引导在所有基准上都被报告为 统计显著,这支持了这样一个说法:Gentoo 生成器已经编码了足够的结构和语义,变异带来的额外收益很小。
- 与各方法的第一轮相比,谓词引导的细化让覆盖率提高了 18% 到 57%,分别对应 Gentoo-S 和 Gentoo-L 的平均提升;不过 Gentoo-Base、Gentoo-S 和 Gentoo-L 的最终覆盖率被描述为整体上接近。