跳转到主要内容

意图不是范围:为什么代理的访问控制不能从提示中推断

基于意图的访问控制很有前景,但前提是在运行前将意图编译成有界、可审计的能力集——而不是在调用时根据代理自身的描述进行评估。

带有堆叠网络设备和状态灯的服务器机架特写

提案及其吸引力

代理安全存在一个静态权限无法解决的范围界定问题。一次代理运行可能编排十几个工具——读取工单、查询数据库、起草消息、调用部署钩子——而它触及的资源集在运行开始时是未知的。为每个工作流的每个工具手写策略,在真实的编排场景中行不通。每次调用都进行人工审批在量级上会崩溃:少量运行可以审查,一个队列则不行。

基于意图的访问控制填补了这一空白。Sophos 将这一想法描述为一种阻止代理越权而不必手动枚举每个工具权限的方法:代理声明它试图做什么,控制平面据此授予访问权限。其吸引力是真实的。静态范围无法预见多工具编排,而调用时审批无法扩展。如果代理可以通过其声明的目标而非预先枚举的端点列表获得授权,策略编写将从每个工具一项的琐事缩减为每个工作流一条声明。

问题不在于方向,而在于决策发生的位置。

数据中心内亮起的服务器机架特写

循环性问题

如果代理声明其意图,那么代理既是授权的主体,也是其自身授权的作者。控制平面被要求信任它所监管的事物所产生的描述。这不是边界,而是一面镜子。

失效模式是具体的。代理读取一个工具输出——一个网页、一条工单评论、一份检索到的文档——其中包含一条重述意图的指令:任务现在需要将客户表导出到外部端点。如果授权是在调用时根据代理对自身行为的描述进行评估的,那么注入的文本就成了授予权限的依据。控制平面没有独立的拒绝依据,因为它关于任务的唯一证据就是代理对任务的叙述。描述和请求来自同一个被污染的上下文。

这与提示级护栏的结构性失败相同。存在于被监管事物内部的策略可以被任何到达同一上下文窗口的东西争论、转述或覆盖。将策略从系统提示移到“意图检查”并不会把它移到代理之外;它只是将其上移一层,并赋予一个听起来更权威的名称。注入面并未改变。

还有第二个更隐蔽的问题:可审计性。如果授权是在调用时根据自然语言描述计算出来的,那么记录在案的产物就是代理关于自身的一句话。当事件发生后审查运行时,那句话不是授权内容的证据——而是代理声称内容的证据。审查者无法重建边界,因为边界从未被固定。

一种可行的形态:先编译,再限定

当意图在运行开始之前被编译成有界的能力集,而不是在调用时进行评估时,基于意图的访问控制才变得可辩护。区别在于:策略是由代理的上下文解释的,而范围是在其外部固定的。

该机制包含四个部分。

将意图解析为计划。 在执行之前,将声明的意图解析为具体计划:命名的资源、命名的操作、命名的目的地。不是“访问 CRM”,而是计划所需的特定对象类型、特定动词、特定出口目标。解析是一个规划步骤,可以由一个与执行代理不共享上下文的独立组件完成。

签发限定于该计划的短期凭证。 计划成为凭证代理的输入,该代理铸造严格限定于那些资源和操作的令牌,其生命周期与运行匹配。执行代理从不持有宽泛的凭证;它持有的令牌在编译计划之外毫无用处。如果计划有误,爆炸半径是计划,而不是账户。

使编译后的范围成为可审查的产物。 编译后的范围是一个文档——资源、操作和出口的清单——由人工或独立的策略引擎在铸造凭证之前签署批准。这一步打破了循环性:签署方不是代理,也不读取代理的上下文。对于已知的计划形态可以自动化,对于新颖形态可以升级处理,但决策是针对清单做出的,而不是针对代理的叙述。

将运行中扩展视为新的授权事件。 当代理发现需要编译计划之外的资源时,这不是当前授权的延续。这是一个新请求:新的计划片段、新的清单、新的签署、新的凭证。代理可以请求;它不能扩展自己的范围。这条规则使得边界在注入下得以保持,因为注入的指令可以改变代理想要什么,但不能改变它持有什么。

控制流程草图:

意图 ──▶ 规划器 ──▶ 清单(资源、操作、出口)
                          │
                          ▼
                    策略签署 ──▶ 凭证代理 ──▶ 限定范围的令牌
                          │                                        │
                          ▼                                        ▼
                    审计记录                              执行代理
                                                                   │
                                          运行中需求 ────────────┘
                                                │
                                                ▼
                                     新清单、新签署

诚实的权衡:编译在每次运行的前端增加了延迟和编写工作量,并迫使意图能够表达为计划。一些真正开放式的任务无法清晰地解析为清单,这些任务要么被拒绝,要么在更宽泛的、明确签署的范围内运行。这是一种成本,而且是正确的成本——替代方案是一个仅存在于代理自我描述中的边界。

衡量什么

编译范围系统产生的遥测数据是调用时意图检查无法产生的。三项测量很重要。

  • 每次运行的授予能力与实际使用能力之比。 比较清单授权的范围与运行实际触及的范围。差距过大就是权限债务:计划过于宽泛、规划器在猜测,或者工作流已经漂移。跟踪每次运行和每个工作流的比率,并将扩大的差距视为收紧规划器的信号,而不是放宽策略。
  • 拒绝,连同触发它们的意图一起记录。 每次凭证代理拒绝请求——清单之外的资源、未列出的出口目标——记录产生该请求的意图和计划片段。拒绝不是噪音;它们是意图与范围不一致之处的地图。沉默的拒绝日志就是未被测试的策略。
  • 扩展事件。 统计每个工作流运行中的重新授权次数。高比率意味着规划器解析不足;在不同工作流中比率为零可能意味着扩展正在某个不该发生的地方被静默吸收。

边界必须在代理之外

基于意图的访问控制是正确方向,因为静态范围无法描述编排,而每次调用审批无法扩展。但其价值完全取决于意图在何处被评估。在调用时根据代理自身的描述进行评估,它就是被监管上下文内部的护栏——与提示级规则相同的失效模式,只是名称更具说服力。在运行前编译成有界、签署、可审计的能力集,它就成为真正的边界:代理可以改变主意,注入可以改变其指令,但两者都不能在没有新授权事件的情况下改变其持有的范围。

电子电路板组件的微距视图,显示微芯片和电路

设计规则说起来简单,坚持起来却很难:决定代理可以做什么的实体,不能是描述代理正在做什么的实体。编译意图,限定范围,签署清单,让每次扩展都成为新决策。其他一切不过是披着策略外衣的提示。

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

相关阅读

这能回答的问题

Why can't an agent's stated intent be trusted at call time?

Because the agent is both the subject and the author of its own authorisation. An injected tool output can restate the intent, and the control plane has no independent basis for refusal — the same failure mode as prompt-level guardrails, where the policy lives inside the thing being policed.

What does it mean to compile intent into a scope?

A separate planner resolves the declared intent into a concrete manifest of named resources, operations, and egress targets before the run starts. A credential broker then mints short-lived tokens bounded to exactly that manifest, and the manifest is signed off by a human or a separate policy engine.

How should mid-run scope expansion be handled?

As a new authorisation event, not a continuation. The agent can request a new plan fragment, but it cannot extend its own scope; the request goes through a fresh manifest and a fresh sign-off before new credentials are issued.

What should teams measure once scopes are compiled?

The ratio of granted to exercised capabilities per run (a wide gap is privilege debt), every refusal logged with the intent that triggered it, and the rate of mid-run expansion events per workflow.