AI 安全威胁全景:从模型层到系统层的攻击面
第 1 章:AI 安全威胁全景:从模型层到系统层的攻击面
1.1 一个根本性的范式转移:LLM 应用为何不是普通的 Web 服务
2023 年 3 月 20 日,OpenAI 紧急下线 ChatGPT 服务将近六小时。官方事后披露的事故原因是 Redis 客户端库中的一个未公开漏洞:用户的对话历史被错误地暴露给了其他活跃会话,约 1.2% 的付费用户看到他人聊天记录中的标题、摘要甚至整段对话。这是一起典型的"传统 Web 故障"——可观测、可复现、可通过补丁修复。然而同年 7 月,一份针对 Microsoft 365 Copilot 的研究报告披露了一个 0-click 漏洞:攻击者仅需向目标用户的邮箱发送一封含有特定构造指令的邮件,无需任何用户交互,即可让 Copilot 跨越企业租户边界,检索并外泄用户 OneDrive、Outlook 中的敏感文档。这两类事件相隔不到半年,前者我们可以交给 SRE 和 WAF 处理,后者却要求我们从根本上重新审视 LLM 应用的威胁模型。
根本差别究竟在哪里? 让我们回到软件安全的三个基本假设:
1. *输入*是有限字符集上的结构化数据,可以被严格校验; 2. *逻辑*由代码实现,可读、可审计、可版本化; 3. *输出*经过显式的序列化路径,可被白名单或过滤规则约束。
LLM 应用的代码则不同。它的输入是自然语言,是一个理论上无限、语义无界的字符串空间;它的"逻辑"被编码在一组不透明的、不可微解释的模型权重中,且推理行为存在概率性;它的输出同样是自然语言,可以驱动工具调用、生成代码、写入数据库,传统序列化层面的过滤几乎失效。换言之,LLM 应用将"代码路径"这个概念从开发者手中转移到了模型手中,而模型本身是用户可探查、可扰动的黑盒。
这一转移带来了三个直接的安全后果:
- **不可信输入面扩张**。在传统 Web 服务中,输入是表单字段、URL 参数、HTTP 头,可以通过 schema validation 与 sanitization 隔离。LLM 应用的输入是用户提示 *和* 系统提示 *和* 检索文档(RAG contexts)*和* 工具返回结果——其中后三者往往来自不可信的数据源(用户的邮件、客户上传的 PDF、抓取的网页),构成所谓**间接提示注入**(indirect prompt injection)的攻击面。攻击者不再需要直接面对你的应用,只要把一段对抗文本放在 LLM 可能读取的"任何地方"即可影响其行为。
- **逻辑面变成概率面**。传统应用的判定树可以被静态分析、模糊测试、形式化验证。LLM 的"判定"是一次前向推理,**不存在编译时类型检查,也没有运行时断言能完全捕捉其失配行为**。同一个提示,今天的安全回答,可能是明天的越狱指令;同一段输入,在上下文窗口被填满后可能产生完全不同的输出。
- **输出面成为新的渗漏通道**。LLM 的输出会被传给浏览器渲染、传给 RAG 索引、传给 API 网关、传给下游的自动化代理(agent)或代码执行环境。这意味着即使模型层的"理解"是安全的,**输出消费方的传统漏洞**(XSS、SSRF、命令注入、Markdown 渲染器 RCE)也会因为模型的"上下文污染"被新的攻击者可控利用。一句话:"LLM 把 RCE 的入口从 C++ 移到了自然语言里。"
要回答"为什么 LLM 应用是一个全新的攻击面",必须把上面三点落在一个结构化的解剖模型上,让威胁可以被枚举、被分类、最终被缓解。这就是本章的核心目的:为后续 14 章提供统一的解剖坐标系与威胁清单。
---
1.2 LLM 应用的四层解剖模型:Input / Model / Tool / Output
任何 LLM 应用——从最简单的 ChatGPT 套壳,到复杂的多代理(multi-agent)系统——都可以分解为四层结构。每层都有其对应的传统 Web 攻击面和 LLM 原生攻击面,二者的区别恰恰是工程师最常忽略的地方。
1.2.1 层一:输入层(Input Layer)
输入层是所有进入模型的字符串、token 流或多媒体信号的汇聚点。它包含三个互相影响的子通道:
- **Direct Prompt(直接提示)**:用户当前发送的对话消息,最显眼但也是攻击者最难放大的面,因为通常有速率限制与会话审计。
- **System Prompt(系统提示)**:开发者配置的身份、约束、上下文说明。在很多系统中,系统提示是**可被用户间接观测甚至诱导泄露**的(参见 OWASP LLM07)。
- **Indirect Context(间接上下文)**:RAG 检索回来的文档、工具最近一次的返回值、长期记忆、用户上传的文件、抓取的网页、邮件正文。这是**2024 年以来最大量的真实攻击入口**。
传统 Web 中,间接上下文通常对应"用户上传文件"或"第三方数据源"。但传统应用会对这些内容做结构化解析(PDF → 文本,但解析路径会被严格控制),而 LLM 应用直接把整段非结构化文本塞进上下文。攻击者只要把恶意指令藏在文档注释、隐藏 HTML 元素、PDF 元数据、白底白字文本里,就能跨越传统解析器的"安全岛",进入模型的推理上下文。
1.2.2 层二:模型层(Model Layer)
模型层包括基础模型本身(base model)、对齐后的指令模型(instruct / chat model)、以及可能存在的 LoRA / Prefix-tuning 等定制部分。其威胁面分为三类:
1. 对抗样本与提示工程(adversarial prompts):通过 token-level 扰动、角色扮演、思维链劫持,让模型绕过对齐。这部分在 OWASP LLM01 中统称 Prompt Injection。 2. 训练数据泄露:模型在记忆阶段可能复现训练语料中的敏感片段。早期研究表明,sequence-level 提示可以让 GPT-2 复现其训练数据中的姓名、邮箱、API key。这是 Information Disclosure 的传统对应物。 3. 后门与权重投毒:模型即代码。如果基础模型的权重从第三方拉取(Hugging Face、S3、ModelScope),或者 fine-tuning 阶段使用了不可信数据集,则攻击者可以在权重中植入触发器——一旦特定 token 序列出现,模型行为即被劫持(对应 OWASP LLM03 与 LLM04)。
1.2.3 层三:工具层(Tool Layer)
2024 年以后,"LLM 应用 ≈ Agent" 已经成为主流范式。所谓 Agent,指模型在一个 ReAct / Tool-Use 循环中根据自然语言推理结果调用外部函数。一个典型的工具集包含:搜索引擎、数据库查询、邮件发送、代码执行(Jupyter、e2b)、文件读写、API 网关(Bash、HTTP)、支付接口等。
工具层是 LLM 应用"权限"概念真正落地的位置。传统 Web 应用中,权限由代码路径显式控制;而在 Agent 中,权限由模型的"决策"间接控制。这是 OWASP LLM06 *Excessive Agency* 所警告的核心风险——当工具集过宽、参数校验过松、且缺乏确认回路时,攻击者可以利用提示注入让模型执行任意工具组合(参见 1.4.2 的 Copilot 案例)。
工具层的攻击面因此具有复合性:它既是 prompt injection 的下游放大器,又是传统 Web 漏洞(SSRF、SQLi、命令注入、IDOR)的入口。新的红队方法把这一层命名为 *Emergent Tool Abuse*:原本安全的若干工具被 prompt injection 串接成一个对人类开发者来说根本不在威胁模型中的攻击链。
1.2.4 层四:输出层(Output Layer)
输出层是模型生成的字符串、代码块、JSON、Markdown、HTML、SQL、Cypher 等。它们可能被前端直接渲染(→ XSS)、被 shell 执行(→ RCE)、被 RAG 重新索引(→ 持久化间接注入)、被另一个 LLM 消费(→ 跨模型污染)、甚至被 OCR/ASR 系统再次处理(→ 多模态漏洞传导)。
OWASP LLM05 *Improper Output Handling* 专门讨论这一问题:当消费者对模型输出信任度过高时,输出就成了漏洞的根因。值得注意的是,"输出处理"不只发生在写代码时——任何使用 `<sysmsg>` 风格的 Jinja 模板、任何把模型返回内容嵌入 SQL 的 ORM、任何把 Markdown 渲染为 HTML 的 UI 框架,都是潜在的输出处理缺陷。
```mermaid flowchart TD subgraph Traditional["传统 Web 攻击面"] T1[Input Validation: SQLi / XSS] T2[Logic: Source Code Review] T3[Output: Output Encoding] end
subgraph Native["LLM 原生攻击面"] N1[Direct + Indirect Prompt Injection] N2[Model Weights / Alignment Bypass] N3[Tool Misuse + Excessive Agency] N4[Improper Output Handling] end
I[Input Layer] --> T1 I --> N1 M[Model Layer] --> T2 M --> N2 Tool[Tool Layer] --> N3 Tool --> T1 Tool --> T2 O[Output Layer] --> T3 O --> N4 ```
> 图 1-1:LLM 应用四层解剖模型。左列为传统 Web 攻击面,右列为 LLM 原生攻击面。可以看到传统攻击面并未消失,而是被"夹"在 LLM 原生攻击面中间,构成了复合漏洞。
这张四层架构的总图是后续所有技术细节的索引坐标。读者可以将后续任意章节提到的漏洞定位到对应层上。
---
1.3 OWASP LLM Top 10 (2025) × MITRE ATLAS 威胁矩阵
OWASP LLM Top 10 自 2023 年首次发布以来,已经成为业内事实标准。2025 年的版本继续以风险类别(risk category)而非具体漏洞形式呈现,强调了威胁面在输入/模型/工具/输出/供应链之间的横向漂移。MITRE ATLAS(Adversarial Threat Landscape for AI Systems)则更细粒度,以"对抗战术-技术-程序"(TTP)描述真实攻击事件。下面给出关键对照。
1.3.1 LLM01 Prompt Injection
风险描述:攻击者通过直接输入或间接上下文覆盖模型指令,绕过安全约束或劫持下游行为。
MITRE ATLAS 对照:
- *AML.T0024 Exploit Public-Facing Application*:直接提示注入的常见大伞归类。
- *AML.T0028 LLM Prompt Injection*(2024 新增):MITRE 在 2024 年专门把提示注入单列,反映其在 18 个月内从"边缘话题"变成"主流 TTP"的事实。
- *AML.T0051 LLM Jailbreak*:与提示注入在技术上有重叠,但通常指绕过对齐而非内容劫持。
关键判断依据:提示注入之所以难以根除,是因为它根植于 LLM 的 instruction-following 能力本身——你无法在不削弱模型可用性的前提下彻底拒绝自然语言指令。本书第 3 章会展开讨论为什么"分隔符 + 黑名单"的防御会失败。
1.3.2 LLM02 Sensitive Information Disclosure
风险描述:模型在输出中泄漏训练数据、系统提示、其他用户数据或 RAG 检索结果中的敏感信息。
MITRE ATLAS 对照:
- *AML.T0025 Extract Model Training Data*:经典训练数据提取攻击。
- *AML.T0024*(再次出现):通过公共聊天界面诱导模型输出 PII。
1.3.3 LLM03 Supply Chain
风险描述:基础模型权重、Tokenizer、Embedding 模型、训练数据集、第三方插件、API 端点等供应链环节被投毒或替换。
MITRE ATLAS 对照:
- *AML.T0010 ML Supply Chain Compromise*:与 LLM03 直接对应,强调"模型即二进制"的供应链威胁。
- *AML.T0018 Backdoor ML Model*:典型实现路径是污染 Hugging Face 上的 LoRA adapter 或公开数据集。
1.3.4 LLM04 Data and Model Poisoning
风险描述:通过污染训练或微调阶段的数据,使模型学到特定触发器-行为的映射。
MITRE ATLAS 对照:AML.T0020 Poison Training Data。
1.3.5 LLM05 Improper Output Handling
风险描述:下游消费者对模型输出缺少验证与编码,导致 XSS、SSRF、命令注入、RCE 等。
对照:传统 CWE 类别。CWE-79(XSS)、CWE-78(OS 命令注入)等仍是这一层的根因分类。
1.3.6 LLM06 Excessive Agency
风险描述:模型被赋予了超过任务需要的工具权限、可写资源、不需要人类审批的敏感操作。
MITRE ATLAS 对照:虽然没有一一对应的 TTP,但与 *AML.T0040 LLM-Enabled Lateral Movement*(2024 拟新增)相关。这是 Agent 安全最重要的一类。
1.3.7 LLM07 System Prompt Leakage
风险描述:模型被诱导输出系统提示原文,暴露应用内部业务逻辑、API key 占位符、RBAC 配置。
关键点:系统提示一旦被完整泄露,攻击者可以绕开所有 prompt-level 防御,直接构造针对内部逻辑的指令。
1.3.8 LLM08 Vector and Embedding Weaknesses
风险描述:RAG/Embedding 流水线的索引越权访问、跨租户污染、Embedding 翻转攻击(embedding inversion)、向量库 SSRF。
MITRE ATLAS 对照:AML.T0044 Exploit Public-Facing Application 中专门细分了 RAG 检索的攻击子项。
1.3.9 LLM09 Misinformation
风险描述:模型产生事实上错误的输出,导致下游错误决策。这一项既覆盖幻觉(hallucination)也覆盖被诱导的错误输出。
1.3.10 LLM10 Unbounded Consumption
风险描述:缺乏成本控制(token 上限、API rate limit、上下文压缩),被攻击者滥用消耗推理预算。
MITRE ATLAS 对照:与 AML.T0029 Denial of ML Service 紧密相关。
对照矩阵(精简版):
| OWASP LLM Top 10 (2025) | MITRE ATLAS | 章节定位 | |---|---|---| | LLM01 Prompt Injection | AML.T0024 / T0028 / T0051 | 第 3 章 | | LLM02 Sensitive Info Disclosure | AML.T0025 | 第 4 章 | | LLM03 Supply Chain | AML.T0010 / T0018 | 第 5 章 | | LLM04 Data/Model Poisoning | AML.T0020 | 第 5 章 | | LLM05 Improper Output Handling | CWE-79/78 | 第 6 章 | | LLM06 Excessive Agency | AML.T0040 | 第 7 章 | | LLM07 System Prompt Leakage | AML.T0024 子类 | 第 8 章 | | LLM08 Vector & Embedding | AML.T0044 | 第 9 章 | | LLM09 Misinformation | AML.T0048 | 第 10 章 | | LLM10 Unbounded Consumption | AML.T0029 | 第 11 章 |
本书余下章节将严格遵循这张映射表。每一个 LLM Top 10 项都会有 1~2 个章节约 8,000 字深入展开,包括 PoC 代码、缓解方案、可观测性指标。
---
1.4 三大真实事件复盘:从"事故"到"利用"的距离
真实事件比抽象的 OWASP 分类更有说服力。我们挑选三个具有里程碑意义的公开披露事件,覆盖传统安全 + AI 原生两种来源,能够最直观地揭示为什么"用 WAF 守 LLM 应用"是不充分的。
1.4.1 ChatGPT Redis 客户端库漏洞:传统 Web 故障在 LLM 时代
时间:2023 年 3 月 20 日。 披露方:OpenAI。 影响范围:约 1.2% 的 ChatGPT Plus 活跃订阅用户,特定 9 小时窗口内。 根因:`redis-py` 客户端库在引入新连接后未正确清除请求缓存(BZPOPMIN 操作),导致一个用户的请求信息被传给另一个活跃请求。
攻击面分析:
- 触发路径完全在传统 Web 层面——客户端库错误、状态共享、序列化错配。这正是 1.2 节图中"传统 Web 攻击面"那一列。
- 然而**后果却是 LLM 时代独有的**:用户看到的不是"500 错误"或"对方的密码",而是对方与 ChatGPT 的*整段对话*——其中可能包含用户的银行卡号、求职信草稿、未发布的论文草稿。这是 PII 维度的