提示注入
先说结论
提示注入是指攻击者通过用户输入、外部文档、网页、工具结果或历史上下文向模型植入与开发者目标冲突的指令,诱导模型泄露信息、绕过策略或执行未授权行为。
为什么我会单独记这一篇
LLM 最大的独特风险之一,是会把“文本中的指令”和“关于文本的内容”混在一起理解。于是:
- 用户输入可能篡改系统意图。
- 检索文档可能夹带恶意指令。
- 工具返回可能诱导后续越权行动。
这就是为什么提示注入不只是“越狱提示词”,而是整条 Agent 链路的输入攻击面。
核心机制
两类主要注入
- 直接注入:用户直接要求忽略系统指令、泄露 prompt、执行高危任务。
- 间接注入:恶意指令藏在网页、PDF、知识库、邮件、Issue、搜索结果里,经 RAG 或工具读取后进入上下文。
典型攻击目标
- 覆盖系统指令
- 窃取隐藏提示词或敏感上下文
- 操纵工具调用参数
- 诱导跨租户或跨会话数据泄漏
设计时真正要权衡什么
- 让模型自由理解上下文 vs 强区分 trusted instructions 与 untrusted data
- 广召回 RAG vs 上下文可信度:召回越广,注入面越大。
- 自动工具调用 vs 增加确认步骤
容易踩的坑
- 把检索文档、网页内容、工具返回直接拼进主提示,不做隔离。
- 把“忽略以上指令”当成普通越狱问题,却忽视间接注入。
- 只做字符串黑名单,没有做数据 / 指令边界隔离。
- 工具调用由模型自由构造参数,没有 schema 和白名单。
- 误以为系统 prompt 不可见就足够安全。
工程落地时我会怎么做
- 明确区分 trusted instructions 与 untrusted data。
- 外部内容统一放入带标签的数据区,不允许其修改策略层。
- 对工具调用做 schema 校验、参数白名单和权限检查。
- 对高风险工具启用人工确认或二次判定模型。
- 在 RAG 中增加来源可信度、域名白名单、文档清洗和内容分段。
- 对“泄露提示词”“忽略系统消息”“输出密钥”等模式做专门检测。
如果要对外讲,可以怎么概括
“提示注入不是大模型版的字符串黑名单问题,而是边界问题。根本矛盾在于模型会把文本里的命令和文本本身混淆。真正有效的防御不只是拦关键词,而是把可信指令和不可信数据分层、把工具调用强约束、把高风险动作加确认。”
最后记几条
- 提示注入分直接注入和间接注入。
- RAG 和工具返回都是高风险注入入口。
- 黑名单不能解决边界混淆问题。
- 工具调用必须做 schema 和权限治理。
- 高风险系统要默认假设外部文本不可信。
参考资料
- OWASP LLM Prompt Injection Prevention Cheat Sheet
- Anthropic mitigate prompt injection
- Microsoft prompt injection evaluators
- Google Secure AI Framework