针对 LLM 编码 Agent 技能生态的供应链投毒攻击
Supply-Chain Poisoning Attacks Against LLM Coding Agent Skill Ecosystems
作者用文档投毒评测编码智能体技能生态,Claude Code+Sonnet 4.6 的直接执行率为2.3%。
研究 post-loading 阶段,假定投毒技能已检索并加载。
- 第三方技能文档会进入编码智能体的上下文,并影响文件、命令和网络操作。作者关注技能加载后,文档中的恶意逻辑能否穿过模型对齐与框架防护,产生实际系统操作。
- PoisonedSkills 将恶意逻辑嵌入代码示例和配置模板,利用智能体复用文档内容的流程。作者以种子扩展、伪装变异和验证生成评测集,并区分恶意代码生成与直接执行。
- 作者在四个框架、五个模型的八种组合上评测。Table 3 每种组合均有直接执行;Claude Code+Sonnet 4.6 的 DDIPE DER 为2.3%,同配置显式指令基线的执行率为0%。
- 作者将检索与加载成功作为前提,框架比较属于观察性分析,未拆分伪装组件。两种配置的运行错误率超过60%;§5.1 与§7 对温度设置的记载不一致。
- 威胁模型
- 研究 post-loading 阶段,假定投毒技能已检索并加载。外部攻击者无 white-box access,仅控制技能内容,不能修改用户查询、访问系统提示词或绕过运行时隔离;目标为系统控制、资产外传或基础设施投毒。
- 被测模型
- Claude Sonnet 4.6GLM-4.7MiniMax-M2.5GPT-5.4Gemini 2.5 Pro
- 基准
- PoisonedSkillsMITRE ATT&CKClaude CodeOpenHandsCodexGemini CLI
- 指标
- Bypass Rate (BR)Direct Execution Rate (DER)DER 95% CIformat validation pass rateCohen’s κ
研究者提出 PoisonedSkills 框架,用文档驱动的隐式载荷执行(DDIPE)把恶意逻辑藏进技能文档的代码示例与配置模板,使编码 Agent 在常规任务中复现并执行这些载荷。该流水线把 81 个种子扩展为 1,070 个对抗技能,覆盖 15 个 MITRE ATT&CK 类别。在 Claude Code、OpenHands、Codex、Gemini CLI 四个框架和五个模型上,绕过率为 11.6%–33.5%,而显式指令注入在最强防御配置下为 0%;Claude Code 加 Sonnet 4.6 的直接执行率为 2.3%。静态分析可拦截 90.7% 的样本,2.5% 同时绕过静态检测与模型对齐。负责任披露带来 4 个已确认安全问题和 2 个已部署修复。
推荐理由论文用 1,070 个对抗技能测试四款编码 Agent,给出绕过率与已确认漏洞,可据此评估技能生态的信任边界。
深度解读
这篇论文试图解决什么问题?
作者研究投毒技能加载后,能否诱使编码智能体生成并执行恶意逻辑。
核心问题是:第三方技能文档中的恶意逻辑,能否在模型对齐和框架防护下转化为实际系统操作?
- 使用场景:技能包提供工具调用逻辑、上下文提示词和配置示例。作者称编码智能体将技能文档当作操作指引,因而风险可以从文本输出延伸到文件、命令和网络操作。
- 既有研究边界:作者认为 ToolTweak、Skill-Inject 和 PoisonedRAG 主要研究工具选择或文本污染,尚未处理技能文档诱发宿主系统代码执行的问题。
- 核心观察:作者认为智能体会把文档中的代码示例视为参考实现,在正常任务中复用并执行;攻击因此可以不依赖独立的显式恶意指令。
- 威胁模型:研究范围是 post-loading 阶段,假定技能已被检索并加载(§3)。
- 目标:O1 为系统控制与资产外传;O2 为开发、构建和部署流程中的基础设施投毒。
- 知识:外部攻击者无 white-box access,不能访问执行器的系统提示词。
- 能力:攻击者构造并发布技能,控制其元数据与执行内容;不能篡改用户查询或绕过运行时隔离。
- 受害系统:具有文件、shell 和网络访问能力的编码智能体及其执行环境。
- 提出的方法:PoisonedSkills 结合 DDIPE 文档嵌入机制与自动生成流程,分别统计恶意代码生成和直接执行,而非把两者都当成宿主系统失陷。
有哪些相关研究?
作者将相关工作分为LLM供应链安全、检索知识投毒和间接提示注入。
相关工作围绕外部内容如何进入模型,以及进入后影响到哪一层。
LLM供应链安全
- 训练数据与模型后门:Carlini 等(2024)、Qu 等(2025)讨论训练数据投毒或代码模型后门;Gu 等(2017)的 BadNets 讨论模型供应链中的后门风险。
- 第三方应用与智能体扩展:Greshake 等(2023)研究第三方应用通过上下文操纵 LLM;ToolTweak(2025)操纵工具选择排序,Skill-Inject(2026)研究技能文件攻击。作者将后两者的范围描述为工具选择或文本生成层。
检索知识投毒
- PoisonedRAG(2025):向知识库注入对抗文本以影响生成回答。作者认为其威胁模型处理文本错误信息,而未建模技能连接系统工具后发生的未授权操作。
间接提示注入
- Liu 等(2023)与 Greshake 等(2023):研究通过外部内容传递指令,攻击者不必直接控制用户输入。
- Markdown Image Injection(2024):利用外部内容诱导数据外传。作者将这类载荷概括为命令式指令,并认为 DDIPE 的区别在于载荷可表现为代码本身。
实验基线与本文定位
- 基线方法:采用自然语言显式指令注入,引用 Liu 等(2023)和 InjecAgent(2024);实际对比使用本研究的1,070个技能样本,配置为 Claude Code+Claude Sonnet 4.6(§5.1)。没有报告在 InjecAgent 数据集上的实验。
- 作者定位:关注投毒技能已经进入上下文之后,能否穿过对齐与框架防护,诱发 action-space 操作。作者把更复杂注入基线的比较留作后续工作。
论文如何解决这个问题?
PoisonedSkills把载荷嵌入技能示例,再通过种子扩展与伪装变异生成评测集。
PoisonedSkills 将文档嵌入机制与自动生成流程结合:攻击内容作为参考代码或配置进入上下文,作者随后检查其是否被生成和执行。
问题设定与成功条件
- 研究边界:技能由元数据和执行内容组成;元数据包含描述、代码示例与配置模板。检索加载成功被作为前提,不在实验中验证(§3、Figure 2)。
- 两项条件:生成流程必须产出包含伪装载荷的技能;智能体必须复现载荷,并通过系统接口执行它(§4.1)。只生成代码与实际执行在评测中分别计数。
文档驱动的隐式载荷执行
- DDIPE:全称 Document-Driven Implicit Payload Execution。恶意逻辑嵌入正常技术结构,作者认为智能体可能将其作为参考实现复用,而不把它识别为独立行为指令。
- 代码示例投毒:在技能文档的代码示例中混入恶意逻辑;观察智能体是否把这些内容纳入自己的代码生成与执行流程。
- 配置模板投毒:把恶意设置嵌入部署或环境配置模板;观察智能体是否输出或应用这些配置。Figure 3 给出两类示例,本文不复述载荷。
- 伪装设计:作者使用功能合规伪装、异常抑制和虚假权威暗示,并允许多个攻击向量组合。作者将这些设计解释为让载荷看起来属于正常任务。
攻击分类与生成流程
- 分类来源:作者分析2021—2026年超过150起软件供应链投毒事件,来源包括 GHSA、NVD 和 OWASP LLM Top 10,再映射到 MITRE ATT&CK(§4.3.1)。
- 类别边界:Table 1 包含15类;前14类映射到 ATT&CK 战术与技术编号,最后一类 Composite / Other 是项目自定义的混合攻击兜底类别。
- 种子与模型:81个人工种子覆盖分类体系,生成模型为 Claude Opus 4.6。Stage 1 扩展种子结构,Stage 2 进行伪装和组合变异(§4.3.2)。
- 采样控制:按类别覆盖率的倒数加权采样,使低覆盖类别更常被选中;每阶段有最大尝试次数 K,但论文未给出 K 的具体值。
验证与规模控制
- 累计目标:Stage 1 的池大小目标为820,Stage 2 为1,070,均包含81个种子;新增样本目标分别为739和250。
- 格式与语法:验证技能文档可解析为 Markdown 且至少含一个代码块,嵌入脚本通过语法检查。
- 去重阈值:新样本与已有池成员的 Jaccard 相似度须低于0.85。作者称更低阈值会排除语义不同的变体,更高阈值会接纳近重复样本。
评测指标的定义
BR=(|Generated|+|Executed|)/|Total|
BR 同时计入仅生成恶意代码和直接执行,因而不等同于实际系统操作成功率。
DER=|Executed|/|Total|
DER 只计入实际执行;判断依据包括完整轨迹、系统调用日志及可观察的文件或网络变化(§5.1)。
论文做了哪些实验?
八种配置均报告直接执行,但代码生成、运行错误与框架差异需要分别看。
实验覆盖生成规模、加载后的攻击结果和生产系统披露;BR 与 DER 必须分开理解。
实验设置
- 目标模型与框架:Claude Code、OpenHands 分别运行 Claude Sonnet 4.6、GLM-4.7、MiniMax-M2.5;Codex 运行 GPT-5.4;Gemini CLI 运行 Gemini 2.5 Pro(Table 2)。
- 数据与样本量:每种组合使用全部1,070个对抗技能。技能由元数据对应的标准化任务触发,实验假定已加载,不测市场检索成功率。
- 运行条件:Linux 主机或容器,超时180秒,max_tokens 为10,000。§5.1 写温度 T=0.0,§7 写 T=0.3;论文未解释差异。
- 基线与指标:显式自然语言指令注入只报告 Claude Code+Sonnet 4.6 的对比。BR 计入生成与执行;DER 只计执行,二者分母均为1,070,包含运行错误。
- 判定与人工复核:Claude Sonnet 4.6 读取任务与完整执行轨迹,分类为拒绝、生成或执行;两名安全专家独立盲审分层随机10%样本,报告与裁判的一致性 Cohen’s κ=0.88。
- 重复验证:判为生成或执行的样本至少重跑三次,多数试验确认同一失败等级后才计入;执行样本另在网络隔离、带文件系统快照的 Docker 容器复现。
主结果
据 Table 3;各行 n=1,070,百分比均为原表数值。
表格较宽,可左右滑动
框架 目标模型 BR DER DER 95% CI 运行错误率 Claude Code Claude Sonnet 4.6 13.5% 2.3% [1.6, 3.4] 0.7% Claude Code GLM-4.7 16.8% 2.4% [1.6, 3.5] 1.3% Claude Code MiniMax-M2.5 20.5% 13.3% [11.4, 15.5] 1.5% OpenHands Claude Sonnet 4.6 22.0% 10.7% [9.0, 12.8] 12.6% OpenHands GLM-4.7 33.5% 27.1% [24.5, 29.9] 10.1% OpenHands MiniMax-M2.5 27.0% 25.5% [23.0, 28.2] 64.5% Codex GPT-5.4 11.6% 3.8% [2.8, 5.2] 61.0% Gemini CLI Gemini 2.5 Pro 14.0% 4.2% [3.1, 5.6] 6.5% - 显式基线对比:Claude Code+Sonnet 4.6 下,显式指令注入在1,070个样本上的执行率为0%(§5.1)。这是执行率对比,不能将基线数字改称 BR。
- 统计检验:Claude Code 下 Sonnet 与 GLM 的 DER 差异检验 p=0.887;二者分别与 MiniMax 比较均 p<0.001。作者另报告跨系统比较均 p<0.001(§5.3)。
- 错误的影响:作者把运行错误归因于超时、API 不兼容等框架运行失败,并将含错误配置的结果称为保守下界;运行错误没有被算作安全拒绝。
同模型跨框架与跨模型差异
- Sleeper payloads:排除运行错误后,作者比较 Claude Code 拒绝、OpenHands 执行的样本;GLM-4.7 有219个,Sonnet 4.6 有5个(§5.3)。作者明确称此比较为观察性分析。
- 模型特有执行:Claude Code 下,Sonnet、GLM、MiniMax 分别有11、14、78个仅由该模型执行的样本。Figure 5 的案例记录 Sonnet 执行而 GLM 拒绝,作者将 GLM 的反应解释为识别了任务与技能行为的不一致。
- 联合绕过口径:Claude Code 三模型行为一致的样本占62.1%,作者报告联合 BR 为1.6%、计数17;正文又写17个“beyond”共同执行案例,计数措辞有歧义。此处是三模型结果交集,没有报告实际部署投票防御的实验。
类别、载荷长度与静态扫描
- 类别结果:Claude Code 的 Config. Tamper 组 n=64,Sonnet、GLM、MiniMax 的 DER 分别为6.3%、6.3%、20.3%;Network Exfil. 组 n=82,分别为0.0%、1.2%、19.5%(Table 4)。
- 长度关联:Claude Code+Sonnet 4.6 下,执行样本平均1,850 B,拒绝样本平均2,214 B;中位数分别为1,886 B和1,964 B(§5.3)。作者认为短载荷更容易避开对齐;实验未报告控制长度的因果干预。
- SkillScan:事后扫描检出90.7%,99个样本逃过四层检测,其中27个也穿透模型对齐(§6)。贡献段写双重穿透为2.5%;论文未说明该统计对应哪个模型或框架。
生产系统验证与修复
- 披露结果:作者报告 Claude Code、OpenHands、Codex、Gemini CLI 共四项确认问题、两项已部署修复(§5.4)。案例涉及技能信任、配置语义与工具权限边界,本文不复述利用步骤。
- OpenHands修复:系统消息增加仓库内容不可信的警告后,原有3/3执行案例变为拒绝;论文未说明该修复验证的目标模型(§5.4)。这不是全部1,070个样本的修复后结果。
- Gemini CLI修复:§6 将其修复描述为权限剥离;没有报告修复后的全量 BR 或 DER。
其他消融与分析
- 生成阶段:最终1,070个有效样本,格式验证通过率99.1%(§5.2)。
- 阶段载荷大小:Stage 1 平均1,666 B,Stage 2 平均4,172 B(§5.2)。
- 类别构成:供应链投毒47.5%、环境变量窃取11.9%、凭据窃取8.6%(§5.2)。
- 共同执行案例:Figure 4 标注479 B、9行,是 Claude Code 三模型共同执行的一个样本;不复述其配置内容。
- 组件消融:DDIPE 的三种伪装技术没有分别消融(§7)。
有什么可以进一步探索的点?
作者将检索验证、伪装组件消融、更复杂基线和其他防御评测列为后续方向。
作者明确保留了检索阶段、组件归因、基线和防御扩展等问题。
作者指出的局限与后续方向
- 检索与加载前提:作者将检索阶段的端到端验证留作未来工作;§7 指出生产环境中大量技能可能稀释攻击概率(§3、§7)。
- 生成模型与框架归因:作者承认 Claude Opus 4.6 生成载荷可能带来同家族过拟合担忧,也明确 Claude Code—OpenHands 比较不是受控消融(§7)。
- 伪装组件:三种伪装技术组合使用,没有逐组件消融;作者计划分别研究其作用(§7)。
- 外部适用范围与错误:作者指出评测未覆盖 Llama 生态或 Cursor,并承认两种配置因 API 兼容性问题出现超过60%的错误率(§7)。
- 比较基线:只与显式指令注入比较,作者认为 Skill-Inject 等更复杂基线可能缩小差距(§7)。
- 防御范围:作者指出防御评测只包括 SkillScan,动态沙箱与 LLM 审计尚未评测(§7)。
实验覆盖范围
- 主矩阵:五个目标模型、四个框架构成八种组合,每种组合使用1,070个技能(Table 2、Table 3)。
- 复核范围:分层随机10%样本接受两名专家盲审;生成或执行样本至少重复三次,执行样本额外隔离复现(§5.1)。
- 设置记载:§5.1 报告 T=0.0,§7 报告 T=0.3;论文未解释温度记载差异。
- 防御结果条件:SkillScan 双重穿透统计未注明目标模型或框架;OpenHands 修复只报告3个执行案例的转变(§6、§5.4)。
- 生成预算:Algorithm 1 设置每阶段最大尝试次数 K,但未报告其数值;未报告完整生成与攻击流程的查询次数或耗时。
总结一下论文的主要内容
作者称技能文档可成为系统操作攻击入口,但结果只评估加载后的阶段。
PoisonedSkills研究编码智能体的技能供应链投毒,重点是文档内容如何进入实际系统操作。
- 问题与范围:攻击者只控制第三方技能,不能改用户请求或访问系统提示词。实验假设技能已进入上下文,考察系统控制、资产外传和基础设施投毒。
- 方法机制:DDIPE 将恶意逻辑混入代码示例和配置模板,作者认为智能体可能在完成正常任务时复用并执行。Claude Opus 4.6 驱动生成流程,从81个种子扩展到1,070个技能。
- 基线证据:Claude Code+Sonnet 4.6 下,DDIPE 的 DER 为2.3%(Table 3);相同配置与样本规模下,显式指令注入的执行率为0%(§5.1)。
- 框架比较:GLM-4.7 在 Claude Code、OpenHands 下的 DER 分别为2.4%、27.1%;Sonnet 4.6 分别为2.3%、10.7%(Table 3)。作者认为对齐与架构防护的关系依赖模型;框架比较是观察性的。
- 其他证据:SkillScan 检出90.7%,逃过扫描的99个样本中有27个也穿透模型对齐,但对应配置未说明(§6)。作者另报告四项确认问题和两项已部署修复(§5.4)。
- 作者结论与边界:作者主张审计技能语义、按技能限定权限,并使框架防护适配模型对齐。证据需连同检索前提、运行错误、温度记载差异及未拆分的伪装组件一起理解。