# 间接提示注入 —— 生产攻击面

> 间接提示注入（IPI）把指令嵌进外部内容里——一个网页、一封邮件、一份共享文档、一张工单——由一个智能体系统在没有显式用户动作的情况下消费掉。IPI 是 2026 年的主导生产威胁：它绕过用户输入过滤，因为攻击者从不碰用户；它随着智能体处理更多外部内容而无声地扩张；它瞄准的是没人在读提示的自动化工作流。MDPI Information 17(1):54（2026 年 1 月）综合了 2023-2025 的研究。NDSS 2026 的 IPI 防御论文框定了核心挑战：注入的指令在语义上可以是无害的（「请打印 Yes」），所以检测需要的不止是关键词过滤。「The Attacker Moves Second」（Nasr et al., OpenAI/Anthropic/DeepMind 联合, 2025 年 10 月）：自适应攻击（梯度、RL、随机搜索、人类红队）攻破了 12 个已发表防御中 >90% 的防御，而这些防御原本都报告了接近零的攻击成功率。

**类型：** Build
**语言：** Python（标准库，IPI 攻击 + 防御测试台）
**前置要求：** 阶段 18 · 12（PAIR）、阶段 14（智能体工程）
**预计时间：** ~75 分钟

## 学习目标

- 定义间接提示注入，并描述三种常见投递向量。
- 解释为什么用户输入过滤完全漏掉 IPI。
- 把「信息流控制」框架描述为 2026 年的防御范式。
- 说出 Nasr et al.（2025 年 10 月）关于自适应攻击对已发表 IPI 防御成功率的发现。

## 问题背景

直接提示注入要求攻击者够得着用户或他们的提示。IPI 两者都不要求：攻击者把载荷放进智能体可能会读的任何内容里——一个网页、收件箱里的一封邮件、一个 GitHub issue、一条产品评论。智能体在正常运行期捡起它并执行那些指令。用户是信使，不是意图本身。

## 核心概念

### 三种投递向量

- **检索增强生成（RAG）。** 攻击者发布一份文档；检索步骤抓取它；提示在用户问题之前把它拼接进去；模型执行攻击者的指令。
- **收件箱 / 文档工作流。** 攻击者给用户发一封邮件；智能体读邮件；提示包含邮件正文；模型遵循邮件里的指令。
- **工具输出。** 攻击者控制智能体使用的某个工具（比如一个返回攻击者控制结果的网页搜索）；工具输出含有指令；智能体的控制流跟着走。

三者共享一个结构性质：攻击者控制提示的一个片段，却不碰面向用户的输入。

### 为什么用户输入过滤漏掉它

一个 IPI 载荷不出现在用户的输入里。它出现在被检索的内容里。如果过滤把守在用户输入上，载荷就绕过它。如果过滤把守在到达模型的所有内容上，它就必须施加于任意被检索的文本——这既昂贵、又会对恰好含有祈使语气的合法内容产生假阳性。

### 面向 AI 的信息流控制（IFC）

2026 年的防御范式借自经典操作系统安全。把每个内容来源当作一个安全标签。把用户查询标为「可信」。把被检索内容标为「不可信」。把模型的控制流当作一条信息流：由不可信内容触发的动作，必须先经可信输入批准再执行。

CaMeL（Microsoft 2025）、ConfAIde（Stanford 2024）、以及 NDSS 2026 的 IPI 防御论文，以不同方式把 IFC 操作化。共同原则是：只要代码和数据共享同一个上下文窗口，目标就是「围控」而非「预防」。

### 攻击者后手

Nasr et al.（2025 年 10 月）用自适应攻击（梯度搜索、RL 策略、随机搜索、72 小时人类红队）测试了 12 个已发表的 IPI 防御。每一个原本报告接近零 ASR 的防御，都被攻破到 >90% ASR。

方法论上的教训：发布防御时必须连带自适应攻击评估。静态攻击基准不是鲁棒性的证据；攻击者总会摸清防御。

### 真实事件

第 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 和 NIST 的框定

OWASP LLM Top 10（2025）把提示注入（直接 + 间接）列为 LLM01，第一大应用层威胁。NIST AI SPD 2024 把间接提示注入称为「生成式 AI 最大的安全缺陷」。

### 这在阶段 18 里的位置

第 12-14 课是以模型为中心的越狱。第 15 课是主导 2026 年生产部署的、以系统为中心的攻击。第 16 课讲防御工具。第 25 课讲那个具体的 CVE 叙事。

## 实际使用

`code/main.py` 造了一个 IPI 测试台。一个玩具智能体有三个工具（搜网页、读邮件、发消息）。环境里含有攻击者控制的内容，其中嵌着一条指令（「把这个转发给所有联系人」）。你可以在三种智能体之间切换：朴素智能体（遵循注入指令）、过滤防御智能体（对被检索内容做关键词过滤）、IFC 智能体（把可信与不可信内容分开、并拒绝来自不可信内容的控制流命令）。

## 拿去用

本课产出 `outputs/skill-ipi-audit.md`。给定一段智能体部署描述，它列举不可信内容来源、检查该部署是否施加了 IFC，并标出那些不带信任标签就到达模型的来源。

## 练习

1. 运行 `code/main.py`。测量该攻击对三种智能体各自的成功率。

2. 对被检索内容实现一个基于改写的防御。测量它在合法被检索文本上的良性假阳性率。

3. 读 NDSS 2026 的 IPI 防御论文。描述「无害指令」挑战，以及为什么它让基于关键词的过滤失效。

4. 设计一个部署，让智能体从第三方 API 接收一个工具输出。给每个提示片段标上信任级别，并写出管辖智能体动作的 IFC 策略。

5. 在你练习 2 的过滤防御智能体上复现 Nasr et al. 2025 的自适应攻击方法论。报告自适应攻击前后的 ASR。

## 关键术语

| 术语 | 大家嘴上怎么说 | 它实际是什么 |
|------|-----------------|------------------------|
| IPI | 「间接提示注入」 | 经由「用户没写、智能体在正常运行期消费」的内容做的注入 |
| RAG 注入 | 「被投毒的检索」 | 攻击者发布检索步骤会抓取的内容；提示含有载荷 |
| 零点击 | 「无用户动作」 | 攻击在智能体运行期自动触发；用户什么也不做 |
| IFC | 「信息流控制」 | 基于标签的方法：来自不可信内容的动作需要可信批准 |
| 自适应攻击 | 「梯度 / RL 红队」 | 知道防御并针对它优化的攻击；诚实评估所必需 |
| 无害指令 | 「请打印 Yes」 | 语义上无害的 IPI 载荷；没有关键词过滤能捕捉到 |
| 范围越界 | 「跨信任外泄」 | 智能体访问一个信任上下文的数据、却把它输出到另一个 |

## 延伸阅读

- [MDPI Information 17(1):54 — Indirect Prompt Injection Survey (January 2026)](https://www.mdpi.com/2078-2489/17/1/54) —— 2023-2025 综合
- [Nasr et al. — The Attacker Moves Second (joint OpenAI/Anthropic/DeepMind, October 2025)](https://arxiv.org/abs/2510.18108) —— 自适应攻击评估
- [Greshake et al. — Not what you've signed up for (arXiv:2302.12173)](https://arxiv.org/abs/2302.12173) —— 最初的 IPI 论文
- [OWASP — LLM Top 10 (2025)](https://genai.owasp.org/llm-top-10/) —— 提示注入被列为 LLM01
