[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 %。

方法论

  1. 目标选择 – 从 OSS‑Fuzz 项目中抽样函数,重点关注缺乏现成 harness 的内部(非公开)API。
  2. 上下文增强
    • 一个 规则引擎 解析编译错误(缺失头文件、未定义符号、类型不匹配),并自动注入修复(例如,添加 #include、typedef 存根)。
    • 一个 混合检索栈 进行查询:
      • Clangd/LSP 用于精确的 AST 级符号定位,
      • csearch/ctags 用于快速的粗粒度匹配,
      • git‑grep 作为后备。
  3. LLM 提示 – 将增强后的上下文(函数签名、周围代码片段、使用示例)输入到最先进的 LLM(例如 GPT‑4),让其生成 C/C++ 候选 harness。
  4. 验证流水线
    • 静态检查(使用 clang 编译,运行 clang‑tidy)。
    • 动态健全性检查 – 使用最小输入执行 harness,确保目标函数真的被调用。
    • 伪定义检测器 – 将生成的存根与检索到的符号进行比较,以捕获仅满足 LLM 表层度量的占位代码。
  5. 迭代细化 – 若任一检查失败,流水线会回退并向 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
Back to Blog

相关文章

阅读更多 »