自动程序修复(APR)技术旨在自动分诊和修复软件错误,已成为对抗易受攻击代码的强大工具 。大型语言模型(LLM)的最新进展在应用于 APR 时,尤其是在补丁生成方面,显示出可喜的成果 。然而,缺乏有效的故障定位和补丁验证,仅专注于补丁生成的 APR 工具无法处理更实用和端到端的场景——即给定一个触发漏洞的具体输入,如何在不破坏现有测试的情况下修补程序🤔
今天为大家推荐来自在USENIX Security2025的工作PatchAgent: A Practical Program Repair Agent Mimicking Human Expertise或许可以解答这一疑问, 今天的论文推荐由自美国西北大学完成并投稿。作者介绍了 PatchAgent,一种新颖的基于 LLM 的 APR 工具,它在单个自主智能体中无缝集成了故障定位、补丁生成和验证 。PatchAgent 采用语言服务器、补丁验证器和交互优化技术,以在漏洞修复过程中模仿类似人类的推理 。在一个包含178个真实世界漏洞的数据集上进行评估,PatchAgent 成功修复了超过90%的案例,在适用情况下优于最先进的 APR 工具 。作者的消融研究进一步揭示了各种交互优化如何促成 PatchAgent 的有效性。
本工作的主要贡献如下:
-
提出了一个新颖的基于 LLM 的 Program Repair Agent,它利用语言服务器和补丁验证器来分析程序、生成补丁并进行验证 。
-
引入了四种交互优化技术(Report Purification、Chain Compression、Auto Correction和Counterexample Feedback)来增强 PatchAgent 的修复性能 。消融研究证明了它们在提高修复性能方面的有效性 。
-
对原型进行了评估并提供了深入分析,证明了 PatchAgent 的有效性和高效性,包括针对 LLM 从未遇到过的漏洞 。
-
PatchAgent 已经产生了Real-World Impact。作者成功使用 PatchAgent 修复了许多真实世界的漏洞,部分已经通过提交PR合并。
PatchAgent 背后的关键想法是模仿人类开发人员漏洞诊断和修补错误的方式 。这通常包括一系列混合的动作,从理解错误报告、理解代码片段、解析符号定义、编写补丁到应用补丁进行验证 。由于大多数预训练的 LLM 仅原生支持部分操作,作者额外使用了一个语言服务器(用于解析符号)和一个补丁验证器(用于应用补丁验证)作为 LLM 智能体的能力 。
然而,仅仅向 LLM 智能体提供这些能力并不足以使其像开发人员那样“推理” 。为了解决这个问题,作者在 LLM 智能体和所提供能力的 API 之间引入了一个辅助推理中间件 。该中间件包含四种机制:报告净化(Report Purification)以方便 LLM 解释错误报告 ;链压缩(Chain Compression)以缩短 LLM 智能体的推理链 ;自动纠错(Auto Correction)以纠正 LLM 与能力 API 交互期间发生的错误 ;以及反例反馈(Counterexample Feedback)以鼓励 LLM 智能体生成多样化的补丁 。这些优化带来了显著的改进 。
PatchAgent 的整体框架如图所示 。它以 Sanitizer 报告(如 ASAN report)和项目代码库作为输入 。智能体首先分析Sanitizer 报告,并与项目代码库交互以检索相关的代码上下文 。一旦检索到足够的代码上下文,智能体就会生成一个补丁并调用验证 API 来检查补丁的正确性 。如果补丁不正确,它会向智能体提供反馈,智能体将优化补丁或检索生成补丁所需的额外代码上下文 。这个过程会重复进行,直到生成正确的补丁或耗尽每轮的预算 。
PatchAgent 中四种交互优化机制设计如下:
-
报告净化 (Report Purification/RP)
该机制旨在解决大语言模型(LLM)难以完全理解原始、复杂的编译器或工具(如Sanitizer)报错报告的问题。它通过一个解析器,将充满噪声和复杂信息的原始报告,转换成LLM更容易处理的简洁、清晰的格式。具体操作包括:去除不必要的符号(如内存地址)、重新计算数值数据、为专业术语(如漏洞类型)附加清晰的解释,并附上修复建议,从而帮助LLM更准确地聚焦于关键信息。
-
链压缩 (Chain Compression/CC):
此机制用于解决LLM在与代码库交互时效率低下的问题,例如需要多轮对话才能收集到完整上下文。它通过自动执行一些琐碎的、可预测的后续操作来“压缩”交互链。例如,当LLM请求查看一个变量的定义后,该机制会自动获取该变量定义所在的代码片段,并递归查找其依赖的其他符号,然后将所有信息一次性返回给LLM。这减少了交互次数,提高了决策效率。
-
动作纠正 (Auto Correction/AC):
该机制用于解决LLM在调用工具时可能产生无效或低效参数的问题,从而避免了因参数错误而导致的多次无效尝试。它能自动纠正LLM生成的行为中的错误。例如,如果LLM请求查看的代码范围过小,它会自动扩大范围以提供更完整的上下文;如果LLM在定位符号定义时提供的行列号不精确,它会根据上下文进行修正;对于生成的补丁,它能利用最小编辑距离算法自动修正补丁文件中的行号和上下文代码错误。
-
反例反馈 (Counterexample Feedback/CF):
此机制旨在解决LLM在多次尝试修复时可能反复生成相似无效补丁的问题,即缺乏自我反思能力。它会将验证失败的补丁作为“反例”保存下来 。在后续的修复尝试中,这些反例会被加入到提示(Prompt)中,明确告知LLM不要再生成类似的错误补丁。这能促使LLM跳出固有的修复模式,探索更多样化的解决方案,从而提高找到正确补丁的可能性。
作者在一个包含来自 OSS-Fuzz、Huntr 和 ExtractFix 的178个真实世界漏洞的数据集上对 PatchAgent 进行了评估,这些漏洞涵盖了9种不同的错误类型 。PatchAgent 展示了卓越的性能,成功修复了92.13%的漏洞 。每个修复方案都通过了安全测试和功能测试 。与两个目标相似的最先进的 APR 方法(ExtractFix 和 Pearce 等人的方法)相比,PatchAgent 表现更优。
为了评估各个交互优化机制的影响,作者进行了消融研究 。结果如表3所示,通过停用每个优化组件(报告净化RP、链压缩CC、动作纠正AC、反例反馈CF),观察其对修复率的影响 。完整的 PatchAgent 系统(基于GPT-4o)实现了77.33%的修复率 。当禁用报告净化(RP)时,整体修复率显著下降至64.00%,尤其是在时间性错误(Temporal errors)方面,修复率降至27.27%,这突显了RP在优化报告方面的关键作用 。禁用反例反馈(CF)也导致整体修复率降至70.67%,CF组件对于处理时间性错误至关重要,其修复率从63.64%降至54.54% 。关闭链压缩(CC)导致修复率降至62.67%,对空间性错误(Spatial errors)影响显著,修复率从72.73%降至60.00% 。禁用动作纠正(AC)导致了显著的性能下降,因为没有此优化,LLM甚至难以生成格式正确的补丁 。
在效率分析方面,作者评估了 PatchAgent 在不同 LLM 模型下的 Token 消耗和时间成本 。如表5所示,Claude-3 Opus 实现了最高的修复成功率(84.83%),但平均每个任务的成本也最高($2.15) 。Claude-3 Haiku 提供了最具成本效益的解决方案,每个任务仅需$0.10,但修复率为71.79% 。GPT-4o 和 GPT-4 Turbo 在成本和修复率之间提供了不同的权衡 。时间成本分析(图4)显示,GPT-4 Turbo 的修复速度最快,平均修复时间约为28.7分钟,而其他模型的修复时间约为45分钟 。在所有模型中,“验证(validate)” 步骤占据了大部分时间(74%至82%),其次是与LLM通信的 “模型(model)” 时间(17%至27%) 。
除此以外,作者也对一些 Failure Cases 进行分析,以下是两个例子:
这是一个在 wasm3 项目中发现的空指针解引用漏洞 。虽然表面上看是 info.message 指针为空导致的,但 PatchAgent 尝试添加常规的空指针检查后,却引发了新的错误,表明简单的修复是无效的 。 经过人工分析,发现根本原因在于程序初始化过程中错误的异常处理逻辑 。要正确修复此漏洞,需要检查并理解所有可能触发该异常处理的地方,这对于自动化工具来说过于复杂。
CVE-2022-1286
这是在 mruby 项目中发现的一个堆溢出漏洞。该项目大量使用了“间接调用”(indirect calls),即在运行时才能确定具体调用哪个函数。导致漏洞的根本原因函数恰好是通过一个间接调用触发的PatchAgent 的语言服务器(Clangd)只能提供静态代码信息,无法在没有运行时信息的情况下确定间接调用的目标,因此无法进一步分析到真正的漏洞根源 。
PatchAgent作为一个自动化的端到端程序漏洞修复工具。通过结合 LLM 的能力,并利用专门的故障定位、补丁生成和验证模块,PatchAgent 能够模拟人类专家的决策过程。交互优化进一步增强了智能体生成准确且多样化补丁的能力。在多样化的真实世界漏洞数据集上的广泛评估表明,PatchAgent 相较于现有的 APR 工具具有更优越的性能,能够以高准确率成功修复绝大多数漏洞。
截至目前为止,作者通过 PatchAgent 已经成功修复了多个 Real-World Vulnerabilities 并通过 Github PR 合并,包括 assimp,libssh2,hdf5,libredwg,Pcap++ 等多个项目。此外,一部分作者作为 42-b3yond-6ug 团队的成员进一步定制和改进了它,利用其能力参加了 DARPA AIxCC 竞赛(作为整个Cyber-Reasoning-System中的一个组件),成功获得了Semi-Final Winner,并晋级 Final(top 7 finalist teams)。
AIxCC:https://www.darpa.mil/news/2024/ai-cyber-challenge-cybersecurity
42-b3yond-6ug:https://b3yond.org/team
更多细节可访问仓库:https://github.com/cla7aye15I4nd/PatchAgent
文章链接:https://www.dataisland.org/paper/patchagent.pdf
投稿作者介绍:
于峥:美国西北大学(Northwestern University)博士生,专注于软件安全与程序分析领域。他在安全顶会USENIX Security上发表了多篇论文,涵盖程序自动修复、内存安全防护、大语言模型安全评估等核心领域,其中PatchAgent程序修复智能体、CAMP/ShadowBound内存保护方案和GPTFuzzer大语言模型越狱评估工具等工作在学术界产生了重要影响。作为42-b3yond-6ug团队核心成员,他在DARPA AIxCC竞赛中设计程序修复系统,助力团队赢得半决赛以及200万美元奖金。他还积极参与学术服务,担任NeurIPS、ICML、USENIX Security等顶会议的审稿人。
个人主页:https://www.dataisland.org/
郭子仪:美国西北大学(Northwestern University)博士生,研究方向:漏洞利用、程序修复。他在安全顶会上发表多篇论文,主要涵盖:内核漏洞利用、云原生漏洞利用、大模型程序修复 等领域,他还担任USENIX Security AE审稿人。作为42-b3yond-6ug团队核心成员,他在DARPA AIxCC竞赛中参与开发与设计程序修复系统,助力团队赢得半决赛以及200万美元奖金。此外,他还多次参加DEFCON CTF final/Google CTF等。
个人主页: https://sites.google.com/view/ziyiguosite
原文始发于微信公众号(安全研究GoSSIP):G.O.S.S.I.P 阅读推荐 2025-06-27 PatchAgent
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论