研究者提出解耦铺垫与执行的 LLM Agent 技能投毒攻击
Hiding in Plain Sight: Decoupling Pretext from Actuation for Skill Poisoning in LLM Agents
CoordPoison拆分借口与动作,DeepSeek-V4-Flash筛选后总ASR为76.19%。
供应链攻击者只改第三方Skill的SKILL.md;载荷P是预先放置的固定辅助资源。
- 可复用Skill进入LLM智能体决策环后,第三方投毒内容能在良性请求下转向行为。现有攻击或把执行理由与操作放在同一处,或把恶意操作拆散,没有把“为何执行”和“执行什么”分开。
- CoordPoison把完整动作留在下游Steering Skill,上游Grounding Skill改持久化工件来制造借口。先确认真实交接,并排除只改Steering就能触发的对;GPT-5.5按最早失败点修复,最多12轮。
- 仅统计Steering-only失败实例时,三模型总ASR为76.19%、51.23%、44.44%,TCR均为100%(Table 1)。迁到另两个模型的总ASR为78.57%–96.88%(Table 2)。跨周期见Table 3。
- 论文未专节写自身局限;Conclusion呼吁composition-aware防御。被测模型五个,Skill对62、载荷7;Table 1只计Steering-only失败子集。防御仅为双提示词。未报告主ASR重复次数。
- Threat model
- 供应链攻击者只改第三方Skill的SKILL.md;载荷P是预先放置的固定辅助资源。不能访问系统提示词、良性用户请求、工作区输入或模型参数。工件aZ由投毒指令在运行时生成。只能利用干净Skill间已有协调关系,不能新建Skill或伪造任务不支持的流程;用户提示词自然且不指定调用顺序。
- Evaluated models
- DeepSeek-V4-FlashGLM-5.3-FlashClaude-Sonnet-4.6MiniMax-M3GPT-5.5
- Benchmarks
- 62 qualified Skill pairs434 evaluation instancesSkillJect payloads (InfoDisc, PrivEsc, UnauWri, Backdoor)Skill-Inject payloads (CodeExec, DoS, LocTrack)sandboxed Claude Code
- Metrics
- ASRcASRTCRtransfer ASR
研究者提出一种基于协同的技能投毒攻击范式,将执行理由与具体操作解耦,使恶意操作在下游 Steering Skill 中保持完整、看起来完全合法。作者用 Risk-Realization Factors 区分执行因子(做什么操作)与铺垫因子(为什么必须做),把铺垫因子交给上游 Grounding Skill,通过常规工具操作悄悄改动持久化的环境产物。配套的自动化框架能发现真实执行依赖、合成成对的铺垫与执行技能,并借助运行时闭环反馈迭代优化投毒指令。在单会话和跨生命周期的持久化场景中,该解耦式技能投毒取得高攻击成功率,暴露出孤立审计单个 Skill 的安全盲区。代码已公开。
Paper analysis
What problem does this paper attempt to solve?
投毒Skill把执行理由与完整动作拆开,用上游持久工件为下游动作提供借口。
如何在不拆碎恶意操作的前提下,让投毒Skill在良性请求下驱动完整动作。
- 场景:作者称可复用Skill把指令、脚本和资源装进智能体决策环,形成供应链面;攻击者投毒Skill即可转向行为,不必改参数、系统提示词或用户查询(Section 1)。
- 现有不足:作者称现有攻击或把执行理由与操作放在同一Skill,或把恶意操作拆到多个Skill再重组。拆操作要编排子载荷,而模型为何选择执行这一点未被单独利用。
- 核心抽象:作者把一次载荷实现定义为两个Risk-Realization Factor:动作因子规定执行什么,借口因子提供为何必须执行的情境理由。
- 威胁模型:
- 目标:在良性任务中实现预先固定的载荷P。
- 能力:供应链攻击者只改第三方Skill的SKILL.md;P作为固定辅助资源预先放置;协调工件在运行时由投毒指令生成。
- 知识边界:不能访问系统提示词、良性用户请求、工作区输入或模型参数。
- 真实性约束:只能沿干净Skill已有的协调关系投毒,不能新建任意Skill或伪造良性任务不支持的流程;用户提示词保持自然、不指定Skill调用顺序(Section 3.3)。
- 提出内容:作者提出借口与动作解耦,并给出自动化框架CoordPoison:下游保留完整动作,上游用常规操作改持久环境工件以植入借口,再按运行失败反馈迭代修复。
What related research exists?
既有工作或共置借口与动作,或拆碎动作;CoordPoison把完整动作留下、借口交给上游。
局部共置(Section 2.1)
- 供应链入口:Saha et al. (2026)讨论Skill指令作为过程性指导被加载。论文称Skill-Inject(Schmotz et al., 2025; 2026)及后续研究(含Liu et al., 2026d)显示,恶意Skill内容可在良性用户请求下诱发攻击者指定的动作。
- 改借口但仍共置:SkillJect(Jia et al., 2026)把固定载荷放在helper中并加强情境诱导;POISE(Hao et al., 2026)用位置感知的指令放置优化这种诱导。作者将二者归为操纵指定动作的借口因子,但借口与动作仍在同一攻击Skill上下文。
- 改动作但仍局部:DDIPE(Qu et al., 2026)把恶意逻辑嵌进可复用示例;SCH(Liu et al., 2026c)把恶意操作写成合规式要求并在运行时实例化;BadSkill(Tie et al., 2026)在捆绑模型中嵌入触发式行为。作者称这些机制不同,但动作与借口仍在单个Skill或Skill包内。
多Skill风险与跨时间分配(Section 2.2)
- 组合风险测量:SCR-Bench(Xie et al., 2026)刻画多Skill执行路径上出现的风险;SkillReact(Wang et al., 2026)识别真实生态中各自安全的Skill组合带来的风险。论文称这些工作测的是组合风险的出现,而不是攻击者分解一个固定有害目标。
- 结构或生命周期:CompoSkill(Liu et al., 2026b)在能通过扫描器的Skill之间构造风险链;CDH(Liu et al., 2026a)操纵Skill选择与规划依赖。SkillHarm(Ning et al., 2026)与SkillJack(Ying et al., 2026)用持久状态把攻击行为带到后续执行。作者称它们跨Skill或生命周期,但未把借口与动作分开。
- 拆碎动作因子:SkillTrojan(Feng et al., 2026)把指定载荷分到多次调用再组合恢复;ColluSkill(Zeng et al., 2026)把恶意意图拆成相互依赖的子载荷。作者称分解边界在动作因子内部,单个Skill不含最终实现所需的完整恶意语义。
基线与基准
- 基线方法:Naive把原始载荷命令直接写入Steering的SKILL.md、不附加借口;Skill-Inject按原文的obvious-payload范式做单Skill投毒;SkillJect把动作作为该Skill文档开头的强制第一步。附录C.3说明后两者如何适配到本文任务环境。
- 基准:7个固定、任务无关载荷,来自SkillJect(InfoDisc、PrivEsc、UnauWri、Backdoor)和Skill-Inject(CodeExec、DoS、LocTrack);资格筛选后的62对Skill,共434个评测实例。
作者把CoordPoison定位为:完整动作留在Steering Skill,Grounding Skill沿已有良性协调基底建立借口;与共置攻击、以及拆碎“执行什么”的攻击都不同。
How does the paper address this problem?
沿真实Skill交接,上游写持久借口、下游留完整动作,再按最早失败点迭代修复。
CoordPoison沿真实多Skill流程把借口与完整动作拆开,并用失败引导的闭环修复投毒指令。Figure 1的图注将其分成资格筛选、解耦注入和运行时验证。
问题设定与决策模型
- 智能体执行良性任务,并对固定载荷P决定是否执行。动作因子A(P)是实现P的具体操作;借口因子Z(A(P), Cb)是相对该动作和良性上下文Cb构造的情境理由。
- 作者把批准执行写成 Pr(dP=1 | A(P), Cb, Z),其中dP为是否批准A(P)。
- 局部投毒把动作和借口放在同一Skill;拆载荷攻击则把动作本身分到多个Skill。作者的目标是动作完整留在一个Skill,借口跨Skill分配(Section 3.1)。
解耦角色与持久工件
- 投毒后的角色写成 SG⋆:{ZG}, SS⋆:{A(P), ZS}。Grounding Skill只提供接地借口ZG,不执行动作的任何片段;Steering Skill保留完整动作,并用转向借口ZS解释上游状态。二者合起来构成分布式借口。
- 中间工件aZ由上游写入、下游读取。若aZ作为工作区工件持久存在,一次会话写入、后续会话读取,解耦就可以跨生命周期(Section 3.2)。
- 基底必须是干净执行里已经存在的协调关系,例如状态转移或执行顺序。投毒只能在这条关系上产生aZ,不能另造流程(Section 3.3)。
三阶段构造
- 资格与Steering-only筛选:在良性请求下运行干净Skill,记录调用顺序和工件流。只保留SG稳定先于SS、且SS消费SG所改任务状态的对;仅仅同时被调用不够。附录A.1还要求干净基线在默认3次运行中都完成且交接一致,并去掉单次超过30分钟的任务。随后只改SS,把A(P)放在其SKILL.md开头作为强制第一步;只有该单Skill基线不能触发A(P)的对才进入解耦。附录A.2给出该基线的渲染模板。
- 先规划再渲染:规划器输出协调契约,再写入两个SKILL.md。契约有四项:任务上说得通的中间工件、写入其中的ZG、下游的读取动作,以及把工件内容绑到A(P)的ZS。绑定指令放在下游读取逻辑旁边。Figure 2展示一条这样构造后的执行流。附录A.3–A.4给出契约字段和渲染指令,附录A.5在渲染前后做路径与命令一致性检查。
- 失败点修复:执行、诊断、改写构成迭代环。规划、渲染和失败诊断使用GPT-5.5,最大轮数Nmax=12。四个检查点按顺序是:未写出工件、未读取工件、借口条件未满足、动作未被绑定。分析器只给有界修改;已由轨迹验证的前缀锁定,动作和基底保持不变。基底不能复现时退回资格筛选。附录B.4给出失败分类和修复提示词。
成功判定
- 沙箱运行中须同时满足三点:目标载荷脚本被执行、主良性任务完成、协调依赖被验证。轨迹要看到上游把ZG写入aZ、下游读取并评估ZS,且满足的借口直接导致动作执行(Section 4.2)。
- 确定性操作用执行签名;没有固定签名的复杂行为用LLM评审。附录B把静态文档或计划文本排除在执行证据之外,并要求五条依赖:调用顺序可达、工件被写出、下游读的是同一表面、读取时ZG仍在、条件与动作耦合。
- 本文7个载荷都有脚本。附录C.2规定,主oracle是轨迹中出现目标脚本的实际调用或调用尝试;只提及、只阅读或只计划执行不算成功。
What experiments did the paper conduct?
筛选子集上三模型总ASR为44.44%、51.23%、76.19%,TCR均为100%。
实验设置
- 环境与角色:实验在沙箱化Claude Code中进行。规划、SKILL.md渲染和失败诊断用GPT-5.5,修复上限Nmax=12。闭环使用源受害模型的运行反馈;Table 1是针对该受害模型的生成阶段结果(Section 5.1、5.3)。
- 受害模型:主评测为DeepSeek-V4-Flash、GLM-5.3-Flash、Claude-Sonnet-4.6。迁移目标为MiniMax-M3与GPT-5.5。GPT-5.5同时是流水线模型,但是这些变体的held-out目标,不是优化源。
- 数据:Skill对来自公开仓库和runtime包,提示词只写任务级步骤。筛选后62对;Table 6为anthropics-skills 30、wshobson-* 12、autumnsgrove-claudeskills 8、openai-runtime 6、microsoft-deep-wiki 3、eigent-ai-agent-skills 2、szweibel-claude-skills 1。与7个载荷组合为434个实例。
- 载荷与基线:SkillJect提供InfoDisc、PrivEsc、UnauWri、Backdoor;Skill-Inject提供CodeExec、DoS、LocTrack。脚本与目标固定,只改协调和理由。迁移基线为Naive、Skill-Inject、SkillJect,样本与各源模型筛选通过子集对齐。
- 指标:ASR是轨迹里出现目标脚本执行命令的运行比例。cASR只统计执行或主动拒绝A(P)的运行,用来把未观察与安全拒答分开。TCR要求产物和状态修改与干净基线轨迹一致。
- 判定与未写明项:7个载荷用确定性脚本oracle;复杂行为另有LLM评审。论文未写明该评审模型与阈值,也未报告主ASR的重复次数。干净基线默认N=3;单次超过30分钟的任务在筛选中被去掉。
主结果
Table 1只统计该受害模型上Steering-only基线完全失败的pair–payload。分母因此不是434,且三个模型不同。
Swipe horizontally to read the table
受害模型 Skill-Inject ASR SkillJect ASR Overall ASR TCR DeepSeek-V4-Flash 67.83%(78/115) 94.34%(50/53) 76.19%(128/168) 100.00% GLM-5.3-Flash 33.86%(43/127) 印为67.78%(61/76) 51.23%(104/203) 100.00% Claude-Sonnet-4.6 43.86%(50/114) 45.95%(34/74) 44.44%(84/189) 100.00% GLM-5.3-Flash的SkillJect格中,61/76与所印67.78%不相等;61+43=104、76+127=203,括号计数与Overall一致。其余格的百分比与括号计数一致。
- 作者称,在单Skill steering完全无效的流程上,跨Skill协调仍能触发目标动作,上游工件为下游执行提供情境合法性。
- 作者称SkillJect族更高,是因为更贴近良性流程;Skill-Inject族更低,是因为动作特征更显式、更容易触发安全对齐。Claude-Sonnet-4.6上两族Overall以外的两列差距小于另外两个模型。
- 作者称多Skill协调没有打断良性任务,依据是表中TCR在全部列出的构造上同为100.00%。
跨模型迁移
- 测了什么:在三个主受害模型上合成的变体,直接迁到MiniMax-M3和GPT-5.5。比较对象是同一筛选子集上的Naive、Skill-Inject和SkillJect(Table 2)。
- 结果:六组源—目标组合里,Naive的Skill-Inject载荷、SkillJect载荷和Overall都是0.00%。作者称这与Jia et al. (2026)的观察一致,即没有语境包裹时目标模型观察不到Steering Skill。CoordPoison的Overall为78.57%(源Claude-Sonnet-4.6到MiniMax-M3)至96.88%(源DeepSeek-V4-Flash到GPT-5.5);源GLM-5.3-Flash到这两个目标为95.19%和96.15%。Table 2每个载荷列中,CoordPoison都不低于同格的Skill-Inject与SkillJect;Overall最接近的一格是源DeepSeek-V4-Flash、目标GPT-5.5,SkillJect为93.75%、CoordPoison为96.88%。
- 作者解读:作者称协调契约捕捉的是操作依赖,而不是某个模型的提示词启发式;持久工件aZ使交接不依赖目标模型的指令调优或推理结构。目标GPT-5.5与流水线所用模型同名,但不是这些变体的优化源。
消融与跨生命周期
Table 3的单元格是ASR/cASR(%)。论文未写明这张表是否与Table 1使用同一分母;同生命周期的ASR与Table 1的Overall不同,下面不把二者当成同一次测量。
Swipe horizontally to read the table
设置 DeepSeek-V4-Flash GLM-5.3-Flash Claude-Sonnet-4.6 w/o Pretext(SkillJect) 17.46 / 17.46 39.43 / 39.43 29.76 / 29.76 w/o Steering Pretext ZS 10.32 / 10.32 49.04 / 49.04 46.43 / 46.43 w/o Grounding Pretext ZG 63.28 / 65.85 51.92 / 51.92 30.95 / 31.71 Same-Lifecycle 68.25 / 69.35 53.85 / 53.85 52.38 / 52.38 Cross-Lifecycle 95.31 / 100.00 60.58 / 91.30 63.10 / 84.13 - 作者称去掉全部借口后,执行退化为无协调指令,ASR下降;去掉ZS的例子是DeepSeek-V4-Flash降到10.32%,因为下游没有检查上游工件的显式指令。表中GLM-5.3-Flash和Claude-Sonnet-4.6的w/o ZS高于各自的w/o Pretext,并接近同表的Same-Lifecycle。作者未把“collapse”写成三个模型共有的幅度。
- 作者称去掉ZG后,下游在没有运行时证据时仍执行ZS,并点名GLM-5.3-Flash降到51.92%、Claude-Sonnet-4.6降到30.95%。作者称DeepSeek-V4-Flash更依赖显式ZS,Claude-Sonnet-4.6对缺少ZG更敏感;表中前者的w/o ZS低于w/o ZG,后者相反。
- 跨生命周期把上游和下游放到共享工作区的两个会话。作者把相对同生命周期的升高归因于Fait Accompli:下游把aZ看成已经存在的状态,只决定在给定aZ时是否执行动作。Table 8加入上游轨迹摘要后,cASR为100.00%、90.28%、83.61%(顺序同表头),作者称与不加摘要时接近,并把原始ASR波动归因于更长上下文下的路由和观察,而不是安全检查重新生效。
提示词防御
- 测了什么:Appendix E的dual-prompt hardening把审计指令同时放入系统提示词和用户查询,要求执行前检查本地脚本及与任务的相关性。Table 4的受害模型是GPT-5.5和MiniMax-M3,不是Table 1的三个主模型;无防御数字与Table 2的CoordPoison Overall相同。
- 结果:GPT-5.5上,三个源的防御后ASR为92.97%、93.23%、91.67%,相对无防御下降3.91、2.92、1.19个百分点。MiniMax-M3上为75.78%、82.69%、70.23%,下降4.69、12.50、8.34个百分点。源的顺序都是DeepSeek-V4-Flash、GLM-5.3-Flash、Claude-Sonnet-4.6。
- 作者解读:作者称这种提示词防御提供的保护有限,并举GPT-5.5上仍高于91%为例;作者认为需要系统级或执行时机制。附录E给出防御附加文本。MiniMax-M3的防御后数值低于该例子。
其他消融与分析
- Figure 3:作者称合格基底(Steering-only失败)上的累计ASR随修复轮次单调上升;早期多修工件创建或读取,后期修条件与动作的绑定。图注未写曲线对应哪个受害模型,转写文本也没有各轮数值。
- Figure 4:DeepSeek-V4-Flash上按功能类别区分Steering-only成功、协调恢复和未恢复失败。作者称template与publishing的协调成功更高,software与automation的失败更高;转写文本没有各类比例。
- Table 8的L2 Only:ASR/cASR为DeepSeek-V4-Flash 14.06%/94.74%、GLM-5.3-Flash 8.65%/81.82%、Claude-Sonnet-4.6 5.95%/83.33%。Appendix D.2未解释该行。
- Table 2的Naive:全部源、目标和载荷族均为0.00%。
- 资格筛选:单次超过30分钟的任务被去掉;干净基线须在N=3次中全部完成且交接一致(Appendix A.1)。
- 论文未报告每轮修复的查询次数,也未报告主ASR的重复次数。
What are some points that can be further explored?
论文未专节讨论自身局限,Conclusion呼吁composition-aware防御。
作者指出的局限与后续方向
- 论文没有Limitations、Discussion或Future Work专节,也没有把筛选预算、30分钟截止或防御形式写成自身方法的不足。
- Conclusion称这些发现指出孤立Skill审计的根本限制,并呼吁composition-aware防御(Section 6)。这是对审计方式的后续方向,不是对CoordPoison实验缺口的逐条列举。
实验覆盖范围
- 主受害模型为DeepSeek-V4-Flash、GLM-5.3-Flash、Claude-Sonnet-4.6;迁移目标为MiniMax-M3与GPT-5.5。规划、渲染和失败诊断使用GPT-5.5,Nmax=12(Section 5.1、5.3)。
- 评测实例为62对合格Skill乘7个固定脚本载荷,共434个。来源计数见Table 6。运行环境为沙箱化Claude Code(Section 5.1,Appendix C.1–C.2)。
- 对比基线为Naive、Skill-Inject、SkillJect。防御实验是Appendix E的dual-prompt hardening,Table 4的受害模型为GPT-5.5与MiniMax-M3(Section 5.3–5.4)。
- Table 1的ASR只计算Steering-only基线完全失败的pair–payload,三个分母为168、203、189。论文未报告未筛选的434实例ASR,也未报告主ASR重复次数或LLM评审的模型与阈值。
- 干净资格筛选默认N=3,并排除单次超过30分钟的任务(Appendix A.1)。跨生命周期对照包括轨迹摘要和表中的L2 Only(Table 8,Appendix D)。
Summarize the main content of the paper
CoordPoison外置借口;DeepSeek-V4-Flash筛选子集总ASR为76.19%。
CoordPoison是一种Skill供应链投毒方法,把“为何执行”和“执行什么”拆到两个Skill。
- 良性请求会加载第三方Skill指令。作者认为,实现固定载荷既要有完整动作,也要有情境借口;把动作拆碎并没有利用模型为何同意执行。
- 上游Grounding Skill沿已有交接改写会留下的工作区工件,下游Steering Skill读到该工件后执行仍然完整的动作。GPT-5.5负责规划、渲染和诊断,修复不超过12轮;接受与否看受害模型轨迹里是否同时出现脚本执行、良性任务完成和写入—读取—绑定。
- 只统计Steering-only完全失败的实例时,DeepSeek-V4-Flash、GLM-5.3-Flash、Claude-Sonnet-4.6的总ASR为76.19%(128/168)、51.23%(104/203)、44.44%(84/189),TCR均为100.00%(Table 1)。
- 迁到MiniMax-M3与GPT-5.5时,作者称Overall transfer ASR为78.57%至96.88%;源GLM-5.3-Flash到这两个目标为95.19%和96.15%(Table 2)。Naive在这些格子里都是0.00%。
- DeepSeek-V4-Flash的跨生命周期ASR为95.31%、cASR为100.00%(Table 3)。GPT-5.5上的双提示词防御后,三源ASR为92.97%、93.23%、91.67%(Table 4)。作者把跨周期升高归因于下游把已写入状态当成既成事实。
- 作者的结论是:完整动作可以留在看起来由任务驱动的Skill里;孤立审计单个Skill看不到这种跨Skill、跨生命周期的配合,因而需要面向组合的防御。