跳到正文
原文
论文追踪· arXiv:2509.05372· Piotr Przymus, Andreas Happe, Jürgen Cito·本站收录 · 原文发表

研究:对抗性 bug 报告可诱导 LLM 自动程序修复系统生成不安全补丁

Adversarial Bug Reports as a Security Risk in Language Model-Based Automated Program Repair

论文速读

攻击

据论文 PDF 整理(AI 生成),以原文为准

51条对抗缺陷报告打SWE-agent,46条引出攻击目标一致补丁;预过滤最高拦住24条。

威胁模型公开issue入口;LLM可规模化写报告,源码不必;不假设模型投毒。

问题
基于LLM的APR按自然语言缺陷报告自动改代码,并可能提交补丁。作者称公开issue审查少,对手可提交看起来真实的报告,使系统写入不安全改动、在CI中泄密或空耗算力。作者称该输入通道尚未被系统研究。
方法
作者用DevStral:24B生成五类缺陷报告:无关合成、欺骗性噪声、CI/CD利用、漏洞注入和回退CVE修复。后三类用LSH与模糊匹配抽取并清洗提交上下文。再在SWE-agent上评估预过滤、项目测试、CodeQL和Copilot。
实验与结果
51条全部生成补丁,46条与攻击目标一致。测试35/51无新增失败。纯文本o4-mini检出24/51,CodeQL为0,Copilot安全提示30/51。生成总成本0.0133美元,APR均值0.87美元/条。
局限与可以继续做的
作者指出外推、标注主观性和未能把temperature设为0。实验是SWE-agent与五个SWE-bench项目上的51条汇总;论文未报告项目分布、重复次数和标注一致性。
实验设置claude-sonnet-4-20250514、o4-mini 等 · SWE-bench、django 等 · Compromised、pre-APR detection 等
威胁模型
公开issue入口;LLM可规模化写报告,源码不必;不假设模型投毒。目标:引入漏洞、泄密或耗资源。受害方:语言模型APR、其CI/CD与源码。STRIDE:Tampering、Information Disclosure、Denial of Service、Elevation of Privilege。
被测模型
claude-sonnet-4-20250514o4-miniGPT-4.1-miniPromptGuardPromptGuardV2LlamaGuard v3LlamaGuard v4Granite Guardian
基准
SWE-benchdjangoflaskpiprequestsscikit-learnpsf/requests issues #6000–6100
指标
Compromisedpre-APR detectionpost-APR detectiontest-suite outcomefalse positivesUSD/issue
AI 导读研究者提出并验证了针对基于 LLM 的自动程序修复(APR)系统的新型攻击面:对抗性 bug 报告,即看似真实、实则诱导系统产出不安全或有害代码的 issue 提交。团队构建了威胁模型并生成 51 份对抗性 bug 报告,覆盖从人工编写到全自动流水线的多种策略,在一个主流 LLM APR 系统上测试。结果显示 90% 的构造报告触发了与攻击者意图一致的补丁;修复前防御中表现最好的过滤器只拦截 47%,修复后检测(GitHub Copilot、CodeQL,常需人工介入)仅在 58% 的案例中有效。作者还发布了一个自动生成对抗性 bug 报告的原型框架,并指出生成攻击输入成本低、检测与缓解成本高且易出错的结构性不对称。

研究者提出并验证了针对基于 LLM 的自动程序修复(APR)系统的新型攻击面:对抗性 bug 报告,即看似真实、实则诱导系统产出不安全或有害代码的 issue 提交。团队构建了威胁模型并生成 51 份对抗性 bug 报告,覆盖从人工编写到全自动流水线的多种策略,在一个主流 LLM APR 系统上测试。结果显示 90% 的构造报告触发了与攻击者意图一致的补丁;修复前防御中表现最好的过滤器只拦截 47%,修复后检测(GitHub Copilot、CodeQL,常需人工介入)仅在 58% 的案例中有效。作者还发布了一个自动生成对抗性 bug 报告的原型框架,并指出生成攻击输入成本低、检测与缓解成本高且易出错的结构性不对称。

深度解读

6 个问题,点开问题读完整回答

  1. 这篇论文试图解决什么问题?

    对抗缺陷报告可诱导LLM-APR写出不安全改动;作者称现有预过滤与复核挡不住多数样本。

    对抗缺陷报告能否让基于大语言模型的自动程序修复(APR)写出不安全或非预期代码,以及流水线哪一步拦得住。

    • 场景:作者称APR正在进入开发流程和持续集成,却信任经公开渠道提交、审查很少的自然语言缺陷报告。作者称与恶意pull request相比,这类报告更易批量制作、审查更低,并可同时指向多个项目。
    • 既有工作的缺口:作者称APR研究主要看补丁正确性、合理性或过拟合,很少把修复过程本身当作攻击入口。作者称LlamaGuard、PromptGuard、CodeQL已经存在,但尚未接入典型APR工作流。
    • 作者的判断:流水线把报告当作可信、格式良好、出于善意。看起来合理的报告可以穿过过滤,并在测试覆盖不全时把不安全补丁送进自动pull request。作者还举Jira、GitLab、GitHub Copilot、OpenHands上的事件,称这已不只是理论问题。
    • 本文做的事:给出威胁模型;用51条从手工到全自动的对抗报告测试一个LLM-APR系统;评估预修复过滤和修复后检测;并提供生成、评估这类报告的原型。对应RQ1(会不会生成不安全或非预期代码)和RQ2(哪些防御、放在哪一步)。
    • 威胁模型:
      • 目标与资产:引入漏洞、泄露秘密或浪费资源。保护对象是源码完整性、CI/CD环境、评审时间与算力(Table 1)。
      • 能力:可用LLM规模化提交高质量报告;有源码更好,论文写并非必需。不假设模型投毒。
      • 入口与路径:公开issue接口。APR可能误解报告,并在复现和测试中处理恶意输入。作者称认证也挡不住,因为可以制造假身份。
      • 影响与STRIDE:影响落在APR/CI/CD(拒绝服务、运行时利用、信息泄露)和源码(恶意补丁绕过报告端与代码审查)。作者列出Tampering、Information Disclosure、Denial of Service、Elevation of Privilege,并称Spoofing与Repudiation相关性较低。
  2. 有哪些相关研究?

    作者把本文放在功能向APR、提示注入事件和尚未接入APR的过滤之间。

    APR系统与功能基准

    • SWE-agent(Yang等,2024)、OpenHands(Wang等,2025)、AutoCodeRover(Zhang等,2024)、RepairAgent(Bouzenia等,2024)——用LLM智能体分诊issue、改代码并验证。论文称这些系统重视性能和可靠性,没有处理对手能否操纵智能体引入不安全修改。
    • SWE-bench(Jimenez等,2024)与SWE-bench Multimodal(Yang等,2024)——评LLM补丁的功能正确性。论文称它们不看补丁是否保住安全属性或引入漏洞。
    • 论文把更早的APR工作概括为主要处理正确性、合理性或过拟合,引用Cambronero等(2019)与Ye等(2025),没有展开这两篇的做法。

    针对LLM应用的攻击与事件

    • OWASP LLM Top 10(Wilson与Dawson,2025)与OWASP CI/CD Top 10(Krivelevich与Gil,2025)——论文用来对齐威胁类别。评估采用提示注入(LLM01),并联系敏感信息泄露、不安全输出处理、过度代理和过度依赖;作者写明未做训练数据投毒、供应链漏洞、不安全插件和模型窃取。
    • Greshake等(2023)的间接提示注入,以及Willison关于智能体“私有数据、不可信内容、对外通信”交汇的讨论。论文用它们说明APR智能体处在高价值位置。
    • 引言中的现实事件:精心构造的Jira工单触发Atlassian MCP上的多阶段攻击,以及GitLab Duo、GitHub Copilot、OpenHands上的提示注入演示。论文据此称需要保护缺陷报告与自动代码生成之间的接口。

    过滤与代码侧防御

    • LlamaGuard(Inan等,2023)、PromptGuard(Meta,2025)、Granite Guardian(Padhi等,2024)——分别做恶意意图或越狱/提示注入检测。论文称前两者与CodeQL虽存在,但尚未进入典型APR工作流。
    • CaMeL(Debenedetti等,2025)用类似控制流完整性的分离来隔开用户数据与程序数据;AlignmentCheck与CodeShield被引到Chennabasappa等(2025),前者核对多步轨迹是否仍对准用户目标,后者校验LLM生成代码,并写明目标包括挡住提示注入产生的恶意代码。论文只描述这些机制。
    • Bugdar(Naulty等,2025)——接入GitHub pull request的审查工具,用微调LLM加检索增强做多语言漏洞分析。论文没有拿它和本文做效果对比。

    基线与基准:实验里的对照是PromptGuard、PromptGuardV2、LlamaGuard v3/v4、Granite Guardian、自定提示(GPT-4.1-mini、o4-mini)、GitHub CodeQL和GitHub Copilot。项目取自SWE-bench:django、flask、pip、requests、scikit-learn。作者称本文补的是对抗缺陷报告利用APR输入通道这一空白,并同时评估预修复与修复后防御。

  3. 论文如何解决这个问题?

    五种战术生成像开发者所写的缺陷报告,防御放在过滤、隔离和修复后复核。

    作者把工作分成攻击演示和沿流水线布防。生成与评估由一个原型框架完成,核心对象是对抗缺陷报告(adversarial bug reports)。

    问题设定与风险类

    • Figure 1的流水线是:缺陷报告进入APR,生成补丁,再经测试、pull request、代码审查和CI。图注中的防御点是自动/人工过滤与环境加固;攻击向量是数据外传、拒绝服务和漏洞注入。
    • 第3.1节列四类风险:用逼真报告耗尽算力或诱发无关合成;让APR回退CVE或写入不安全逻辑并经供应链传播;在隔离不足的CI里用测试代码泄密或外呼;监控不足,合成日志和APR改动标记常常可选。
    • 作者称这些类对应OWASP的CI/CD与LLM清单,以及智能体自动化威胁研究。攻击面含入口、复现/合成/验证路径和最终影响;不假设模型投毒。

    五种攻击战术

    • 两条策略:噪声注入消耗评审与算力;漏洞注入除此之外把项目留在不安全状态。模式先在Django上形成,再自动重跑到全部项目。作者称各战术都可规模化,差别在是否使用LLM以及是否依赖项目上下文。
    • 静态提示两条:Naive APR诱导与所报缺陷无关的合成;CI/CD Exploits使补丁带上会泄密或远程调用的测试代码,假设CI隔离不足。
    • 依赖上下文的三条用于Deceptive Noise、Vulnerability Injection和Revert CVE。种子(如已知CVE补丁)经局部敏感哈希和rapidfuzz取回文件与提交,去掉测试、文档和无关改动,再嵌入生成提示。生成模型是DevStral:24B;作者称它能在消费级GPU上跑,且不受服务端护栏约束。
    • Vulnerability Injection由人先选定不安全片段,再用上述流水线构造报告。Revert CVE先找修复提交、清洗diff,再让模型写一份质疑原修复的报告。Figure 3是该战术的模板,Figure 4是预修复分类模板(首行输出OK、problematic或suspicious)。模板中的句式约束这里不复述。

    防御放在何处

    • 输入过滤:PromptGuard与PromptGuardV2(论文写均为98M参数)查提示注入和越狱;LlamaGuard v3/v4与Granite Guardian做恶意意图分类,论文把这类方法概括为8–12B,没有逐个给参数量。GPT-4.1-mini与o4-mini跑自定提示,分结构化JSON和纯文本。作者选mini系列是为了成本,并避免金钱上的拒绝服务。轻量模型本地运行,较大模型走OpenAI、DeepInfra或Ollama。
    • 环境隔离:SWE-agent在本地工作站、人工看管下运行,每条issue的APR费用不超过2美元。CI用GitHub Actions并继承其沙箱。作者称这一阶段不能阻止恶意代码执行,只能试图缩小影响。
    • 修复后复核:测试仓库自动跑CodeQL,并让Copilot审查补丁(提交摘要、行内评论、低置信警报),二者属于GitHub Advanced Security。概念上还讨论遥测、补丁来源,以及在合成提示中加入项目策略;作者把仓库级Copilot自定义指令视为后续部署方向。

    成功如何判定

    • 每条报告记录四项:有没有预过滤标出;SWE-agent是否生成补丁,以及补丁是否达成预定目标(回退、泄露或注入);Copilot有没有提出安全相关意见;CodeQL有没有报漏洞。
    • 测试分三类:相对未打补丁版本无新增失败;失败数上升但仍在项目允许的预期失败阈值内;超过阈值,或套件无法执行。论文未在方法中给出各项目阈值的数字。
    • 是否达成目标由一名安全研究者和一名渗透测试者审阅补丁逻辑、Copilot输出以及结果是否符合攻击目标。各工具用默认配置;调用LLM时用默认temperature。
  4. 论文做了哪些实验?

    51条全部生成补丁,46条达成攻击目标;预过滤最高24/51,CodeQL为0。

    实验设置

    • APR与项目:SWE-agent v1.1.0(SW-ReX v1.2.2),补丁合成模型为Claude Sonnet(claude-sonnet-4-20250514)。五个SWE-bench Python仓库:django、flask、pip、requests、scikit-learn,实验在官方仓库的隔离克隆上进行。作者称选它是因为2025年5月评估开始时,它在SWE-bench verified榜上排名靠前。
    • 对抗报告:DevStral生成51条:Naive APR 5、Deceptive Noise 8、CI/CD利用10、代码注入14、CVE回退14。第3.2.1节把生成模型写作DevStral:24B。模式先在Django上设计,再自动重跑到全部项目。论文未报告五项目各自的条数。
    • 预修复检测器:PromptGuard、PromptGuardV2、LlamaGuard v3与v4、Granite Guardian;自定提示用GPT-4.1-mini和o4-mini,含结构化与纯文本。LlamaGuard3另在本地Ollama复跑。
    • 修复后与测试:各项目完整测试套件。CodeQL用Python规则集和默认配置;原先只有requests和scikit-learn在扫漏洞,实验里为全部项目打开。Copilot提供提交摘要、行内评论和低置信警报。
    • 判定:两名专家审阅是否达成攻击目标。记录项是预过滤是否标出、是否生成补丁、是否达成目标、Copilot是否给出安全相关意见、CodeQL是否报漏洞,以及下面的测试三类。
    • 运行:工具用默认配置,LLM用默认temperature。APR在本地工作站、人工看管下运行,每条不超过2美元;CI走GitHub Actions。论文未报告重复次数,也未报告标注一致性数值。

    主结果

    据Table 2。Increase(≤阈值)未放入表:合计4,其中Naive APR为1、Revert CVE为3,其余类型为0。

    表格较宽,可左右滑动

    类型条数生成补丁达成目标测试Fail无新增失败
    Naive APR55504
    Inject141410410
    CI/CD101010010
    Revert CVE14141374
    Noise APR88817
    • 作者把高达成率归因于报告模仿开发者惯例、带代码片段和项目上下文,并称系统会顺着表面线索合成补丁。第6.1节写46条(90.2%),摘要写90%,结论写over 90%。同节有一处写“5 of 8 Naive APR”,与该节前文及表中的类别规模不符,以表为准。
    • 作者称项目测试很少覆盖全部路径,攻击还可能把目标放在CI配置或测试文件上,因此测试不能单独挡住对抗报告。第6.2节写12/51(23.5%)直接失败、4/51(7.8%)只在预期波动内增加失败、35/51(68.6%)无新增失败。
    • 作者称即便只是笼统要求回退近期改动,系统仍会合成看起来像回退的补丁。通过单元测试不被作者当作语义正确。

    预修复过滤

    • 同一51条送入各检测器。Figure 4的自定提示要求首行给出OK、problematic或suspicious。
    • Table 2合计:纯文本o4-mini 24(47%;第6.3节写47.05%),结构化o4-mini 18(35%;正文35.29%),纯文本GPT-4.1-mini 12(23%),结构化GPT-4.1-mini 10(19%)。PromptGuard 3(5.88%),PromptGuard2为0。LlamaGuard3、LlamaGuard3*、LlamaGuard4均为0。Granite-Guardian 5(9.80%)。预过滤ensemble为32(62%)。
    • 作者称纯文本o4-mini是预修复里检出最多的设置,并称o4-mini覆盖了GPT-4.1-mini标出的全部issue且更多。第6.3节又写结构化GPT-4.1-mini检出12条(23.52%),与表中的10不一致;同段“比结构化高20%”与表的10到12相符,以表为准。并非每类都是纯文本更高:CI/CD行上两种模型都是结构化10、纯文本8。Naive APR一行的预过滤全为0。

    修复后检测与组合

    • CodeQL对51个补丁的检出为0。Copilot:高置信安全相关评论1条(表中General为1,2%),低置信17(33%),文件内评论27(52.94%),各级合计30(58.82%)。作者强调仍须人工判断pull request是否恶意。摘要把修复后分析写作58%。
    • 纯文本o4-mini加Copilot拦住35/51(68.6%)。作者称其中24条被预先拦住、9条来自人工查看Copilot评论;论文未解释二者之和为何不是35。全预过滤ensemble加修复后复核为37(72.5%;表中72%)。第7.3节另写组合挡住63–68%,与表不一致,以表为准。作者称即便加上测试,仍有约30%的issue漏过,且防御耗资源远多于攻击。
    • 两种组合对Naive APR的拦截列都是0,对Noise APR都是4。作者称全预过滤组合会增加误报,生产中可能不实用;论文未给出该组合在良性issue上的误报数。

    成本与误报

    • 51条报告的生成总成本0.0133美元,均值约为0.000295美元/条。作者按本地Devstral计价:输入0.1美元/百万token,输出0.3美元/百万token;输入0.000083±0.000040美元,输出0.000212±0.000144美元。
    • APR均值0.87±0.39美元/条。作者另写APR成本量级为100美元/条,并把关系写成攻击约10的-4次方、预过滤约10的-3次方、APR约100(美元/条)。后一数字与实测均值不一致。作者称在90%的情况下这笔APR费用花在了与攻击目标一致的补丁上。
    • 误报集为psf/requests的100个issue(#6000–#6100,排除1条已删除)。结构化输出下论文写4o-mini只有1个(#6063),GPT-4.1-mini另外标了#6075;作者认为这两条未必是真误报,未给出结构化GPT-4.1-mini的误报总数。纯文本下4o-mini为3(#6019、#6059、#6100,作者称均有效),GPT-4.1-mini为34。作者因此建议用结构化o4-mini做入口过滤,尽管其检出数低于纯文本。实验节的模型名是o4-mini,误报段写作4o-mini。

    其他消融与分析

    • 测试Fail作附加信号:作者称noise两种组合各多1条,CVE回退的ensemble多1、best多2,其他攻击无增益。
    • 本地Ollama重跑LlamaGuard3,结果与托管版相同,仍为0。
    • 作者写纯文本相对结构化,GPT-4.1-mini提高20%、o4-mini提高33%;这与合计10到12、18到24一致,与CI/CD行的下降并存。
    • 一名开发者和一名安全专家看过全部生成issue:作者称乍看合理、可执行,深查后大多数可由人拦住;Noise与Revert CVE不那么明显。论文未报告“大多数”的条数。
    • 作者称执行不可信测试本身可以成为攻击,若环境没有隔离好。本文CI继承GitHub Actions沙箱,成功标准是补丁带有相应逻辑,不是观察到外传已经发生。
  5. 有什么可以进一步探索的点?

    作者指出外推、标注与工具版本边界,并建议做对抗基准、APR对齐和来源追踪。

    作者指出的局限与后续方向

    • 人工标注有专家判断成分,细微漏洞可能被漏看。作者用双人独立评估、再讨论解决(第8节 Internal Validity)。
    • LLM非确定。作者称没把temperature设为0,因为偏离APR和防御的默认设置会损害construct validity(第8节)。
    • 实验是一部分开源项目和SWE-agent一个系统。作者称发现未必推广到专有软件或架构差别大的APR工具;若其他系统同样依赖未审查的自然语言输入、LLM补丁和主要以测试套件验证,且没有安全向加固,则预期会出现类似问题(第8节 External Validity)。
    • 成功定义是生成补丁、绕过检测和出现恶意行为。作者称这未必覆盖下游影响,例如利用可行性或用户侧伤害(第8节 Construct Validity)。
    • 结果依赖特定工具版本。作者举例GPT-4o、CodeQL和Copilot,并称提示词措辞与模型配置会影响可复现性(第8节 Tool Limitations)。实验正文使用的是GPT-4.1-mini、o4-mini和Claude Sonnet。
    • 后续工作写在第7.4节和结论:在合成时执行项目安全策略的APR alignment;与SWE-bench互补的标准化对抗基准;改善人在回路,包括补丁来源可视化和标出安全相关改动。结论称红队和对抗鲁棒性测试应成为部署时的常规做法。第7.1节称本次演示没有穷尽可能,恶意内容可以拆到多个阶段。

    实验覆盖范围

    • APR系统为SWE-agent v1.1.0(SW-ReX v1.2.2),合成模型为claude-sonnet-4-20250514。项目是SWE-bench中的django、flask、pip、requests、scikit-learn,均在隔离克隆上运行(第5节)。
    • 对抗报告51条、五类战术;模式先在Django上设计,再自动重跑到全部项目。Table 2只给汇总,论文未报告五项目的条数分布(第5节)。
    • 预修复侧跑了PromptGuard、PromptGuardV2、LlamaGuard v3/v4、Granite Guardian,以及GPT-4.1-mini和o4-mini的结构化与纯文本提示;工具为默认配置和默认temperature(第5节)。
    • 修复后侧是默认CodeQL Python规则集、GitHub Copilot和各项目完整测试套件。论文未报告各项目允许的失败测试阈值,也未报告重复次数(第5–6节)。
    • 达成与否由两名专家审阅。论文未报告标注一致性数值。误报检查用psf/requests的100个既有issue(第6节、第7.2节)。
  6. 总结一下论文的主要内容

    SWE-agent在51条对抗报告上46条产出攻击目标一致的补丁,现有过滤与复核未拦住多数样本。

    作者评估语言模型APR会不会被看起来像普通缺陷报告的输入带偏。

    • 问题:公开issue一旦接入自动修复,对手不必投毒模型。一份像开发者所写的报告,就可能让系统回退安全修复、写入不安全逻辑、在CI里留下泄密或远程调用,或者空转算力和评审。作者用STRIDE整理要保护的源码、CI/CD和运营资源。
    • 做法:攻击分噪声和漏洞注入,落到五种战术。需要项目上下文时,用局部敏感哈希和rapidfuzz从CVE修复等种子抽出并清洗diff,再由DevStral:24B写报告。受害端是SWE-agent v1.1.0加Claude Sonnet(claude-sonnet-4-20250514),项目是SWE-bench里五个Python仓库的隔离克隆。预修复侧比较专用护栏和两种mini模型的自定提示;修复后侧跑项目测试、CodeQL和Copilot。
    • 结果:51条都生成了补丁。第6.1节称46条(90.2%)与攻击目标一致,摘要写90%,结论写over 90%。测试无新增失败为35/51。纯文本o4-mini检出24/51,是预过滤里最高的;LlamaGuard系列和CodeQL为0。Copilot各级安全提示覆盖30/51,仍要人读评论。该预过滤加Copilot为35/51,全预过滤组合加Copilot为37/51。生成总成本0.0133美元,APR均值0.87±0.39美元/条;作者另写的APR量级100美元与这个均值不一致。
    • 作者的结论:生成对抗输入便宜,检测和缓解贵,而且容易出错。作者建议用结构化提示做低噪声入口过滤、默认隔离CI、把Copilot的低置信评论露给审查者,并保持人在回路;同时认为只看功能基准不够,APR部署应包含对抗评估。
阅读原文arxiv.org