跳到正文
原文
论文追踪· arXiv:2610.09264·本站收录· 原文发表

研究者提出 PackHallu:经规则文件提示注入对编码 Agent 发起包幻觉攻击

Package Hallucination Attacks on Coding Agents through Prompt Injection in Rule Files

论文速读

攻击

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

PackHallu优化规则文件提示,诱导换用攻击者指定包;同代理时BigCodeBench平均SASR 79.29%。

威胁模型无受害编程智能体(系统提示、骨干LLM、框架)、受害任务、用户提示和外部上下文的知识,持有良性规则文件。

问题
社区共享的编程规则文件会指导编程智能体生成代码,但攻击者可注入提示,使智能体把合法依赖换成其控制的包。作者称长规则文件会稀释手工注入,最终代码的反馈又稀疏,既有提示注入在此设定下效果较差。
方法
PackHallu在本地代理智能体上进化搜索注入规则文件的提示。轨迹级信号统计完整轨迹里恶意包名出现次数;自归因精炼让攻击LLM写出失败批评、策略和子代。默认20轮、每父代3个子代、保留5个、每次用10个代理任务打分。
实验与结果
同代理受害时BigCodeBench平均SASR 79.29%、DASR 67.68%。框架与LLM都不同时平均SASR 74.81%。RefactorBench为18.60%,ProtectAI-DeBERTa的FNR为100.00%。
局限与可以继续做的
作者把保护协作规则文件流水线的防御列为未来方向,没有单独的局限节。实验覆盖8个框架、13个骨干LLM、3个编程基准和10个Python包;主实验代理与受害相同。恶意包在本地镜像仓库,检测用200个规则文件。论文未报告τ和重复次数。
实验设置Qwen2.5-Coder-7B、Qwen3-Coder-30B 等 · BigCodeBench、DS-1000 等 · SASR、DASR 等
威胁模型
无受害编程智能体(系统提示、骨干LLM、框架)、受害任务、用户提示和外部上下文的知识,持有良性规则文件。可注入针对(p_v,p_m)的提示并上传规则文件,把恶意包发到PyPI。可用框架、LLM与任务分布不同于受害方的本地代理优化。目标:本应导入p_v时改导入攻击者控制的p_m,提示保持语义连贯。
被测模型
Qwen2.5-Coder-7BQwen3-Coder-30BDevstral-Small-2-24BGLM4.7-Flash-30BGemma4-31BNemotron-3-SuperHy3-PreviewQwen3-Instruct-235BLlama-4-MaverickDeepSeek-V4-FlashGPT-5.5GPT-5.3-CodexClaude Sonnet 4.6Composer 2.5AutoProtectAI-DeBERTaPromptGuardMistral-7BLlama-3.1-8B-Instruct
基准
BigCodeBenchDS-1000RefactorBench
指标
SASRDASRFNRFPR
AI 导读研究者提出包幻觉攻击,攻击者在社区共享的规则文件(如 .cursorrules)中注入恶意提示词,诱导编码 Agent 把合法依赖替换为攻击者控制的包。为生成有效注入提示词,作者提出 PackHallu 进化优化框架,利用轨迹级反馈和 LLM 引导的变异迭代改写注入内容。在多个基准、LLM 和 Agent 框架上的评测显示,PackHallu 取得较高攻击成功率,并在不同模型与 Agent 组合间具有较强迁移性。研究认为编码 Agent 易受此类攻击影响,自主编码系统需要更强的安全防护。

研究者提出包幻觉攻击,攻击者在社区共享的规则文件(如 .cursorrules)中注入恶意提示词,诱导编码 Agent 把合法依赖替换为攻击者控制的包。为生成有效注入提示词,作者提出 PackHallu 进化优化框架,利用轨迹级反馈和 LLM 引导的变异迭代改写注入内容。在多个基准、LLM 和 Agent 框架上的评测显示,PackHallu 取得较高攻击成功率,并在不同模型与 Agent 组合间具有较强迁移性。研究认为编码 Agent 易受此类攻击影响,自主编码系统需要更强的安全防护。

深度解读

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

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

    规则文件注入可让编程智能体把合法依赖换成攻击者指定的包。

    攻击者能否通过污染共享的编程规则文件,让编程智能体把合法依赖换成其指定并控制的包。

    • 场景:Claude Code、Cursor、Codex等编程智能体依赖AGENTS.md、CLAUDE.md或.cursorrules约束工具使用和代码生成。作者称用户常从开源平台和规则市场下载预配置规则,而这一协作生态的安全影响在很大程度上被忽略。
    • 与随机幻觉的差别:先前的package hallucination是智能体导入随机、并不存在的包。本文要诱导其导入攻击者选定并发布到包仓库的特定包;作者称代码执行后可能带来数据外泄或未授权改库等风险。
    • 既有注入的不足:作者将提示注入分为启发式和优化式,并称两类在本设定下效果都差得多:长规则文件稀释恶意提示,而最终代码提供的反馈又很稀疏。
    • 本文做法:作者定义package hallucination attack,并称经由规则文件诱导指定换包是此前未被探索的威胁;同时提出进化搜索框架PackHallu,在本地代理智能体上优化被注入的提示。
    • 威胁模型
      • 目标:有效与隐蔽。受害任务本应导入受害包p_v时改为导入攻击者控制的恶意包p_m;提示保持语义连贯。每条提示对应一个(p_v, p_m)。
      • 知识:不知道受害智能体的系统提示、骨干LLM和框架,也没有受害任务、用户提示和外部上下文。持有待注入的良性规则文件。
      • 能力:可上传恶意规则文件,并把p_m发到PyPI等公开仓库。可用本地代理智能体、代理任务和可选代理上下文优化提示;代理的框架、LLM和任务分布都可以不同。
      • 受害系统:加载该规则文件的用户编程智能体;生成代码执行时会安装并运行恶意包。
  2. 有哪些相关研究?

    作者将本文与非对抗包幻觉,以及启发式、白盒和黑盒提示注入区分开。

    论文第2节把相关工作分成代码生成、幻觉和提示注入,并在实验里改写了五类注入基线。

    • 代码生成与编程智能体
      • 骨干模型:论文提到GPT-5、Claude、Gemini可按自然语言生成代码,并称其在多种编程任务上表现强。
      • 智能体框架:Claude Code、Cursor等可访问文件系统、浏览网页、运行代码和安装包,而不只是生成文本。
    • 幻觉
      • 通用幻觉:论文综述LLM与VLM幻觉,并称其核心原因是统计模式匹配和下一token预测,而不是对外部事实的可核验理解。
      • 代码与包:CodeHalu(2025)定义八类代码幻觉;Spracklen等(2025)分析代码生成LLM的package hallucination。作者称这些工作看的是非对抗设定下的模型固有局限,幻觉非定向,影响的是代码效用;本文则有攻击者,对象是编程智能体,且包由攻击者指定。
    • 提示注入
      • 启发式:Combined Attack(Liu等,2024)依赖手工模板。论文另据重复提示可提高遵循度的研究,自建Repeat Attack。
      • 优化式:GCG(2023)与ObliInjection(2026)被论文归为white-box,靠最小化损失逼近目标响应;TAP(2024)在无法访问模型内部时,用LLM引导的变异和反馈做black-box搜索。
      • 论文指出的缺口:启发式静态指令易被长规则文件、复杂系统提示和工具说明稀释;white-box需要参数和梯度,作者称在真实部署中不现实;既有black-box优化不是为“成功往往只反映在最终代码”的稀疏反馈设计的。作者称实验也确认这些方法在本设定中效果有限。
    • 基线与基准:基线为Combined Attack、Repeat Attack、GCG、ObliInjection、TAP,目标都改成包替换;GCG与ObliInjection被给予白盒访问,假设强于其余方法。受害任务来自改编后的BigCodeBench、DS-1000和RefactorBench。

    作者称PackHallu专为编程规则文件设计,用轨迹级信号和自归因精炼处理上述稀疏反馈与上下文稀释。

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

    PackHallu用代理轨迹打分和自归因改写,进化搜索规则文件里的恶意提示。

    PackHallu不访问受害智能体,把嵌在良性规则文件中的恶意提示当作离散搜索对象,用本地代理智能体和代理任务迭代改写。

    问题设定

    • 输入:编程智能体A把复合输入X映到代码Y。X包含系统提示s、用户提示q、规则文件r和可选外部上下文C;独立写新代码时C可以没有。
    • 攻击:给定本应导入的受害包p_v和攻击者控制的恶意包p_m,攻击者只控制注入规则文件的提示p。注入记为r与p的拼接,得到恶意输入。
    • 目标:在代理任务分布T上最大化诱导换包的期望。J(p)=Eq∼ T[1[A(X̃(p;q))]]表示代理任务上生成代码把p_v换成p_m的期望比例。
    • 难点:按作者说法,p嵌在含s、q、良性规则段和可选上下文的长输入里,容易被稀释;每次评估都要跑完整多轮交互,反馈又稀疏。

    轨迹级信号

    • 代理智能体G:完整多轮开销大,因此用一次前向构造G:系统提示要求LLM扮演编程智能体,在单次前向中模拟多轮行为。
    • 打分点:不只看最终代码,而统计轨迹中恶意包名的全部出现。Rhl(ζ)=1[|Opm(ζ)|≥τ],τ≥1为次数阈值。附录Table 13未给出实验所用τ。
    • 与最终代码的关系:只检查终端代码是该信号的特例;推理痕迹或工具调用里出现包名也计为正向。搜索改为最大化该信号在T上的期望。

    自归因精炼

    • 同一骨干:攻击LLM M与G用同一骨干LLM。作者称这使归因在结构上指向自身:M分析G为何没发出p_m,相当于分析自己处于G角色时会如何响应。
    • 三步:M先写自然语言批评,再据此写修改策略,然后独立抽出N个子代提示。系统提示只提供少量示例策略作种子,并明确邀请M提出示例之外的策略。正文未列出这些示例条文。

    进化搜索

    • 初始化:种群从单一种子开始。种子明确两项目标:诱导使用p_m,并替换p_v的出现。Figure 5给出实验用种子,附录B给出优化后提示示例。
    • 循环:每轮每个父代产生N个子代;每个子代在抽自T的T个代理任务上对轨迹信号取平均作为分数,保留Top-K,共R轮。返回整个搜索历史中分数最高的提示。
    • 默认参数:附录Table 13为R=20、K=5、N=3、T=10,采样温度0.7。默认代理是OpenHands加Qwen3-Coder-30B。主实验中代理与受害智能体使用相同框架和骨干LLM。每个受害智能体只在numpy与numpy_hl上优化一条提示,其他包对通过替换包名复用。默认把提示注入规则文件开头。

    成功如何判定

    • 不用LLM裁判。SASR的分母是良性条件下正确导入p_v的受害任务,分子是其中改为导入p_m的任务,不要求代码能执行。
    • DASR的分母还要求良性条件下代码执行成功;分子要求导入p_m、执行成功并触发预定义行为。该行为是打印一条固定成功语句。两指标分母不同。
    • 仿真包:每个p_m与对应p_v接口兼容,命名为受害包名加后缀_hl,放在镜像PyPI的本地仓库,评测时不预装,由智能体按需用pip安装。
  4. 论文做了哪些实验?

    BigCodeBench同代理时SASR 79.29%、DASR 67.68%;检测器未同时压低FNR与FPR。

    实验设置

    • 框架:OpenHands、OpenCode、Aider、Pi Coding Agent、Cline、Kilo Code为开源,Claude Code、Cursor为专有。均关闭人工确认,规则文件按各框架官方命名与加载方式使用,每任务超时600秒(Table 19)。
    • 骨干LLM:Table 20共13个:Qwen2.5-Coder-7B、Qwen3-Coder-30B、Devstral-Small-2-24B、GLM4.7-Flash-30B、Gemma4-31B、Nemotron-3-Super、Hy3-Preview、Qwen3-Instruct-235B、Llama-4-Maverick、DeepSeek-V4-Flash、GPT-5.5、GPT-5.3-Codex、Claude Sonnet 4.6。主实验用前五个。Table 6另用Cursor的Auto与Composer 2.5。默认代理为OpenHands加Qwen3-Coder-30B。攻击LLM与代理智能体同一骨干。初始化消融用Claude Opus 4.7改写种子。
    • 任务:Table 1中BigCodeBench为从零生成,5个包、981个受害任务;DS-1000为从零生成,4个包,Table 1写772,Table 16四包为291、200、155、106;RefactorBench为多文件重构,5个包、43个任务。BigCodeBench按包把80%作受害任务、20%作代理任务,二者无重叠。共10个Python受害包。
    • 基线:Combined Attack、Repeat Attack、GCG、ObliInjection、TAP。GCG对每个包对在受害智能体上优化200轮,后缀初始化为20个占位token,目标改为导入恶意包的代码前缀。ObliInjection用OrderGCG,同样20个占位token;正文既写授予受害智能体白盒,又写迫使代理智能体生成目标串。TAP与PackHallu共用代理,分支因子4、宽度10、深度10。
    • 判定:SASR、DASR由导入检查和执行是否触发预定义行为决定,无LLM裁判。论文未报告各格分母大小,也未报告重复次数。
    • 检测集:200个规则文件,100个来自公开仓库的良性文件,100个在开头插入PackHallu提示。

    主结果

    下表为PackHallu在BigCodeBench、OpenHands上的SASR(%),据Table 2。五行都是代理与受害智能体的框架和骨干LLM相同,不是跨模型迁移。Table 4–6的其余骨干未列入。

    表格较宽,可左右滑动

    骨干LLMPandasNumpyMatplotlibScipySeaborn
    Qwen2.5-Coder-7B70.4963.1647.6240.9168.18
    Qwen3-Coder-30B98.7281.8296.8893.1897.50
    Devstral-Small-2-24B72.9744.4484.3470.5970.00
    GLM4.7-Flash-30B91.0171.2393.6277.5086.49
    Gemma4-31B97.7589.4792.7188.8992.86
    • 作者汇总:作者称跨包和受害智能体平均SASR 79.29%、DASR 67.68%,SASR超过80%的设置超过一半,DASR超过60%的设置为绝大多数。DASR低于对应汇总SASR,导入成功不等于可执行并触发行为。
    • 与基线:作者称基线大体无效,并称次优的Combined Attack平均仅14.99%/11.35%,相对它的提升为SASR 5.29倍、DASR 5.96倍。Table 2中TAP常高于这一平均数,例如Pandas、GLM4.7-Flash-30B的TAP SASR为87.64%。同表有DASR反例:该格TAP DASR 86.59%、PackHallu 73.17%;Numpy、同一LLM上TAP DASR 65.28%、PackHallu 59.72%。
    • 包差异:作者称各包SASR均高于70%,从Numpy的70.02%到Pandas的86.19%,且未做按包调参;Numpy与Scipy更难,各方法的最高DASR都在Seaborn。Figure 2把成功率对近30日PyPI下载量(2026-05-25,对数坐标)作拟合。作者称中位Pearson r为SASR −0.69、DASR −0.60;图例写出的r为正,如PackHallu的SASR r=0.50、DASR r=0.67,与正文符号不一致。作者认为一种可能的解释是流行包在预训练语料中更常见。

    跨框架与跨骨干迁移

    • 只换骨干:Table 4固定OpenHands,提示在Qwen3-Coder-30B上优化后直接用于其他骨干。作者称12个受害LLM中有8个在至少三个包上SASR超过90%;GPT-5.5在Pandas上SASR/DASR为97.92%/97.92%,DeepSeek-V4-Flash在Pandas与Matplotlib上SASR为100.00%。作者给出Qwen2.5-Coder-7B的区间为SASR 22.73%–50.00%、DASR 7.89%–26.47%。Numpy在多个受害LLM上更低,如GPT-5.3-Codex的SASR 19.51%。作者称框架固定时,骨干能力越强越易受攻击(Figure 3的SASR相关r=0.785,Figure 12的DASR相关r=0.896),并将其归因于更强模型更忠实执行规则文件。Capability是良性设定下可执行且满足要求的测试实例占比(0–100)。Table 4里Qwen3-Coder-30B的Numpy为24.68%/23.68%,与Table 2同模型同包的81.82%/68.42%不同;论文未解释。
    • 只换框架:Table 5固定Qwen3-Coder-30B,代理为OpenHands。作者称平均SASR 71.55%、DASR 62.99%;25格中88.0%的SASR高于50%,76.0%超过70%。低格包括OpenCode的Numpy 15.85%/16.05%、Kilo Code的Numpy 18.29%/14.63%。Figure 4中能力与SASR的r=−0.186,Figure 13中DASR的r=0.164。作者称框架层面没有与能力的正向关系,并把差异归因于系统提示以及s、q、r、C的组织方式。
    • 框架与LLM都不同:Table 6平均SASR 74.81%、DASR 65.38%。Cursor在Auto、Pandas上为98.00%/98.00%,Composer 2.5、Pandas上为95.65%/93.48%。Claude Code加Claude Sonnet 4.6最低,Numpy为31.03%/31.03%;作者称其SASR范围为31%到59%。

    任务分布、轨迹与检测

    • 数据集:Table 7的代理任务来自BigCodeBench。DS-1000平均SASR 53.33%、DASR 45.00%;RefactorBench为18.60%、16.28%。作者将下降归因于仓库级上下文使恶意提示占输入的比例变小。
    • Claude Code轨迹:Sonnet 4.6、BigCodeBench的numpy子集共87个受害任务,提示在CLAUDE.md开头。Table 14:S1引用注入内容并遵从22次(25.3%),S2无说明即使用2次(2.3%),S3识别为攻击仍遵从3次(3.4%),F1因怀疑拒绝16次(18.4%),F2先导入、运行失败后改回原包33次(37.9%),F3直接忽略11次(12.6%)。作者称S3里对攻击的察觉被规则文件的权威性盖过;F2的回退由导入失败触发,而不是先怀疑提示。
    • 检测:ProtectAI-DeBERTa用v2检查点的两类决策;PromptGuard v2在恶意概率至少0.5时判恶意;DataSentinel在由其公开的、从Mistral-7B微调的检测LLM未能复述密钥时判恶意;PromptArmor以GPT-5为裁判,用该文默认裁判提示;PIShield用Llama-3.1-8B-Instruct第13层最后token隐藏状态上的探针,分数至少0.5判恶意。Table 12的FNR/FPR为ProtectAI-DeBERTa 100.00%/3.00%,PromptGuard 46.00%/5.00%,DataSentinel 49.00%/16.00%,PromptArmor 20.00%/34.00%,PIShield 21.00%/11.00%。作者称没有检测器能在可用FPR下可靠识别该攻击;PromptArmor的高FPR是因为规则文件本身就是指令;PIShield仍漏掉超过五分之一,FPR对实际使用仍然过高。

    其他消融与分析

    • 注入位置(Table 8,OpenCode+DeepSeek-V4-Flash,BigCodeBench五包):作者称开头平均SASR 82.63%,中间74.03%,末尾77.29%。
    • 初始化(Table 9,表题未写明模型、框架、包和数据集):Default 97.50/97.50,四个变体为97.50/95.00、100.00/97.50、95.00/95.00、100.00/95.00;作者称均值±样本标准差为SASR 98.00±2.09%、DASR 96.00±1.37%。
    • 组件(Table 10,表题未写明模型与包):完整83.87/50.54;去掉轨迹级信号56.99/24.73,去掉自归因批评62.37/47.31,去掉策略提议63.44/46.24。
    • 超参(Table 11,表题未写明模型与包):T=1为21.50/10.75,K=1为43.01/21.51,R=10为75.27/38.71,默认R=20、K=5、N=3、T=10为83.87/50.54,R=30为84.95/49.46,N=5为86.02/53.76,T=20为87.10/55.91。
    • 注意力(Table 3,Seaborn、BigCodeBench、OpenHands、Qwen3-Coder-30B):PackHallu注意力占比0.68,SASR/DASR 97.50/97.50;五个基线为0.24、0.26、0.32、0.33、0.32。Table 18的一例OpenHands输入中,注入提示139 token,占13826 token的1.0%。
    • 优化过程:Figure 6纵轴为每轮子代平均分,横轴为轮次,四张子图对应四个本地骨干;正文未给出各轮分数。一次完整优化约24–30小时。
  5. 有什么可以进一步探索的点?

    作者将规则文件流水线的防御列为后续工作;论文没有单独的局限讨论。

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

    • 防御:第8节称,结果突出编程智能体生态中的安全缺口,保护协作规则文件流水线的防御机制是重要的未来方向。论文没有单独的Limitations节,也未把某一设置下的低成功率写成方法局限。

    实验覆盖范围

    • 智能体:受害方覆盖8个框架和Table 20的13个骨干LLM;Table 6另报告Cursor的Auto与Composer 2.5。主实验聚焦5个开源骨干,且代理与受害智能体使用相同框架和骨干LLM(第6.1节)。
    • 任务与包:受害任务来自BigCodeBench(Table 1:5包、981个任务)、DS-1000(4包;Table 1写772,Table 16各包为291、200、155、106)和RefactorBench(5包、43个任务)。共10个Python包;恶意包以_hl后缀放在本地PyPI镜像,评测时不预装。
    • 对照与判定:基线为Combined Attack、Repeat Attack、GCG、ObliInjection、TAP。成功由导入和执行判定。论文未报告各格SASR/DASR分母,也未报告重复次数。
    • 提示如何复用:每个受害智能体在numpy/numpy_hl上优化一条提示,再替换包名用于其他包对;默认注入位置是规则文件开头(第6.1节)。论文未报告轨迹信号阈值τ的取值。
    • 检测:第7节用200个规则文件评测ProtectAI-DeBERTa、PromptGuard、DataSentinel、PromptArmor和PIShield。PromptArmor的裁判是GPT-5,DataSentinel的检测LLM由Mistral-7B微调,PIShield用Llama-3.1-8B-Instruct第13层探针。
  6. 总结一下论文的主要内容

    PackHallu诱导规则文件换包;BigCodeBench同代理时平均SASR 79.29%。

    PackHallu研究一种针对编程智能体规则文件的提示注入:让智能体在本应使用合法依赖时,改导入攻击者指定并控制的包。

    • 问题:AGENTS.md、CLAUDE.md、.cursorrules等规则文件会被用户从共享渠道下载,并进入智能体输入。攻击者不掌握受害智能体、受害任务和外部上下文,但可污染规则文件并发布对应包。作者称长规则文件会稀释手工提示,最终代码的反馈又稀疏。
    • 方法:在本地代理上进化改写提示。分数来自完整轨迹中恶意包名的出现次数,而不只看最终代码;同一骨干的攻击LLM负责失败批评、策略和子代改写。主实验在numpy包对上优化一条提示,再替换包名,默认注入在规则文件开头。
    • 同代理结果:BigCodeBench、OpenHands、代理与受害智能体相同时,作者给出的平均SASR为79.29%、DASR为67.68%。作者称相对Combined Attack的14.99%/11.35%为5.29倍和5.96倍。Table 2中GLM4.7-Flash-30B的Pandas与Numpy两格,TAP的DASR高于PackHallu。
    • 迁移:只换框架时作者称平均SASR 71.55%;框架与LLM都换时为74.81%、DASR 65.38%,Cursor Auto在Pandas上SASR 98.00%。代理任务来自BigCodeBench时,DS-1000为53.33%/45.00%,RefactorBench为18.60%/16.28%。
    • 检测与作者结论:Table 12中ProtectAI-DeBERTa的FNR为100.00%、FPR为3.00%,PromptArmor的FNR为20.00%、FPR为34.00%。作者称现有检测器不能在可用误报下识别这类恶意规则文件,并把规则文件流水线的防御列为后续方向。
阅读原文arxiv.org