AI智能体授权的两个被混淆的问题:访问控制vs实体绑定

在AI智能体(AI Agents)快速落地的当下,"授权(Authorization)"成了一个高频出现却又语义模糊的词。近日一位开发者在Reddit上提出了一个值得深思的观点:我们口中的"AI智能体授权",其实混淆了两个本质完全不同的问题。这篇文章将梳理这一区分,并探讨它对实际系统设计的意义。

被压缩成一个词的两个授权问题
随着企业开始把AI智能体接入内部系统,让它们代替人类调用数据库、API和各类资源,"如何给智能体做授权"迅速成为工程与安全团队关注的焦点。但原帖作者指出,业界在讨论时往往把两个截然不同的问题笼统地称为"agent authorization",这种"扁平化"处理掩盖了真正的技术缺口。
作者将它们拆分为问题A(真正的访问授权)和问题B(授权后的实体绑定正确性)。乍看之下二者都发生在"智能体访问资源"这一环节,但它们失败的根源和归属层完全不同。
问题A:智能体的访问授权(Access Control)
问题A是我们熟悉的授权本身:智能体(或它所代表的人类)请求访问某个资源或执行某个操作,系统判定"允许"或"拒绝"。
这本质上与IAM、RBAC、ABAC为人类和服务账号所做的事情完全一样,只是把它应用到了一种新的"主体类型"(principal)上。IAM(Identity and Access Management,身份与访问管理)是企业管理数字身份和资源访问权限的整体框架;RBAC(Role-Based Access Control,基于角色的访问控制)通过将权限分配给角色、再将角色分配给用户来简化授权管理,是目前企业中最广泛采用的模型;ABAC(Attribute-Based Access Control,基于属性的访问控制)则根据主体属性、资源属性、环境条件等多维度因素动态计算访问决策。这些模型在过去二十年中已被广泛验证——从AWS IAM到Kubernetes的RBAC,从医疗系统的HIPAA合规到金融系统的SOX审计,都有成熟的实践。然而,它们的设计假设是:主体(principal)是明确的、静态的——一个人类用户、一个服务账号、一个微服务实例。当AI智能体作为一种新型主体出现时,它既代表自身,又代表背后的人类用户,这种"代理身份"的双重性给传统模型带来了新的挑战。
从授权协议的演进来看,OAuth 2.0自2012年正式发布(RFC 6749)以来,已成为互联网委托授权的事实标准。其核心思想是将"认证"与"授权"分离,允许第三方应用在不获取用户密码的情况下获得有限的资源访问权限。在AI智能体场景下,最相关的是OAuth 2.0 Token Exchange(RFC 8693)和On-Behalf-Of流程——它们允许一个服务以另一个主体的身份请求资源。然而,这些流程设计时假设委托链是静态的、可预知的,而AI智能体的决策路径是动态的、运行时确定的,这构成了根本性的适配挑战。
作者认为,这里真正的难点不是概念——授权模型早已成熟——而是落地采纳率。
"大多数公司根本没有把内部智能体的流量路由到任何一道门(gate)上,所以即便是最朴素的RBAC,也没有地方可以接入。"
换句话说,问题A是一个"工程接入"问题:不是不会做,而是根本没做。智能体在企业内部横冲直撞地调用资源,却没有任何统一的授权关卡拦截它们。目前,Anthropic的Model Context Protocol(MCP)、OpenAI的函数调用规范等正在形成事实标准,但这些协议层面的规范尚未与企业级授权基础设施(如Oso、Permit.io、AuthZed/SpiceDB等策略引擎)形成统一的集成方案。
从策略引擎的技术生态来看,当前主流方案包括:OPA(Open Policy Agent)使用Rego语言编写策略,支持通用决策场景;AWS开源的Cedar语言专注于授权策略,提供形式化验证保证;SpiceDB(由AuthZed开发)基于Google Zanzibar论文实现关系型授权,支持大规模分布式场景下的毫秒级权限判定。Zanzibar是Google内部的全球统一授权系统,为YouTube、Drive、Cloud等产品提供一致的权限检查服务,其核心创新在于将授权关系建模为有向图,通过图遍历实现灵活的权限继承和计算。这些系统的共同特征是将策略与代码分离、支持声明式表达、提供审计能力,但它们目前都缺乏对AI智能体特有模式的原生支持。
智能体的请求模式不可预测、请求频率极高(一次用户交互可能触发数十次工具调用),且需要理解智能体的"意图链"而非单个请求——这些都是传统API Gateway模式未曾面对的挑战。
问题B:授权之后的实体绑定错误(Data Binding Failure)
真正微妙、也更容易被忽视的是问题B。作者的描述极具启发性:授权系统已经返回了"允许",访问决策本身没有任何错误——但返回的具体记录却属于错误的实体。
一个典型场景
设想一个客服AI智能体,它被合法授权可以回答账户相关问题。用户询问余额,AI也确实有权限查询余额——授权关卡的判断完全正确。但由于查询在解析主体(subject)时出了偏差,AI拉取了另一个关联账户的余额并返回给了用户。
与传统应用中由工程师预先编写的参数化查询不同,AI智能体通常通过大语言模型(LLM)动态生成数据库查询或API调用。这个过程涉及多个步骤:首先,智能体从对话上下文中理解用户意图;然后,它推断需要查询的实体和条件;最后,它构造具体的查询语句或API请求。
理解这里的风险,需要了解MCP和函数调用的工作机制。Anthropic于2024年末发布的Model Context Protocol定义了智能体与外部工具交互的标准化接口,包括工具发现、参数传递、结果返回等环节。OpenAI的函数调用(Function Calling)规范则通过JSON Schema定义工具接口,由模型根据对话上下文决定何时调用、传递什么参数。这两种方案都面临同一个根本性挑战:LLM生成的参数值(如用户ID、账户编号)是基于概率推理而非确定性逻辑产生的,这从根本上改变了参数可信度的假设基础。传统系统中,参数来源是确定的——来自URL路径、Session、JWT token中的声明——但在智能体场景中,参数可能是LLM从对话上下文中"推断"出来的。
在多轮对话中,智能体可能错误地将上下文中提到的另一个实体当作查询目标;在处理模糊指代(如"那个账户")时,可能解析到错误的对象;在使用工具调用时,参数绑定可能因为上下文窗口的信息混杂而出现偏差。这些都不是传统SQL注入或越权访问的问题,而是一种全新的语义层面的绑定错误。
按照严格定义,这不是授权失败。那道门尽职尽责地放行了一个本该放行的请求。这是一个**数据绑定/正确性(data-binding/correctness)**的失败,它恰好发生在授权之后的那道"接缝"里——而这道接缝,没有人明确负责。
责任的真空地带
作者精准地指出了问题的核心:
- 授权工具的职责止步于"allowed"(已允许),它不关心返回的数据究竟绑定到了谁;
- 应用层和数据库层则通常默认:只要授权放行了,返回的东西就自动是正确的。
于是问题B掉进了两层之间的真空。授权层说"我的活干完了",数据层说"你允许的我就当它对"。当智能体自主生成查询、动态解析实体时,这个真空地带的风险被急剧放大——因为人类工程师写的查询往往是硬编码或经过严格测试的,而智能体的查询是即时生成、上下文驱动的。
理解这个问题的技术根源,需要理解"主体解析"(Subject Resolution)的复杂性。在传统Web应用中,主体身份通常通过JWT令牌、Session Cookie或OAuth 2.0的access token来确定,身份是明确的、不可篡改的。但在AI智能体的场景下,主体解析变得异常复杂。一个智能体可能同时管理多个用户的会话(multi-tenant agent),需要在每次工具调用时正确地将请求关联到对应的用户。更复杂的情况是"委托链"——用户A授权智能体B,智能体B又调用服务C,服务C需要知道最终主体是A而非B。OAuth 2.0的token exchange和on-behalf-of流程试图解决这个问题,但在智能体自主决策、动态选择调用路径的场景下,委托链可能在运行时动态构建,传统的静态配置方式难以覆盖所有情况。
这个问题在安全领域有一个经典的理论前身——"混淆代理人"(Confused Deputy)问题,由Norm Hardy在1988年的论文中首次形式化描述。原始案例是一个编译器程序,它同时拥有写入用户指定输出文件和写入系统计费文件的权限。攻击者通过将输出文件名指定为计费文件路径,利用编译器的合法权限覆盖了系统文件。这个问题的核心是:权限检查发生在错误的抽象层——系统只验证了"编译器有权写文件",却没有验证"这次写操作的目标是否合理"。能力安全(Capability-based Security)模型被认为是解决混淆代理人问题的根本方案,它要求每次操作都必须持有针对特定资源的不可伪造令牌,而非依赖环境权限。AI智能体的问题B可以被视为混淆代理人问题在LLM时代的新变种:智能体拥有合法的访问权限,但它的推理过程——而非外部攻击者——导致它将权限用在了错误的目标上。
这个区分是否真实存在?
原帖作者也保持了审慎,他反问社区:这个区分是真实的,还是自己发明了一个实践中无关紧要的差别?
他进一步抛出几个关键问题,也是这场讨论真正有价值的地方:
- 构建过智能体授权系统的人,是否真的把B当作一个独立的关注点来对待?还是它被顺理成章地吸收进了"显然你应该正确地限定查询范围"这句轻描淡写的话里?
- 问题B是否已有现成术语?它是不是就是换了个名字的行级安全(Row-Level Security, RLS)?还是一种完全不同的东西?
问题B与行级安全(RLS)的关系
这是一个很好的技术追问。行级安全确实能在数据库层强制"某用户只能看到属于自己的行"。从某种程度上说,RLS正是为了防止问题B而存在的机制之一。
从技术实现来看,RLS是一种数据库级别的访问控制机制,它允许数据库管理员定义策略(policy),使得同一张表中的不同行对不同用户可见或不可见。PostgreSQL从9.5版本起原生支持RLS,SQL Server通过安全谓词(security predicate)实现类似功能。典型实现方式是:在每次查询执行前,数据库引擎自动附加一个过滤条件,例如 WHERE tenant_id = current_setting('app.current_tenant')。这种机制的优势在于它是"透明"的——应用层代码无需修改,安全策略在数据引擎层面强制执行,即使应用层代码存在bug也不会泄露数据。
但二者并不能完全等同。RLS是一种声明式的、在数据层强制的约束,它要求你能准确地把当前会话上下文(context)与行的所有者关联起来。而问题B的隐患恰恰在于上下文解析本身出错——智能体把"当前主体"错误地解析成了另一个实体。如果传给RLS的上下文就是错的,那么RLS会一丝不苟地为"错误的主体"返回"正确的行",问题依旧存在。
因此,问题B更准确地说是一个主体解析(subject resolution)与数据绑定的一致性问题,RLS只是缓解手段之一,而非完整答案。要真正解决这个问题,需要在整个调用链中建立端到端的身份传播机制,确保从用户发起请求的那一刻起,到最终数据返回的那一刻止,主体身份始终是可验证的、不可被智能体的推理过程所篡改的。
对AI智能体系统安全设计的启示
这场讨论虽然源于一个简单的分类追问,却触及了AI智能体安全架构的一个深层盲区。
授权通过不等于数据正确
传统的"授权"心智模型建立在一个隐含假设上:只要访问被允许,结果就是可信且正确的。这个假设在人类操作、静态查询的世界里大体成立。但当智能体自主构造查询、动态推断实体时,"允许"和"正确"之间被撕开了一道缝隙。
这个问题在更宏观的安全哲学层面,反映了"默认信任"(implicit trust)向"零信任"(zero trust)范式转变的必要性。零信任架构的核心原则是"永不信任,始终验证"(never trust, always verify),它要求在每个访问决策点都进行独立验证,而不是因为请求来自"内部网络"或"已认证主体"就自动信任。将零信任思想应用到AI智能体场景,意味着即使智能体已通过授权检查,其生成的每个查询参数、每个实体引用都应该被独立验证——因为智能体的推理过程本身是不可信的。
谁来为这道接缝负责
对于正在构建智能体基础设施的团队,这个区分提示我们:
- 问题A的解法是尽快建立统一的授权网关,让所有智能体流量都必须经过一道可审计、可策略化的门。这包括将OPA(Open Policy Agent)、Cedar等策略引擎与智能体编排框架(如LangChain、CrewAI、AutoGen等)进行深度集成,在每一次工具调用前执行细粒度的权限检查。
- 问题B的解法则需要在授权之后、返回结果之前,增加一层实体一致性校验——确保查询解析出的主体,确实是当前授权上下文所指向的主体。具体的工程实践可能包括:在智能体的工具调用层注入不可变的身份标识符(而非让LLM自行推断)、对智能体生成的查询进行"主体一致性断言"检查、以及建立事后审计机制来检测绑定偏差。
把这两个问题混为一谈,最危险的后果是:团队以为部署了RBAC就万事大吉,却对问题B毫无防备。而在客服、金融、医疗这类涉及敏感个人数据的场景中,返回"错误实体的正确数据"造成的隐私泄露,其严重程度丝毫不亚于一次真正的越权访问。从合规角度看,GDPR的"目的限制"原则和"数据最小化"原则都明确要求个人数据只能被其合法所有者访问,而不仅仅是"有权限的人"可以访问——这里的"有权限"和"正确的数据主体"必须同时满足。美国的CCPA(加州消费者隐私法案)、中国的《个人信息保护法》也有类似的要求:数据处理者必须确保个人信息仅用于收集时声明的目的,且只提供给有合法依据的特定个体。一次实体绑定错误——即使技术上并非"未授权访问"——在法律层面仍然可能构成数据泄露事件,触发监管通知义务和罚款风险。
结语
这位开发者的拆分,本质上是在提醒整个行业:在给AI智能体设计权限体系时,不能只盯着"能不能访问",还要盯着"访问到的到底是不是它该看到的"。
随着智能体越来越多地代表用户执行自动化操作,授权(authz)与数据正确性之间的这道接缝,很可能成为下一个被反复踩坑的安全前沿。它是否会催生一个新的术语和一类新的工具,值得持续关注。从目前的技术生态来看,一些新兴项目已经开始探索这个方向——例如将形式化验证方法应用于智能体的查询生成过程,或者构建专门的"身份锚定"(identity anchoring)中间件来确保整个调用链中主体身份的不可变性。
形式化验证在这个领域的应用思路是:为智能体生成的每个查询定义形式化约束(如"查询的WHERE子句必须包含当前认证用户的ID"),然后在执行前通过SMT求解器(如Z3)或类型系统检查该约束是否被满足。微软的GUARDRAIL等项目已在探索这个方向,但面临的挑战是:自然语言到形式化规约的转换本身可能引入错误,且验证的计算开销需要在延迟敏感的场景中保持可接受。另一个有前景的方向是"身份锚定"中间件——在智能体的工具调用链中插入一个不可绕过的层,该层从经过密码学验证的认证上下文(而非LLM的推理输出)中提取主体身份,并将其作为不可变参数注入所有下游调用。这种设计确保了即使LLM的推理过程出现偏差,最终执行的查询仍然绑定到正确的主体。
这个领域仍处于早期,但其重要性将随着智能体自主性的提升而快速显现。当我们从"人类指导下的AI辅助"走向"AI自主执行复杂任务"时,每一个未被覆盖的安全接缝都将成为系统性风险的放大器。
核心要点
核心要点
相关推荐

Claude自主设计蛋白质成功率35%,远超人类专家水平
Anthropic的Claude模型在自主设计靶向疾病蛋白质任务中取得35%实验成功率,远超人类专家10%-15%的平均水平。本文深入解析这一湿实验验证成果对生物医药行业的潜在影响。

Perplexity Discover多语言支持突然消失,国际用户为何不满?
Perplexity Discover新闻资讯功能突然取消多语言支持,仅保留英文内容,引发国际用户强烈不满。本文分析功能回退的可能原因,探讨AI产品国际化面临的资源权衡与用户信任挑战。
