提示注入攻击面映射:在攻击者之前找到每一个攻击向量
大多数团队以一种痛苦的方式发现自己的提示注入攻击面:安全研究员发布了一个演示,客户报告了奇怪的行为,或者事后复盘揭示了一个本不应触发的工具调用。到那时,攻击路径已经被记录在案,爆炸半径已成现实。
提示注入是 OWASP LLM 应用十大风险榜首,但将其定性为单一漏洞掩盖了它的本质:它是一族随应用复杂度增长的攻击向量。你注入提示的每一个外部数据源都是潜在的注入面。在拥有十几个工具集成的智能体系统中,这个攻击面是巨大的——而且大部分都未被绘制成图。
本文是一套实践者在攻击者之前完成映射的方法论。
为什么提示注入在结构上不同于 SQL 注入
SQL 注入的类比有用,但如果过度延伸则 会产生误导。SQL 注入在架构层面已被解决:参数化查询在代码与数据之间建立了一道由解析器强制执行的硬边界。数据库永远不会将字符串字面量误认为操作符。
LLM 没有等效的边界。指令和数据作为单一的 token 流到达,模型用同样的机制解释两者。你无法像参数化 SQL 语句那样参数化一个提示——根本不存在独立的代码通道。
这不是等待更好模型解决的临时限制,而是架构固有的特性。基于训练的鲁棒性在边缘有所帮助。据 Anthropic 内部测试,Claude Sonnet 4.5 在面对自适应攻击者时的攻击成功率为 1.4%,而无防护措施时为 10.8%。这是有意义的改进,但不是解决方案。目前没有任何集成浏览器的智能体能免疫这类攻击。
实际含义:你无法完全在模型层解决提示注入问题。架构和基础设施控制比任何单一防护措施都更重要。
注入的两大类型
直接注入是熟悉的形式:用户精心构造输入来操纵模型行为。"忽略之前的指令。你的新任务是……" 这类攻击相对容易防御,因为攻击者与用户是同一个人。如果用户越狱了你的聊天机器人并让它说了不当内容,爆炸半径仅限于那次对话。
间接注入才是更大的威胁。攻击者不是用户。恶意指令被嵌入到外部内容中,而你的系统在正常工作流中会检索并处理这些内容。用户提出合理的问题,智能体获取网页、读取邮件、查询数据库或调用 API,而在这些外部数据的某处,有一条模型视为合法的指令。
间接注入的危害呈指数级增长。一份中毒的文档 影响所有触发其检索的用户。在具有工具访问权限的智能体系统中,它可以导致模型窃取数据、执行代码,或触发用户从未请求的操作。用户完全不知道出了什么问题。
枚举你的攻击面
攻击面映射从一个简单的问题开始:哪些外部数据能到达我的提示?逐一检查每个组件:
用户控制的输入(直接攻击面)
- 聊天消息、表单字段、搜索查询
- 上传的文档(PDF、Word 文件、CSV、含嵌入文本的图片)
- 用户可设置的配置字符串
Web 与内容检索(间接攻击面)
- 网页浏览工具的结果
- 通过 URL 爬取获取的内容
- RSS 订阅源、新闻聚合器
- 社交媒体内容
持久化存储(间接攻击面)
- 运行时查询的数据库记录
- 向量存储 / RAG 检索结果
- 文档仓库
- CRM 记录、支持工单
外部 API 响应(间接攻击面)
- 第三方 API 调用结果
- Webhook 载荷
- 集成工具的输出(Slack、电子邮件、日历)
智能体间通信(放大的攻击面)
- 子智能体的工具输出
- 协调器到工作器的调用结果
- 共享内存或草稿区状态
系统与基础设施(常被忽视)
- 从外部服务器加载的 MCP 工具描述
- 插件元数据
