提示注入攻击:原理、手法与防护
提示注入(Prompt Injection)是一类针对大语言模型(LLM)应用的攻击手法,攻击者通过构造输入,让模型偏离开发者原本设定的指令,转而执行攻击者意图。它在 OWASP 发布的 LLM 应用安全风险榜单中被列为 LLM01,是当下生成式 AI 应用的首要风险之一【已核验】。
定义与成因
提示注入的根本成因是「指令与数据未隔离」。在 LLM 应用中,系统提示(system prompt)承载开发者的控制指令,用户输入与检索到的外部内容则属于「数据」。但模型以自然语言统一处理这两者,无法从机制上严格区分「哪些是命令、哪些是内容」。一旦不可信数据被拼接到提示上下文中,模型就可能把它误当作指令执行。
这与传统的 SQL 注入有相似的结构:都是把「数据」与「控制语句」放在同一个通道里,且未做边界隔离。不同之处在于,自然语言边界远比 SQL 语法模糊,难以用简单转义消除风险。
直接注入与间接注入
按注入路径,提示注入可分为两类:
直接注入:攻击者直接与模型对话,在输入框中嵌入诱导性语句,试图覆盖系统设定。例如要求模型「忽略之前的所有规则」或冒充开发者身份下达指令。这类方式最直观,也最容易被前端过滤与提示约束拦截。
间接注入:攻击者把恶意指令藏在与模型交互的外部内容里,例如网页正文、检索文档、邮件、知识库条目或工具返回结果。当应用把这些内容喂给模型时,指令被自动触发。由于内容来源不在用户当前对话中,用户往往毫无察觉。间接注入危害更大,因为它让「读取一封邮件」「总结一个网页」这类看似无害的操作变成攻击入口。
两类手法并非互斥:间接注入常借助直接注入的句式,只是触发路径改由外部数据完成。
现实风险
提示注入在具备工具调用(function calling / tool use)能力的应用中尤其危险:
权限越界与工具滥用:若模型被允许发送邮件、执行代码或调用内部接口,注入指令可能诱导它执行敏感操作。
数据泄露:攻击者诱导模型把系统提示、其他用户数据或隐私内容输出到对话中,造成信息外泄。
信任链污染:在 RAG(检索增强生成)场景中,被污染的文档会持续影响后续回答,形成长期误导。
需要强调的是,本文定位为防御科普,不提供任何可运行的攻击 payload、完整利用脚本或绕过技巧,仅剖析原理与防护思路。
防御思路(多层)
没有单一手段能彻底消除提示注入,应叠加多层防护:
输入隔离与最小信任:尽量把不可信外部内容标注为「数据」并隔离在独立上下文,必要时使用结构化通道(如工具参数 schema)而非自由文本传递外部信息。
权限最小化:给模型与下游工具设定最小权限,默认关闭敏感操作;涉及发送、删除、支付等动作时加入人工确认。
输出校验:对模型产出的指令执行结果做边界校验与敏感内容检测,限制可访问的数据范围。
提示加固与异常监控:在系统提示中明确角色边界,监控异常指令模式与高频越权尝试,建立回滚与告警机制。
OWASP 建议在架构层面把「不可信内容」与「可执行指令」解耦,并对模型能力做沙箱化约束【已核验】。
小结
提示注入的核心是「指令与数据未隔离」,分为直接注入与间接注入两类,在工具调用场景下面临权限越界与数据泄露等现实风险。有效的防护不在于某条银弹规则,而在于输入隔离、权限最小化、输出校验与持续监控的多层组合。将 LLM 视为不可完全信任的执行者,按最小权限设计系统,是降低此类风险的关键。
参考与延伸阅读
- OWASP Top 10 for LLM Applications(LLM01: Prompt Injection)【已核验】
- OWASP AI Exchange:关于 AI 威胁与缓解的结构化参考资料【待核实】
- 相关实践讨论:将不可信内容隔离为结构化数据、对工具调用做权限与人工确认边界【待核实】