Prompt Injection 深度剖析:从攻击原理到企业级防御实践
LLM 安全防线上的裂缝
背景与动机
要说 2025 年最让安全工程师睡不着觉的新威胁,Prompt Injection 绝对排得上号。这玩意儿厉害的地方在于:它不靠缓冲区溢出、不靠 SQL 注入、也不靠任何传统的安全漏洞——它 exploit 的是 AI 系统最核心的设计缺陷:指令与数据的边界模糊。
这意味着什么?传统的安全模型里,数据就是数据,指令就是指令,你永远不应该让用户控制的内容摇身一变成为系统要执行的命令。但在 LLM 系统里,这个假设从根本上就不成立了——用户的输入本身就是指令的一部分。当一个系统把"数据"和"指令"放在同一个上下文中让模型处理,它实际上是把门钥匙和保险柜放在了同一个房间里。
本文尝试从攻击者视角出发,系统性地分析 Prompt Injection 的攻击面、利用路径和防御策略。目标是:不仅让你知道它是什么,更要让你知道怎么找、怎么防。
本文摘要
本文将从以下四个方面深入 Prompt Injection:
- 方面一:攻击原理——为什么 LLM 天然无法区分指令与数据
- 方面二:攻击面与利用路径——RAG、多模态、Agent 系统的 exploit 路径
- 方面三:真实攻击链分析——以 Booking.com 钓鱼活动为例
- 方面四:企业级防御体系——从输入过滤到治理框架的完整方案
一、核心原理:为什么 LLM 无法区分指令与数据
1.1 传统安全模型的失效
在传统软件安全中,我们有清晰的边界:
|
|
用户的输入永远被当作"数据"处理,经过层层验证和沙箱处理,永远不会直接变成可执行代码。SQL 注入为什么危险?因为攻击者通过精心构造的输入,强行把自己的 SQL 语句"插入"到数据库引擎要执行的指令流里——这是一种越权行为,模型本身有漏洞。
Prompt Injection 的本质逻辑几乎完全相同,只不过被越权的不是数据库引擎,而是 LLM 本身:
|
|
在 LLM 的世界里,“数据"和"指令"都是以 token 序列的形式存在的。对模型来说,它没有能力从语义上区分"这是系统给它的指令"还是"这是用户提供的、应该被当作数据处理的内容”。它只能看到一长串 token,然后根据这些 token 继续生成"最可能"的下一个 token。
这才是 Prompt Injection 最可怕的地方:这不是一个 bug,这是 LLM 的一个 feature 被攻击者恶意利用了。
1.2 指令优先级的争夺
LLM 生成输出的过程中,实际上是在进行一场"指令优先级"的争夺战。系统 Prompt 通常包含了最高优先级的行为约束,比如"你是客服助手,应该礼貌地回答用户问题"。但这个约束并非不可覆盖——它只是整个上下文序列中的一部分。
当攻击者在上下文中插入一条具有更高"感知权重"的指令时,模型会选择服从这条更强的指令。比如:
|
|
在这个例子里,“忽略之前的指令"是一个强有力的元指令(meta-instruction),它直接对模型的"服从机制"发起了挑战。如果系统没有在架构层面做隔离,模型大概率会选择服从这条"更强"的指令。
这就引出了一个核心问题:LLM 的对齐(Alignment)机制,本质上是在训练数据层面建立了"系统指令 > 用户指令"的隐含优先级,但这个优先级只在训练分布内有效。一旦通过 Prompt Injection 植入了训练分布之外的对抗性指令,模型的"服从本能"反而会成为攻击的帮凶。
1.3 信任边界的确立
理解 Prompt Injection 的另一个关键概念是信任边界(Trust Boundary)。在传统安全中,我们总是明确地划定一条边界:边界内是可信的,边界外是不可信的。在 LLM 系统中,信任边界变得极度模糊。
LLM 系统通常会从以下几个来源获取信息:
- 直接用户输入:最常见的攻击向量
- RAG 检索结果:从外部文档库中检索的相关内容
- 工具返回结果:API 调用、数据库查询的返回
- 多模态输入:图像、音频、视频
- 对话历史:之前的交互上下文
以上每一个来源,都可能成为攻击者植入恶意内容的通道。更重要的是,这些内容在被拼入 Prompt 之前,往往没有经过严格的安全验证。这就是为什么 OWASP 将"Prompt Injection"列为 LLM 应用的 Top 10 风险之首——它的攻击面实在太大了。
二、攻击面与利用路径
2.1 RAG 系统中的 Indirect Prompt Injection
在所有攻击面中,RAG(Retrieval-Augmented Generation)系统是最容易被忽略但 exploit 潜力最大的一个。企业部署 LLM 应用时,最常见的架构就是 RAG:先从企业文档库中检索相关信息,然后把检索结果和问题一起交给模型生成答案。
这个过程中,攻击者可能通过向文档库中植入恶意内容来实施攻击:
|
|
想象一下这样的场景:攻击者向一个企业内部的知识库提交了一份"产品白皮书”,其中包含了隐蔽的 Prompt Injection 指令。当员工向 AI 助手询问相关问题时,被污染的文档被检索出来,恶意指令也随之进入了模型的决策上下文。
关键问题在于:企业对外部文档的审核通常只关注内容准确性,而不会检查"这份文档里是否藏有针对 AI 的攻击指令"。这是一个认知盲区。
2.2 多模态攻击:藏在图片里的指令
多模态 Prompt Injection 是近年来最值得关注的新趋势。攻击者可以将恶意文本嵌入图像中,这些文本对人眼完全不可见,但对能"读取"图像的 AI 系统却是可见的。
常见的隐藏技术包括:
1. 颜色不可见文本:将文字颜色设置为与背景完全相同,人眼看不到,但 AI 图像分析时会读取出来
2. 零宽字符(Zero-Width Characters):Unicode 中存在多个零宽字符,如 U+200B(零宽空格)、U+200C(零宽非连接符)等,这些字符在文本渲染中完全不占空间,但可以被 AI 模型读取
3. 拼图碎片化:将恶意指令拆分成多个碎片,隐藏在图像的不同区域,当 AI 系统分析完整图像时,这些碎片被拼接在一起形成完整指令
当多模态 LLM(如 GPT-4V、Claude 3 等)处理这类图像时,这些隐藏的指令可能被模型解读并执行。由于这些文本完全不进入人类的视野,传统的安全审核手段完全无法发现它们。
2.3 Agent 系统中的工具调用链 exploit
在 AI Agent 系统中,Prompt Injection 的危害会被进一步放大。Agent 系统通常具备调用外部工具的能力——发送邮件、访问数据库、执行代码等。如果 Prompt Injection 攻击者能够在这个过程中注入恶意指令,后果将远超单纯的信息泄露:
|
|
如果 Agent 系统缺乏对工具调用的权限控制和审计机制,这条恶意指令可能直接被执行,导致命令执行级别的危害。这已经超出了传统 Prompt Injection 的范畴,进入了AI Agent 安全的新领域。
2.4 攻击面总结
| 攻击面 | 威胁等级 | 攻击难度 | 隐蔽程度 |
|---|---|---|---|
| 直接用户输入 | 高 | 低 | 低 |
| RAG 文档污染 | 极高 | 中 | 高 |
| 聊天历史 | 高 | 低 | 中 |
| 文件元数据 | 高 | 中 | 高 |
| 多模态输入(图像) | 高 | 高 | 极高 |
| 工具调用链 | 极高 | 高 | 低 |
三、真实攻击链分析:Chameleon’s Trap
3.1 事件概述
2025 年 9 月,安全公司 StrongestLayer 披露了一起大规模 Prompt Injection 钓鱼活动,攻击者伪装成 Booking.com 向大量企业发送钓鱼邮件。这起攻击之所以值得深入分析,不仅因为它成功地将 Prompt Injection 技术集成到了传统的网络钓鱼攻击链中,更因为它展示了 AI 安全威胁正在从"概念验证"走向"实战化"。
3.2 攻击链拆解
第一阶段:邮件投递
攻击者发送伪装成 Booking.com 发票的钓鱼邮件。邮件本身包含了常规的钓鱼内容(伪造的支付链接等),对人类来说,这些邮件已经足够可疑了。但攻击者的真正目标不是人类,而是企业部署的 AI 邮件安全扫描系统。
第二阶段:AI 欺骗
邮件在 HTML 中嵌入了隐藏的 <div> 标签,其中包含两方面的混淆内容:
- 无关的多语言评论:攻击者植入了大量无关的多语言文本(中文、阿拉伯语、土耳其语等),这些文本本身没有任何恶意内容,但会干扰 AI 系统的内容分析
- Prompt Injection 指令:隐藏在噪音文本中的真实指令,引导 AI 系统将邮件分类为"安全"
这种"噪音掩护"的策略非常巧妙——它利用了 AI 系统的注意力分散特性。当 AI 在大量无关文本中寻找恶意线索时,Prompt Injection 指令实际上在引导它做出错误的判断。
第三阶段:漏洞利用
当邮件被 AI 扫描系统判定为"安全"后,邮件中携带的 HTML 附件(CVE-2022-30190,“Follina"漏洞)得以进入目标系统。该附件通过 Microsoft Support Diagnostic Tool(MSDT)触发远程代码执行,下载第二阶段恶意文件 loader.hta。
第四阶段:持续控制
loader.hta 使用了与邮件相同的混淆和 Prompt Injection 技术,试图绕过终端安全检测,实现对目标系统的持久化控制。
3.3 攻击逻辑分析
这次攻击最值得注意的不是某个单点漏洞,而是一种攻击范式的转变:
|
|
攻击者开始意识到:只要能骗过 AI 安全系统,就能绕过企业安全防线。 这直接催生了一个新的攻击趋势——针对 AI 的网络攻击(AI-Targeting Cyber Attacks)。Chameleon’s Trap 为此提供了一个教科书级别的案例。
四、企业级防御体系
4.1 纵深防御:五道防线
防御 Prompt Injection 不存在银弹,需要建立纵深防御体系。以下是五道防线的具体实现策略:
第一道防线:输入过滤与验证
这是最重要的一道防线,核心原则是永远不要将不可信输入与系统指令混合处理。
|
|
第二道防线:模型层面的对抗性训练
模型本身也需要具备一定的"抵抗力”。对抗训练是一个有效方法:
- 在训练数据中混入对抗性 Prompt 示例,让模型学习识别和拒绝
- 训练模型识别"指令越权"模式,如"忽略之前的指令"系列
- 但要注意:对抗训练不是万能的,攻击者可以不断变换攻击手法
第三道防线:工具调用的最小权限控制
对于 Agent 系统,工具调用必须实施严格的权限控制:
|
|
第四道防线:持续监控与异常检测
|
|
第五道防线:红队测试与持续评估
防御 Prompt Injection 是一个持续的过程,需要定期进行红队测试:
- 定期渗透测试:模拟真实攻击者,测试系统对已知攻击向量的抵抗力
- 自动化攻击模拟:构建 Prompt Injection 攻击库,持续对系统进行测试
- 红队演练:雇佣安全专家模拟真实攻击场景,发现潜在的 exploit 点
- 漏洞赏金计划:鼓励白帽黑客发现并报告系统中的 Prompt Injection 漏洞
4.2 Prompt 安全治理框架
除了技术防御,组织还需要建立 Prompt 层面的治理框架:
| 治理要素 | 具体措施 | 责任方 |
|---|---|---|
| Prompt 版本控制 | 记录每个 Prompt 的变更历史、作者、审批人 | ML 工程团队 |
| 变更审批流程 | 高风险 Prompt 变更需安全团队签字 | 安全团队 |
| 注入测试 | 每个 Prompt 上线前必须通过标准化注入测试套件 | QA 团队 |
| 监控告警 | 实时监控 Prompt 相关的异常行为和事件 | 运维团队 |
| 应急响应 | 建立 Prompt 安全事件的响应 SOP | 安全运营 |
4.3 防御措施对照表
| 攻击类型 | 主要防御手段 | 防御层级 |
|---|---|---|
| 直接 Prompt Injection | 输入过滤、指令隔离 | 输入层 |
| 间接 Prompt Injection | RAG 内容审核、检索白名单 | 架构层 |
| 存储型注入 | 数据隔离、历史上下文过滤 | 数据层 |
| Prompt 泄露 | 权限最小化、日志脱敏 | 访问层 |
| 多模态注入 | 输入预处理、图像元数据剥离 | 输入层 |
| 工具调用越权 | RBAC、调用审计、最小权限 | 权限层 |
五、总结与延伸思考
核心要点回顾
- 根本原因:LLM 无法在语义层面区分"指令"和"数据",这是架构层面的缺陷,不是简单的 bug
- 攻击面广泛:从直接用户输入到 RAG 文档,从聊天历史到多模态内容,每个数据入口都可能成为攻击向量
- 实战化趋势:Chameleon’s Trap 活动证明 Prompt Injection 已经从理论变成了实战武器
- 纵深防御是关键:没有任何单一手段能完全防御 Prompt Injection,必须建立从输入过滤到治理框架的完整体系
延伸思考
Prompt Injection 给我们提了一个更深层的问题:我们对 AI 系统的安全假设是否还成立?
传统安全的基础是可预测性——我们知道代码会做什么,知道输入会被如何处理,知道边界在哪里。但 LLM 系统本质上是概率性的,它的输出具有不可预测性。这种不可预测性在给安全防御带来极大挑战的同时,也让我们不得不重新审视已有的安全模型。
未来的 AI 安全,或许需要一种全新的范式——不是在 LLM 周围修修补补,而是从架构设计上就把"指令"和"数据"彻底分离。这可能是解决问题的根本路径。
参考资料
- [1] OWASP Top 10 for LLM Applications - Prompt Injection
- [2] Wiz - Prompt Injection Attacks: Defending AI Systems
- [3] Wiz - State of AI in the Cloud 2025
- [4] SCWorld - Malicious email with prompt injection targets AI-based scanners
- [5] Wiz - GenAI Tenant Isolation
- [6] StrongestLayer - Chameleon’s Trap Campaign Analysis