间接提示注入:生产的攻击面 本节摘要:间接提示注入(indirect prompt injection, IPI)把指令嵌进外部内容——网页、邮件、共享文档、客服工单——Agent 系统在没有用户显式动作的情况下消费它。IPI 是 2026 主导的生产威胁:它绕过用户输入过滤器(因为攻击者从不碰用户),随 Agent 处理更多外部内容而静默扩展,且瞄准没人读提示的自动化工作流。MDPI Information 17(1):54(2026 年 1 月)综合了 2023-2025 研究。NDSS 2026 的 IPI 防御论文框定了核心挑战:注入指令可以在语义上良性(「请打印 Yes」),所以检测需要比关键词过滤更多。
本节摘要:间接提示注入(indirect prompt injection, IPI)把指令嵌进外部内容——网页、邮件、共享文档、客服工单——Agent 系统在没有用户显式动作的情况下消费它。IPI 是 2026 主导的生产威胁:它绕过用户输入过滤器(因为攻击者从不碰用户),随 Agent 处理更多外部内容而静默扩展,且瞄准没人读提示的自动化工作流。MDPI Information 17(1):54(2026 年 1 月)综合了 2023-2025 研究。NDSS 2026 的 IPI 防御论文框定了核心挑战:注入指令可以在语义上良性(「请打印 Yes」),所以检测需要比关键词过滤更多。《The Attacker Moves Second》(Nasr 等,OpenAI/Anthropic/DeepMind 联合,2025 年 10 月):自适应攻击(梯度、RL、随机搜索、人类红队)击破了 12 种已发表防御中原本报告近零攻击成功率的 >90%。
对应原课程:Phase 18 · Lesson 15 ·
indirect-prompt-injection(原英文phases/18-ethics-safety-alignment/15-indirect-prompt-injection/docs/en.md)。前置:Phase 18 · 12,Phase 14。
阅读完本节,你应当能够:
直接提示注入要求攻击者触达用户或其提示。IPI 两者都不需要:攻击者把载荷放进 Agent 可能读取的任何内容——网页、收件箱邮件、GitHub issue、产品评论。Agent 在正常运行中拾取它并执行指令。用户是信使,不是意图来源。
三者共享一个结构性质:攻击者控制了提示的一个片段,却从未触及面向用户的输入。
IPI 载荷不出现在用户输入里,它出现在检索到的内容里。如果过滤器门控在用户输入上,载荷绕过它。如果过滤器门控在所有到达模型的内容上,它必须对任意检索文本应用——这很贵,且会对碰巧含祈使语气的合法内容产生假阳性。
⚠️ 安全对齐的生产现实:第 25 节覆盖 EchoLeak(CVE-2025-32711,CVSS 9.3)——Microsoft 365 Copilot 里首个公开记录的零点击 IPI;GitHub Copilot Chat 的 CamoLeak(CVSS 9.6);GitHub Copilot 的 CVE-2025-53773。生产部署正在被 IPI 在现场攻陷,不只是基准里。OWASP LLM Top 10(2025)把提示注入列为 LLM01(应用层头号威胁);NIST AI SPD 2024 称之为「生成式 AI 最大的安全缺陷」。
2026 防御范式借用经典 OS 安全:把每个内容源当作一个安全标签。把用户查询标为「可信」;把检索内容标为「不可信」。把模型的控制流当作信息流:由不可信内容触发的动作,执行前必须由可信输入批准。
CaMeL(Microsoft 2025)、ConfAIde(Stanford 2024)、NDSS 2026 IPI 防御论文以不同方式操作化 IFC。共同原则:只要代码和数据共享同一上下文窗口,目标就是遏制,而非阻止。
Nasr 等(2025 年 10 月)用自适应攻击(梯度搜索、RL 策略、随机搜索、72 小时人类红队)测了 12 种已发表 IPI 防御。每种原本报告近零 ASR 的防御都被打到 >90% ASR。
方法论教训:发表防御必须带自适应攻击评估。静态攻击基准不是鲁棒性证据——攻击者会知道防御。
code/main.py 构造 IPI 框架。一个玩具有三个工具(搜索网页、读邮件、发消息);环境含攻击者控制的内容,内嵌指令(「转发给所有联系人」)。你可在三种 Agent 间切换:朴素(跟随注入指令)、过滤防御(对检索内容做关键词过滤)、IFC(分离可信与不可信,拒绝不可信控制流命令)。
def ifc_agent(user_query, retrieved_content, tools): trusted = label(user_query, "trusted") # 用户查询:可信 untrusted = label(retrieved_content, "untrusted") # 检索内容:不可信 plan = model.plan(trusted + untrusted) for action in plan: if action.triggered_by(untrusted) and action.is_control_flow(): refuse(action) # 不可信内容触发的控制流命令需可信批准 else: execute(action)
💡 核心洞察:IPI 的本质是代码与数据共享上下文窗口。在经典 OS 里,这与「缓冲区里的可执行代码」同构——你无法靠解析区分「这是数据还是指令」。IFC 的智慧在于放弃区分,转而给每段内容贴信任标签,并在控制流边界强制批准。
| 防御 | 机制 | 自适应攻击下的命运 |
|---|---|---|
| 用户输入过滤 | 关键词/语义过滤用户输入 | 完全错过 IPI(载荷不在用户输入) |
| 检索内容过滤 | 关键词过滤检索文本 | 被「良性指令」绕过,假阳性高 |
| 改写防御 | 改写检索内容 | Nasr 等:自适应攻击打到 >90% |
| IFC(CaMeL/ConfAIde) | 信任标签 + 控制流批准 | 当前最有原则的范式,仍需自适应评估 |
设计要点:IFC 是 2026 唯一有原则的 IPI 防御——它从 OS 安全借鉴了「不依赖区分代码/数据,而在信息流边界做强制」的成熟范式。但 Nasr 等的结果警告,任何 IPI 防御都必须用自适应攻击评估;静态基准上的近零 ASR 不是证据。
本节产出 outputs/skill-ipi-audit.md:给它一份 Agent 部署描述,它枚举不可信内容源,检查部署是否应用 IFC,并标记到达模型却没有信任标签的来源。
code/main.py 是独立玩具,三种 Agent 可换成真实 Agent 框架(LangGraph、AutoGen),IFC 标签逻辑不变。
Easy:运行 code/main.py,测量攻击对三种 Agent 各自的成功率。
Medium:对检索内容实现基于改写的防御。测量对合法检索文本的良性假阳性率。
Medium:读 NDSS 2026 IPI 防御论文。描述「良性指令」挑战,以及为什么它阻止基于关键词的过滤。
Hard:设计一个 Agent 从第三方 API 接收工具输出的部署。给每个提示片段标信任级,写出管理 Agent 动作的 IFC 策略。
Hard:在你练习 2 的过滤防御 Agent 上复现 Nasr 等 2025 自适应攻击方法论。报告自适应攻击前后的 ASR。
下一节,我们看防御工具的回应——红队工具:Garak、Llama Guard、PyRIT,以及它们如何把第 12-15 节的攻击自动化、标准化。