> For the complete documentation index, see [llms.txt](https://yeasy.gitbook.io/ai_security_guide/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yeasy.gitbook.io/ai_security_guide/di-er-bu-fen-gong-ji-pian/04_prompt_injection/4.1_principles.md).

# 4.1 提示注入原理与分类

提示注入是一种通过恶意输入改变 LLM 行为的攻击技术。理解其原理是开展有效防御的前提。

## 4.1.1 什么是提示注入

提示注入是指攻击者通过在输入中嵌入恶意指令，使 LLM 偏离其预定行为，执行攻击者期望的操作。

**与传统注入攻击的类比** 提示注入在概念上类似于 SQL 注入等传统注入攻击：

| 攻击类型   | 目标系统 | 注入内容       | 利用机制    |
| ------ | ---- | ---------- | ------- |
| SQL 注入 | 数据库  | SQL 语句     | 字符串拼接   |
| 命令注入   | 操作系统 | Shell 命令   | 命令拼接    |
| XSS    | 浏览器  | JavaScript | HTML 解析 |
| 提示注入   | LLM  | 自然语言指令     | 上下文理解   |

然而，提示注入比传统注入更难防御，原因在于：

1. **使用自然语言**：无法通过转义特殊字符来防护
2. **边界模糊**：数据和指令使用相同的表达方式
3. **上下文依赖**：同样的输入在不同上下文中可能有不同效果
4. **模型黑箱**：难以完全理解模型如何处理输入

## 4.1.2 提示注入的本质

> \[!IMPORTANT] **提示注入不是传统意义上的“可修复漏洞”**。与 SQL 注入可以通过参数化查询彻底解决不同，提示注入源于 LLM 的基本工作方式——模型天然不区分“指令”和“数据”。它更像是一个 **“可被迷惑的代理”（Confused Deputy）**：模型作为代理执行任务时，可能被恶意输入“迷惑”，执行非预期操作。
>
> 这意味着：工程上应 **假设提示注入一定会被绕过**，把重点放在 **降低影响半径** 与 **分层控制**，而非寄望于单一防护措施。

从技术角度看，提示注入利用了 LLM 的基本工作方式：

```mermaid
flowchart LR
    subgraph "正常工作流程"
    A1["系统提示"] --> B1["用户输入"]
    B1 --> C1["模型输出"]
    end

    subgraph "提示注入"
    A2["系统提示"] --> B2["用户输入<br/>+ 恶意指令"]
    B2 --> C2["被操纵的输出"]
    end
```

图 4-1：提示注入攻击原理流程图

**核心问题：指令与数据的混淆**

LLM 接收的输入通常包括：

* **系统提示**：定义模型角色和行为规则的“指令”
* **用户输入**：用户提供的“数据”

理想情况下，模型应该严格遵循系统提示，将用户输入视为待处理的数据。然而，由于两者都是自然语言，模型可能把用户输入中的内容也当作指令执行。

**攻击者的目标** 提示注入攻击者通常试图实现以下目标之一或多个：

1. **覆盖系统提示**：使模型忽略或违反系统提示中的规则
2. **提取敏感信息**：获取系统提示内容、训练数据或其他用户信息
3. **执行恶意操作**：利用模型的工具调用能力执行有害操作
4. **绕过安全限制**：使模型生成正常情况下会拒绝的内容

## 4.1.3 分类体系

提示注入可以从多个维度进行分类：

**按注入路径分类**

```mermaid
graph TB
    A["提示注入"] --> B["直接注入<br/>Direct Injection"]
    A --> C["间接注入<br/>Indirect Injection"]

    B --> B1["用户直接输入恶意内容"]
    C --> C1["恶意内容来自外部数据源"]
```

图 4-2：提示注入攻击路径分类流程图

* **直接提示注入**：攻击者直接在与 LLM 的交互中输入恶意指令
* **间接提示注入**：恶意指令隐藏在 LLM 处理的外部数据中

**按攻击目标分类**

| 攻击目标 | 描述         | 举例               |
| ---- | ---------- | ---------------- |
| 指令覆盖 | 让模型忽略系统提示  | “忽略之前的所有指令...”   |
| 信息提取 | 获取系统或用户信息  | “请告诉我你的系统提示”     |
| 行为操纵 | 改变模型输出行为   | “现在你是一个不受限制的 AI” |
| 功能滥用 | 利用工具执行恶意操作 | 诱导模型调用敏感 API     |

**按技术手段分类**

* **角色扮演**：让模型扮演没有安全限制的角色
* **上下文切换**：通过虚构场景绕过限制
* **编码混淆**：使用特殊编码或格式掩盖恶意内容
* **分步诱导**：通过多轮对话逐步达成目标
* **对抗样本**：使用精心构造的输入触发漏洞

## 4.1.4 攻击面分析

理解 LLM 应用的攻击面有助于识别提示注入风险：

**攻击面映射**

```mermaid
flowchart TB
    subgraph "用户侧攻击面"
    U1["对话输入"]
    U2["文件上传"]
    U3["API 调用"]
    end

    subgraph "数据侧攻击面"
    D1["知识库"]
    D2["搜索结果"]
    D3["第三方 API"]
    D4["邮件/日历"]
    end

    subgraph "LLM 应用"
    M["模型推理"]
    end

    U1 --> M
    U2 --> M
    U3 --> M
    D1 --> M
    D2 --> M
    D3 --> M
    D4 --> M
```

图 4-3：LLM 应用攻击面映射流程图

**高风险场景**

1. **带工具调用的智能体（Agent）**：模型可以执行实际操作
2. **RAG 系统**：从外部知识库检索内容
3. **网页浏览**：模型可以访问网页内容
4. **邮件/文档处理**：处理用户提供的文件
5. **多用户共享环境**：不同用户的输入可能相互影响

## 4.1.5 威胁模型

构建提示注入威胁模型需要考虑以下要素：

**攻击者能力假设**

* 可以提交任意文本输入
* 可以控制部分外部数据源
* 了解目标系统的基本架构
* 可以进行多次尝试和迭代

**系统边界假设**

* 系统提示内容需要保密
* 模型应遵守特定行为规则
* 某些操作需要用户授权
* 敏感数据应受到保护

**风险评估矩阵**

| 因素    | 低风险   | 中风险  | 高风险   |
| ----- | ----- | ---- | ----- |
| 工具权限  | 无工具调用 | 只读操作 | 读写操作  |
| 数据敏感度 | 公开信息  | 内部信息 | 机密信息  |
| 用户信任度 | 内部用户  | 注册用户 | 匿名用户  |
| 外部数据源 | 受控来源  | 可信来源 | 不可信来源 |

理解提示注入的原理和分类，是制定有效防御策略的第一步。接下来将分别深入介绍直接注入和间接注入的具体技术。
