跳转到主要内容

Agent 凭证是策略问题,而非提示词问题

没有范围限定的权限,会让每一次提示词注入都变成权限提升。要设计能力授予,而不是指令文本。

明尼苏达州议会大厦华丽拱门与立柱的特写。

失败模式不在模型,而在环境凭证

当 agent 接入人类的 OAuth 会话时,它继承的不是人类的意图,而是人类的权限范围。一句写着“不要发送邮件”的系统提示词,对一个随机过程而言只是建议;它不是由授权服务器强制执行的约束。模型可以被对齐,提示词可以写得很谨慎,而 agent 仍然可以发出一个凭证在法律上有权发出的请求。

实际后果是,提示词注入与权限提升不再是两个独立的类别。一条被注入的指令不需要攻破模型,它只需要触达一个环境 token 已经授权的 tool call。模型变成了一个路由层,为在对话开始之前就已授予的权限做路由。

这就是为什么“不要发送邮件”不是访问控制原语。访问控制原语是 scope、audience、过期时间和资源约束。它们存在于 token 和 broker 之中,而不在指令文本里。提示词是一种没有执行点的策略表达。当它失效时,没有审计事件,没有拒绝,也没有吊销。

影响范围因凭证类别而异。一个泄露的 agent token,若 scope 狭窄且有效期短,只能在过期前读取有限的资源集合。一个泄露的用户会话,则可以以该人类的身份,对每一个信任该身份提供方的服务行事,包括密码重置、计费和数据导出。agent token 是一件有边界的工具;用户会话是一把万能钥匙。把两者混为一谈的系统,会在 agent 的每一轮交互中继承万能钥匙的影响范围。

权限预算作为一等产物

权限预算是对 agent 可以做什么的声明式描述,以运行时能够强制执行的单位来表达。它不是提示词,也不是角色描述。它是随 agent 一同发布的配置,与 agent 代码在同一仓库中版本化,并由审查 tool 绑定的人来审查。

一份有用的预算至少包含四个维度:

A focused lawyer in an office setting writing and reviewing legal documents, symbolizing expertise and professionalism.

  • 支出:对货币操作的每任务和每时间窗口上限,表达为 broker 拒绝超出的硬性限制。
  • 消息量:每时间窗口对外发送的消息、邀请或通知的上限,使被攻陷的 agent 无法把邮箱当作放大器。
  • 写操作:变更操作的次数和资源范围,与读操作分开。
  • 外部调用:目标地址的允许列表,并带每目标速率限制,使数据外泄必须依赖一个已被批准的目标。

预算必须把读权限与写权限、以及不可逆权限区分开。读取日历与删除事件不是同一类操作。发送草稿与发送消息不是同一回事。向频道发帖与转移资金不是同一回事。每一类都有各自的授予、各自的过期时间和各自的检查点策略。

一个具体机制:agent 进程从不持有长期密钥。任务开始时,它向 broker 出示自己的身份和请求的能力集合。broker 依据 agent 注册的预算校验该请求,签发一个恰好限定于这些能力和资源的短期 token,并返回。该 token 携带 audience、以分钟计的过期时间和预算标识符。每一次下游调用都出示该 token。broker 记录的是授予,而不仅仅是调用。

诚实的权衡是延迟和复杂度。broker 往返位于每个任务的关键路径上,而预算文件成为又一个可能与现实脱节的产物。为“简单”agent 跳过 broker 的团队,通常会在事故压力下、当这个简单 agent 已经长出邮箱和支付方式之后,重新引入环境凭证。

首次 tool call 之前的交战规则

注册是声明交战规则的正确时机。在注册时,agent 声明其允许的 tool、允许的目标以及所需的人类检查点。broker 存储该声明并在授予时强制执行。未声明的 tool 不可调用,无论模型输出什么。

人类检查点属于同一份声明。不可逆操作可以要求第二次授予,并附带人类审批者身份。审批是一份签名的产物,而不是一条聊天消息,因此可以在审查中重放。

中介层设计由此而来。三个属性至关重要:

  1. agent 从不持有原始密钥。它持有一个对授予的引用。
  2. broker 用该引用换取一个短期、限定范围的 token。这次交换就是执行点。
  3. 日志记录授予:谁请求的、针对哪个能力、针对哪个资源、在哪个预算下、由哪位审批者签署。

Explore the stunning architecture of the Hungarian Parliament Building in Budapest, a true landmark of Europe.

一条授予日志记录,是“agent 发送了一封邮件”与“agent 在预算 B 下为收件人 X 请求发送权限,broker 因声明允许而授予”之间的区别。后一种陈述是可审查的。前一种只是传闻。

这里存在真实成本:授予日志产生第二条事件流,必须被保留、索引,并与调用日志关联。这是更多的存储和更多的查询面。替代方案则是一场无法区分预算配置错误与成功注入的事故复盘。

吊销与做错时的运维成本

轮换延迟主导事故严重程度。如果吊销一个 agent 的权限需要数小时,那么事故窗口就是数小时,无论模型被多快修补。如果吊销是一次 broker 操作,使一个授予族及其派生 token 失效,窗口就缩短为 token 过期时间加上传播时间。

这使吊销成为一项设计约束,而不是 runbook 步骤。broker 必须支持:

  • 授予吊销:使特定授予及其签发的所有 token 失效。
  • 预算吊销:使某个预算标识符下的所有授予失效。
  • Agent 吊销:使某个 agent 身份的所有授予失效。
  • 密钥轮换:在不完全重新部署的情况下重新签发 broker 签名密钥。

吊销路径属于评估 harness,而不仅仅是生产 runbook。harness 可以断言:在一次吊销事件之后,一个先前有效的 token 会在有界的请求数内被拒绝,并且该拒绝会连同授予标识符一起被记录。这是一个可测试的属性。把它当作 runbook 条目,意味着它第一次被测试是在事故期间。

残余风险是社会工程,它不会因范围限定而消失。一个被限定范围的 agent 仍然可能被操纵,利用其合法权限做出违背用户利益的事:向已批准的收件人发送一条看似合理的消息,读取它被允许读取的文档并将其摘要发送到允许列表上由攻击者控制的目标。范围限定缩小了影响范围;它并不能消除内容级审查、收件人确认或速率异常检测的必要性。

设计结论狭窄而关键。设计单元是能力授予。提示词描述行为;授予约束行为。把授予当作配置、对其版本化、审查它并测试其吊销路径的系统,将能在注入尝试中存活,而这些尝试在其他情况下会变成权限提升事故。把提示词当作控制平面的系统,将继续发现凭证一直都是策略。

分享XLinkedIn永久链接6 分钟阅读

相关阅读

这能回答的问题

Why is a system prompt not enough to constrain an agent?

A system prompt has no enforcement point. The authorisation server enforces scopes, audiences, expiry, and resource constraints. If the credential permits an action, the model can reach it regardless of the instruction text.

What belongs in an authority budget?

Per-task and per-window limits on spend, message volume, write operations, and external call destinations, with read, write, and irreversible authority separated into distinct grants.

How should revocation be tested?

In the evaluation harness. Assert that after a grant, budget, or agent revocation, previously valid tokens are rejected within a bounded number of requests and the rejection is logged with the grant identifier.

What risk remains after scoping an agent?

Social engineering. A scoped agent can still be manipulated into using its legitimate authority against the user's interest, so content review, recipient confirmation, and rate anomaly detection remain necessary.