与查询无关的注入:无论你问什么都能劫持编码智能体
2025 年底的一篇论文表明,藏在编码智能体工具描述中的载荷会在任意用户请求下触发——因为它针对的是不变的上下文,而非具体问题。2026 年 6 月的一项防御在语法树层面予以反击。
这是什么?
大多数间接提示注入研究会插入一条恶意指令,然后寄望于用户的任务恰好足够接近,从而触发它。QueryIPI(论文于 2025 年 10 月 27 日首次发布于 arXiv,2510.23675)颠覆了这一假设。它构造的载荷无论用户向编码智能体提出什么请求都会触发。作者称之为与查询无关(query-agnostic)的间接注入,并将其呈现为首个针对现实编码智能体的此类方法。
诀窍在于:不再瞄准提示中会变化的部分——用户请求,而是瞄准永不改变的部分——系统提示与工具描述。这些内容在每一轮都会被加载,因此锚定在此处的载荷会出现在每一个任务中,而不仅是攻击者猜中的那一个。
工作原理
编码智能体的上下文由三层组成:固定的系统提示、一组工具描述(越来越多通过 MCP 提供)以及可变的用户查询。QueryIPI 以工具描述作为注入通道。由于该描述在每次调用时都会被读入模型上下文,藏在其中的指令便与智能体的真实指令永久并列。
难点在于让单一描述可靠地压过任意用户意图。QueryIPI 通过基于提示的迭代搜索实现:反复精修恶意描述,衡量智能体是否在一系列不相关的任务上都遵循它,并保留能够泛化的变体。论文指出,这种搜索之所以可行,得益于一个常见弱点——编码智能体往往会泄露自身的内部提示,这使得原本盲目的黑盒搜索变成受约束的、近乎白盒的优化。此处不复现具体字符串:重点是机制,而非可复制粘贴的载荷。
结果是一个被投毒的工具:检查时看似正常,却会把智能体引向攻击者的动作——例如执行 shell 命令——无论用户要求的是重构函数、编写测试还是解释文件。
为什么重要
编码智能体几乎完美契合 Simon Willison 提出的致命三要素(lethal trifecta):它们能访问私有源码与密钥,会摄入不可信内容(依赖、工具输出、抓取的文件),并能通过 shell 与文件系统采取行动。与查询无关的注入消除了攻击者最大的不确定性来源。攻击者不再需要受害者以特定方式措辞——与被投毒智能体的任何一次交互都是机会。
它还把风险转移到了工具描述的供应链上。单个恶意或被攻陷的 MCP 服务器、一次工具”抽地毯”(rug pull),或一个被投毒的市场条目,就能携带一条对所有下游用户、所有任务都奏效的载荷。这与那种必须与特定查询对齐的一次性文档,是截然不同的威胁模型。
防御
本能反应——过滤用户消息——完全没有击中要害,因为载荷位于工具层,而非查询。防御者应当:
- 将工具描述视为不可信输入。 固定并审阅描述,在每次更新时做差异比对(diff)以捕捉抽地毯行为,并优先选择经签名或经证明的工具服务器,而非匿名的 MCP 端点。
- 实施架构隔离。 shell 与文件系统能力只应在响应来自可信通道、经验证的所有者指令时才可激活——绝不应由从外部来源获取的内容或描述触发。这正是把 Agents Rule of Two 落到实处:不可信输入与敏感能力不应在没有人工把关的情况下共享同一上下文。
- 减少提示泄露。 由于该攻击的搜索依赖智能体暴露自身的系统提示与工具模式,尽量减少此类泄露会抬高攻击者的成本。
- 加入代码上下文检测。 2026 年 6 月的防御方案 CodeSentinel(2606.19235,2026 年 6 月发布)正是针对这一攻击面。它将代码中的注入视作在具体语法树(CST)逐节点上的净化问题,结合静态结构、逐节点似然异常与 logits 层面的行为影响。作者称其在六个近期攻击族上优于此前的防御(CodeGarrison、DePA、KillBadCode)。
任何单一层次都不足够;持久的答案是让不可信的描述内容远离特权动作。
状态
| 项目 | 详情 |
|---|---|
| 攻击(QueryIPI) | arXiv 2510.23675,2025 年 10 月 27 日首次发布 |
| 注入通道 | 工具描述(不变上下文) |
| 关键前提 | 编码智能体的系统提示 / 工具模式泄露 |
| 防御(CodeSentinel) | arXiv 2606.19235,2026 年 6 月发布;按 CST 节点净化 |
| 受影响类别 | 具备工具/MCP 访问与 shell 能力的 LLM 编码智能体 |