2024年5月25日

提示注入

提示注入是指攻击者通过用户输入、外部文档、网页、工具结果或历史上下文向模型植入与开发者目标冲突的指令,诱导模型泄露信息、绕过策略或执行未授权行为。

知识库大模型安全与护栏securityprompt-injection

提示注入

先说结论

提示注入是指攻击者通过用户输入、外部文档、网页、工具结果或历史上下文向模型植入与开发者目标冲突的指令,诱导模型泄露信息、绕过策略或执行未授权行为。

为什么我会单独记这一篇

LLM 最大的独特风险之一,是会把“文本中的指令”和“关于文本的内容”混在一起理解。于是:

  1. 用户输入可能篡改系统意图。
  2. 检索文档可能夹带恶意指令。
  3. 工具返回可能诱导后续越权行动。

这就是为什么提示注入不只是“越狱提示词”,而是整条 Agent 链路的输入攻击面。

核心机制

两类主要注入

  • 直接注入:用户直接要求忽略系统指令、泄露 prompt、执行高危任务。
  • 间接注入:恶意指令藏在网页、PDF、知识库、邮件、Issue、搜索结果里,经 RAG 或工具读取后进入上下文。

典型攻击目标

  • 覆盖系统指令
  • 窃取隐藏提示词或敏感上下文
  • 操纵工具调用参数
  • 诱导跨租户或跨会话数据泄漏

设计时真正要权衡什么

  • 让模型自由理解上下文 vs 强区分 trusted instructions 与 untrusted data
  • 广召回 RAG vs 上下文可信度:召回越广,注入面越大。
  • 自动工具调用 vs 增加确认步骤

容易踩的坑

  • 把检索文档、网页内容、工具返回直接拼进主提示,不做隔离。
  • 把“忽略以上指令”当成普通越狱问题,却忽视间接注入。
  • 只做字符串黑名单,没有做数据 / 指令边界隔离。
  • 工具调用由模型自由构造参数,没有 schema 和白名单。
  • 误以为系统 prompt 不可见就足够安全。

工程落地时我会怎么做

  • 明确区分 trusted instructions 与 untrusted data。
  • 外部内容统一放入带标签的数据区,不允许其修改策略层。
  • 对工具调用做 schema 校验、参数白名单和权限检查。
  • 对高风险工具启用人工确认或二次判定模型。
  • 在 RAG 中增加来源可信度、域名白名单、文档清洗和内容分段。
  • 对“泄露提示词”“忽略系统消息”“输出密钥”等模式做专门检测。

如果要对外讲,可以怎么概括

“提示注入不是大模型版的字符串黑名单问题,而是边界问题。根本矛盾在于模型会把文本里的命令和文本本身混淆。真正有效的防御不只是拦关键词,而是把可信指令和不可信数据分层、把工具调用强约束、把高风险动作加确认。”

最后记几条

  1. 提示注入分直接注入和间接注入。
  2. RAG 和工具返回都是高风险注入入口。
  3. 黑名单不能解决边界混淆问题。
  4. 工具调用必须做 schema 和权限治理。
  5. 高风险系统要默认假设外部文本不可信。

参考资料

延伸阅读