[Paper] HarnessAgent:规模化自动模糊测试 Harness 构建的工具增强 LLM 流水线
发布: (2025年12月3日 GMT+8 11:55)
7 min read
原文: arXiv
Source: arXiv - 2512.03420v1
概览
本文介绍了 HarnessAgent,这是一条自动化流水线,将大型语言模型(LLM)与传统软件工程工具相结合,以为开源项目中的数千个函数生成模糊测试 harness。通过解决缺失上下文问题并过滤掉“语法正确但语义无用”的代码,HarnessAgent 将基于 LLM 的模糊测试从概念验证提升到可扩展、可投入生产的工作流。
Key Contributions
- 基于规则的编译错误缓解 – 一个轻量级的静态分析层,能够检测并重写常见的构建时失败,防止其阻止流水线。
- 符号检索的混合工具池 – 集成基于 clang 的索引器、语言服务器协议以及全库范围的 grep 工具,以 >90 % 的成功率定位目标函数的精确来源。
- 增强的 harness 验证 – 多阶段检查器,能够发现“伪造”定义(例如,仅满足 LLM 验证指标的占位存根),并提前拒绝。
- 在 OSS‑Fuzz 上的实证评估 – 在 65 个 C 项目和 178 个 C++ 项目中共测试了 243 个目标函数,C 语言成功率为 87 %,C++ 为 81 %(相较于已有技术约提升 20 %)。
- 真实世界的模糊测试影响 – 超过 75 % 的生成 harness 在一小时的模糊测试运行中提升了目标函数的覆盖率,较基线提升超过 10 %。
方法论
- 目标选择 – 从 OSS‑Fuzz 项目中抽样函数,重点关注缺乏现成 harness 的内部(非公开)API。
- 上下文增强
- 一个 规则引擎 解析编译错误(缺失头文件、未定义符号、类型不匹配),并自动注入修复(例如,添加
#include、typedef 存根)。 - 一个 混合检索栈 进行查询:
- Clangd/LSP 用于精确的 AST 级符号定位,
- csearch/ctags 用于快速的粗粒度匹配,
- git‑grep 作为后备。
- 一个 规则引擎 解析编译错误(缺失头文件、未定义符号、类型不匹配),并自动注入修复(例如,添加
- LLM 提示 – 将增强后的上下文(函数签名、周围代码片段、使用示例)输入到最先进的 LLM(例如 GPT‑4),让其生成 C/C++ 候选 harness。
- 验证流水线
- 静态检查(使用 clang 编译,运行 clang‑tidy)。
- 动态健全性检查 – 使用最小输入执行 harness,确保目标函数真的被调用。
- 伪定义检测器 – 将生成的存根与检索到的符号进行比较,以捕获仅满足 LLM 表层度量的占位代码。
- 迭代细化 – 若任一检查失败,流水线会回退并向 LLM 提供错误反馈,循环直到 harness 通过所有阶段或达到超时。
结果与发现
| 指标 | C 项目 | C++ 项目 |
|---|---|---|
| 三次尝试成功率(harness 编译并验证) | 87 % | 81 % |
| 覆盖率提升(1 h 模糊测试后目标函数覆盖率提升 ≥1 %) | >75 % 的生成 harness | >75 % 的生成 harness |
| 源码检索命中率 | >90 %(对比 Fuzz Introspector 的 58 %) | >90 %(对比 Fuzz Introspector 的 58 %) |
| 相较于现有技术的整体改进 | 成功率提升 20 %,覆盖率提升 10 % | 成功率提升 20 %,覆盖率提升 10 % |
关键要点
- 基于规则的错误修复器消除了大多数导致手动干预的构建中断问题。
- 结合多种检索工具显著降低了“缺失符号”失败,这是内部函数常见的瓶颈。
- 虚假定义过滤器防止 LLM 利用验证指标进行投机,从而生成真正可执行的 harness。
实际意义
- 更快的安全测试流水线 – 团队可以为遗留代码库自动生成 harness,而无需手工编写,将数周的人工工作压缩到数小时。
- 更广泛的 OSS‑Fuzz 参与 – 以前缺少 harness 的项目现在可以自动上手,扩大持续模糊测试的覆盖面。
- 开发者工具 – 规则引擎和混合检索栈可以重新用于 IDE 插件,实时建议缺失的 include 或存根实现。
- 成本降低 – 更高质量的 harness 意味着模糊器更多时间用于执行真实逻辑,而不是碰到死路,从而提升漏洞发现的投资回报率。
- LLM 安全 – 验证流水线展示了一种实用模式,用于防护 LLM 输出免受表面正确性技巧的影响,这一经验同样适用于模糊测试之外的代码生成助手。
限制与未来工作
- 语言范围 – 当前实现面向 C 和 C++;若要扩展到 Rust、Go 或 Java,则需要针对特定语言的检索和编译修复。
- 对 LLM 的依赖 – 虽然该流水线缓解了许多 LLM 的怪癖,但仍依赖强大的模型;使用较小的开源 LLM 时性能可能下降。
- 动态分析深度 – 验证仅检查目标函数是否被调用,而未确保生成的输入能够有意义地覆盖边缘情况;将覆盖引导的输入合成集成进来是下一步。
- 对数百万函数的可扩展性 – 本研究评估了 243 个函数;未来工作将对整个代码库进行压力测试,以评估运行时和资源占用情况。
总体而言,HarnessAgent 展示了传统工具与 LLM 的精心协同组合,能够使自动化模糊测试 harness 生成成为现代软件开发中实用且可扩展的现实。
作者
- Kang Yang
- Yunhang Zhang
- Zichuan Li
- GuanHong Tao
- Jun Xu
- XiaoJing Liao
论文信息
- arXiv ID: 2512.03420v1
- 分类: cs.CR, cs.SE
- 出版时间: 2025年12月3日
- PDF: Download PDF