智能体威胁模型

S1
深入解析 · 安全、对齐与智能体安全

智能体威胁模型:为何自主性会扩大攻击面。

聊天机器人回答一个问题就停下了。而智能体会读取、决策、调用工具并采取行动——通常处于循环中,且常常无人值守。你授予智能体的每一项能力,也是攻击者可以借用的能力。本文从第一性原理出发构建威胁模型,让后续的防御措施有具体的防护对象。

STEP 1

从"回答"到"行动":能力鸿沟

纯语言模型的安全属性是有限的,因为它唯一的输出是文本。被攻陷的提示词最坏也只能让它说出不当的话。但一旦你把模型包进带工具的智能体循环中,情况就彻底改变了。此时模型的文本会被解释为意图:一次函数调用、一条 shell 命令、一个 HTTP 请求、一次数据库写入。爆炸半径不再是"一句坏话"——而是"你的工具能做的任何事"。

智能体的三个特性造成了经典应用安全思维无法覆盖的鸿沟:

  • 不可信输入变成了控制流。在普通程序中,数据与代码是分离的。在智能体中,检索到的文档、工具输出和用户消息全都流入模型用来决定下一步动作的同一个上下文窗口。"智能体处理的数据"与"智能体遵循的指令"之间不存在架构边界。
  • 自主性移除了人工检查点。由人审查每一步是一种强大(虽然缓慢)的安全控制。多步自主循环之所以有价值,恰恰在于它移除了那个人——也就同时移除了那个控制。
  • 组合会放大信任。一个使用三个工具、两个检索源和一个下游 MCP 服务器的智能体,会继承它们之中最弱的信任假设。攻击面是叠加的,而不是取平均。

需要内化的一句话:智能体把其上下文中的所有文本都视为潜在权威,而攻击者只需把文本送入该上下文即可。下面的每一种向量都是做到这一点的途径。

STEP 2

文本进入智能体上下文的四种途径

梳理威胁,主要就是枚举每一个能把攻击者可影响的文本投放到模型会读取之处的通道。共有四个,且各自需要不同的防御。

1. 直接输入

用户即攻击者,输入对抗性文本。这是经典情形,但在生产事件中越来越少见——因为它要求攻击者本身就是用户,且现代模型能抵御粗糙的版本。

2. 检索内容(间接)

攻击者把文本植入智能体将要获取的内容中——网页、上传的文档、wiki 条目、工单。攻击者从不与智能体对话。他们只需影响智能体信任的一个来源。一旦涉及检索,这就是占主导地位的生产向量。

3. 工具与 API 结果

攻击者控制或影响智能体调用的某个工具——第三方 API 的字段、被抓取的页面、所连 MCP 服务器的响应。智能体通常把工具输出视为完全可信,因此 JSON 字段中的对抗性文本会被当作指令读取。

4. 持久化历史与记忆

一次成功的注入可以被写入智能体的记忆或会话日志,然后在之后某一轮触发——若存储共享,甚至可能是另一个用户的那一轮。届时它看起来像是智能体自己先前的推理。

┌──────────────────────────────────────────────────────────┐ │ ATTACKER-INFLUENCED TEXT → SHARED CONTEXT → ACTION │ │ │ │ direct input ─┐ │ │ retrieved doc ─┤ │ │ tool / API ─┼──► one context window ──► tool call │ │ memory/history ─┘ (no trust labels) │ └──────────────────────────────────────────────────────────┘
STEP 3

建模影响:攻击者到底想要什么

向量是"如何"。影响是"为何"。对智能体系统而言,现实目标可归为四类,一个有用的威胁模型会明确点名它们,以便你针对对你的部署真正重要的目标排序缓解措施。

  • 数据外泄。诱使智能体读取它能访问的敏感数据,并把数据导向攻击者控制之处——一封邮件、一个出站请求、一个被渲染的链接。
  • 未授权动作。利用智能体的工具去做攻击者无法直接做的事——发起退款、删除记录、提交拉取请求、以用户身份发送消息。
  • 经由混淆代理的权限提升。智能体拥有比攻击者更高的权限。攻击就在于让智能体替攻击者行使该权限。
  • 资源滥用与拒绝服务。让智能体陷入循环、耗尽其预算、毒化其记忆,或驱使它进行昂贵或破坏性的工具调用。

把这四个目标写在你智能体的实际工具清单旁。对每个工具问:"如果攻击者控制了这次调用的输入,他们能达成哪个目标?"单单这一项练习,就能产出比任何通用清单都更好的缓解待办列表。

STEP 4

为何更强的模型解决不了这个问题

人们很容易认为更强、对齐更好的模型能消除该问题。它会降低某些失败率,但并不改变结构性问题:模型没有可靠、防篡改的信号来告诉它上下文中哪一段是可信指令、哪一段是攻击者控制的数据。它们以同一个 token 流到达。要求模型"直接忽略被注入的指令",等于要求它仅凭判断去解决一个架构本身拒绝编码的问题。

这是后续一切的核心设计原则:安全控制必须存在于你的代码和架构中,而非寄望于模型的良好行为。模型只是若干防御层之一,且是最不可靠的那一层。请据此对待它。

问题
这不就是多绕几步的应用安全吗?为何要新的威胁模型?

它复用了应用安全的原则——最小权限、输入不可信、纵深防御——但基元不同。经典应用安全假定你能把代码与数据分离,并用某种语法校验输入。智能体刻意抹掉了代码/数据边界,并接受开放式自然语言。原则可迁移;而朴素技术(用正则消除注入、净化输入)大多不能。威胁模型的存在,就是为了在你上线前把这一鸿沟讲明白。

问题
如果我已经有一个智能体在生产中,该从哪里着手?

盘点四个输入通道和工具清单。多数团队防住了通道 1(直接输入)却忽视了 2–4,同时授予了远超任务所需的工具。缩小"智能体拥有的工具"与"该任务所需工具"之间的差距,通常是杠杆最高的第一步——它能同时收缩所有影响类别。