安全与授权
智能体可以提出动作;受信任的强制执行路径决定这个动作能否产生实际效果。这一区分很重要:身份验证确认调用方的声明,授权决定特定主体能否在当前上下文中,对特定资源执行特定动作。凭证承载声明或授权,本身并不是策略。审批是授权的输入,审计是决定作出后的证据。
这一区分对智能体尤其重要。提示注入(prompt injection),即藏在不受信任内容中的指令,可能让智能体请求用户从未打算执行的动作,却不能创造强制执行点没有授予的权限。因此,最小权限可以限制可能造成的损害,却不能让请求本身变得正当:如果读取私有仓库和写入公开仓库都获准,注入的指令仍能组合这两项权限。任务完整性与授权是互补控制,不能相互替代。
概念验证,而非普遍规律
2025 年 5 月,Invariant Labs 公布了一项概念验证,目标是一个使用 Claude Desktop、GitHub 官方 MCP 服务器和个人访问令牌的智能体 (Milanta and Beurer-Kellner 2025)。研究人员把指令放进一个恶意公开议题。智能体处理该议题时,这些指令诱使它读取私有仓库,随后写入公开拉取请求。
攻击成立的前提才是关键。用户用同一个凭证连接了多个仓库;智能体可以读取攻击者控制的议题内容;可用工具既能读取私有数据,也能公开发布数据;相关工具调用还获得了批准,可能是逐次批准,也可能来自客户端长期有效的“始终允许”选项。这项演示没有证明令牌会持续整个会话,没有涉及真实受害者,也没有证明所有 MCP 实现都有缺陷。它证明的是:当不受信任内容影响规划器时,一条本来获准的数据路径可能跨越信任边界。
这并不是 MCP 的普遍性质。MCP 提供工具传输机制,并为部分传输方式规定授权配置;它既不决定部署中的仓库策略,也不能证明所请求的工具动作符合用户意图。纵深防御必须同时处理两方面:在强制执行边界限制可达权限,并约束不受信任数据如何影响控制流。检索层面的做法见 第 44 章,运行框架层面的做法见 第 41 章。
先定义授权决定,再选择令牌
设一次授权查询为
这个元组表示主体 、动作 、资源 、上下文 ,并在策略版本 下求值。主体包含通过身份验证的行动方及其委派信息;动作是精确的操作;资源是精确的目标;上下文包含租户、任务、时间、数据分类和预算状态等可信事实。本地平台的结果 是允许、拒绝或质询。“质询”表示重新求值前必须补充新的要素,例如对确切效果进行人工审批。AuthZEN 的标准响应是布尔值;平台可以用“拒绝加类型化的升级验证上下文”表示质询,也可以使用本地扩展 (Gazitt et al. 2026)。在后果重大的路径上,缺失或未知的输入默认导致拒绝。
主体不是一个不透明的单一 ID。实用的主体声明会保留:
- 用户身份,前提是存在当前或先前的用户授权;
- 提出动作的智能体或会话版本;
- 执行进程的工作负载身份;
- 租户绑定和委派链;
- 每项已验证声明的来源。
这些角色不一定都是彼此独立的主体。定时服务可能没有在线用户,一个任务可能跨越多个工作负载,而在某些系统中,智能体版本只是属性,不是身份。包括 SPIFFE SVID 在内的工作负载身份可以验证软件,却不能证明用户意图或权限 (SPIFFE Project 2026)。策略使用的租户值必须来自经过身份验证的声明或权威资源查询,不能来自不受信任的请求头。
有效权限是多项授权的交集
先在同一个动作、资源与上下文元组全集上定义每项授权。有效权限就是五项授权同时允许的部分:
用户授权表达被委派的同意;智能体授权限制具名智能体或会话;工作负载授权规定哪些运行中的软件可以调用;资源策略落实所有权、共享和租户规则;运行时约束则包括网络目标、审批状态、速率与预算限制,以及当前风险信号。交集只能缩小权限。实践中,策略决策点计算决定,策略执行点则阻止或执行实际效果 (Rose et al. 2020)。身份验证和令牌签发只提供可信输入,两者本身都不执行策略。
这个模型也说明,范围列表并不是全部攻击面。工具描述、参数解析、输出数据流、已启用操作、网络可达性、重定向和凭证托管,都会改变攻击者能够触达的范围。
从请求到实际效果
完全仲裁意味着平台必须授权每一项外部效果,而不只是授权会话或第一次工具调用。一条可靠路径如下:
系统必须在策略评估前完成规范化。它要统一规范动作、规范资源、目标地址、方法、参数、Unicode、默认值、单位和重定向策略,再对所有影响执行的字段计算哈希。使用时,执行点重新计算哈希,并要求它与决定中的哈希完全一致。这样才能弥合常见的检查时与使用时差距,避免审批针对一个目标,执行时却换成另一个目标。
如果身份、策略、审批、预算预留或审计意图不可用,高影响路径默认关闭。只有在故障前已经列明允许的操作及其限制时,低风险降级路径才站得住脚。通用绕过路径会悄然把可用性功能变成环境权限。
把审批绑定到确切效果
人工审批应当按风险分级,而不是每次无害读取都询问。需要审批时,可信界面应展示精确的动作、资源和规范参数,包括目标地址和敏感数据流向。审批记录包含一次性质询、请求哈希、随机数、来源和有效期。它会过期,也不能用于参数变化、新的重定向或后续操作。
人工审批无法修复误导性的预览。如果摘要由智能体编写、隐藏了目标地址,或者反复弹窗直到用户点击,审批仪式几乎不能提供保证。独立的强制执行路径必须呈现权威字段,并对最终请求重新求值,这也把授权与 第 55 章 讨论的监督局限连接起来。
委派不能扩大权限
委派权限不应增长。子授权应当是父授权的子集,而且这一要求只适用于继承而来的委派权限。形式上,在同一个动作、资源与上下文全集上, 是必要的局部不变式,但还不充分:子授权还必须保留受众、租户、用途、有效期、审批和数据流约束,多个子授权也不能重新组合出更宽的并集。
服务自身的独立权限是另一回事,不能冒充用户委派的权限继续转发。审计链应保留行动方和主体,让下游服务可以区分委派与冒充。RFC 8693 提供令牌交换协议,以及表示主体令牌、行动方令牌、资源、受众和范围的字段;但令牌交换本身不会保留用户策略、收窄结果、撤销输入令牌或传播后续撤销 (Jones et al. 2020)。这些责任仍属于授权服务器和资源服务器。
令牌属性不能互相替代
| 控制 | 提供的保证 | 不能保证的事项 |
|---|---|---|
| 窄范围 | 资源服务器执行范围时,限制令牌所表示的操作 | 确切目标、用户意图或安全参数 |
| 资源指示符 | 为目标服务请求受众受限令牌 | 仓库级或工具级权限 |
| 发送方约束令牌 | 要求绑定客户端提供持有证明 | 客户端正在为正当任务行动 |
| 短有效期 | 缩短遗失后或离线撤销后的暴露时间 | 立即撤销 |
| 令牌内省或引用令牌 | 让资源服务器取得令牌的当前状态 | 响应被缓存时仍保持零延迟 |
| 撤销列表或推送状态 | 可以在自包含令牌过期前使其失效 | 策略正确或部署覆盖完整 |
持有者令牌可被任何取得它的人重放。发送方约束令牌增加持有证明,受众受限令牌则限制应当接受它的位置;OAuth 安全指南建议在适当场景同时使用两者 (Lodderstedt et al. 2025)。RFC 8707 的资源指示符标识目标服务,并不标识确切仓库、工具或动作 (Campbell et al. 2020)。
短有效期很有用,却不能立即撤销。OAuth 令牌内省可以暴露当前状态,引用令牌可以要求在线查询,撤销列表则可以使自包含令牌失效。缓存会引入可测量的陈旧窗口。RFC 7009 和 RFC 7662 分别描述撤销与内省,但相关令牌之间如何传播撤销,仍取决于部署策略 (Lodderstedt et al. 2013; Richer 2015)。应测试最坏情况下的撤销延迟,而不是假定 TTL 已经解决问题。
可收窄凭证能让限制以组合方式传递。例如,Macaroons 允许持有者添加由验证方检查的上下文限定 (Birgisson et al. 2014)。它不会自动生成逐次调用令牌,不会替系统选择正确限定,也无法阻止仍处于限定范围内的恶意使用。
MCP 授权只负责更窄的范围
MCP 实现可以不支持授权。在稳定版 MCP 授权配置中,基于 HTTP 的受保护服务器充当 OAuth 资源服务器并发布 OAuth 受保护资源元数据;客户端发现授权元数据,并为规范服务器 URI 发送 RFC 8707 的资源值 (Model Context Protocol 2026)。服务器必须验证令牌确实签发给自己。STDIO 部署不使用这套 HTTP 流程,而是采用所在环境的凭证机制。
受众验证可以阻止一类令牌透传,却无法阻止提示注入,不能判断某项工具动作是否合适;如果应用策略没有区分同一 MCP 服务器背后的两个仓库,它也无法代为区分。MCP 服务器仍是工具名称、规范参数、资源所有权和当前上下文的策略执行点。
让凭证远离模型,再约束其使用
可复用密钥不应出现在模型上下文、生成代码、日志或沙箱环境中。凭证代理可以给执行器一个不透明句柄,并在授权完成后附上真实凭证。对于静态密钥,了解提供商协议的出网代理可以在 TLS 终止后注入密钥。这两种模式都保护凭证托管,却都不能证明获准请求就是良性的。
因此,代理不仅需要目标地址允许列表,还需要规范的方法、路径、操作、参数、重定向和 DNS 策略。主机限制不等于 API 级授权:注入的请求即使发往允许的主机,仍可能删除数据或公开秘密。提供商签名和质询响应协议需要按提供商处理,不能依靠字符串替换。TLS 终止还会形成新的信任边界:代理能够看到明文,客户端也必须信任其证书颁发机构。强制执行记录应写明这条边界,但不能记录静态密钥。
租户隔离是另一层强制措施
租户是已验证主体和资源的一部分;对于全局资源和跨租户资源,还要有明确的所有权或共享模型。共享数据库可以执行行级策略;命名空间或分片可以增加命名空间隔离;独立账户或集群可以增加物理隔离。这些都是纵深防御。物理隔离能缩小部分实现错误的影响范围,但不能取代授权;控制面、共享网关、备份和路由层仍要分别执行策略。
隔离方式应按资源及其后果选择,而不是成为整个平台的口号。检索记忆可能需要比低敏感度遥测更强的边界。每一层都需要跨租户反向测试,包括伪造租户请求头、资源所有权不匹配、共享资源规则、后台任务、缓存、导出、恢复路径和管理操作。分区能让某些错误更难发生,却不能让策略变得多余。
预算也是授权义务
提供商收费后的警告只是证据,不是强制措施。硬预算闸门会验证预算主体,并在调用前原子地预留保守成本上界。对于一个预算周期,要求
其中, 是已结算用量, 是尚未结算的预留, 是拟执行动作的保守成本上界, 是限额。四项必须使用同一主体、周期、货币或单位。执行结束后,按实际用量结算并释放剩余预留。并行调用必须争用同一份预留状态,否则每次调用都可能单独通过限额检查。这正是 第 76 章 中经济控制在授权层面的后果。
运行契约
请求、决定、强制执行尝试和实际效果需要相互关联,却必须分别记录。决定记录不能证明外部效果已经发生。反过来,没有决定版本的外部响应,也无法解释为何允许该效果。
一份实用且带版本的契约包含:
authorization_request_id
subject_claims_and_provenance
agent_model_tool_revisions
delegation_chain
action_resource_and_canonical_parameters
tenant_and_data_classification
policy_bundle_revision
decision_obligations_and_reason
approval_challenge_and_binding
credential_audience_scope_sender_and_expiry
enforcement_point_and_result
budget_reservation_and_reconciliation
effect_idempotency_key
revocation_and_failure_mode
audit_evidence_and_retention
执行副作用前,在智能体无权写入的位置追加一条预写意图。它绑定请求哈希、决定、执行器、预留、凭证句柄和幂等键。尝试执行后,再追加效果回执,状态为成功、失败或未知,并记录提供商事务 ID、结果哈希、实际用量和错误类别。当超时后无法确定外部操作是否完成时,“未知”不可或缺。回执只能证明这条强制执行路径记录了什么,不能证明模型的自然语言理由、其他位置的数据删除,或者不存在未记录的效果。
验证不仅要测试正常路径,还要测试拒绝路径:跨租户访问、伪造属性、审批后修改参数、重放质询、未批准的重定向、策略或审计不可用、并发预算竞争、撤销延迟、重复幂等键,以及被攻陷的智能体试图读取凭证。多智能体委派需要在每次交接时执行同样的测试(第 43 章)。
仍有三条边界没有定论。第一,集中式策略决策点能提供一致的版本管理和证据,本地决策则能降低延迟和相关性故障;许多系统采用集中分发策略、本地强制执行的组合。第二,智能体或会话版本可以是一等主体,也可以只是附着在用户身份和工作负载身份上的声明。判断标准是:独立的生命周期、策略和归因是否值得增加一个主体。第三,精确审批适合罕见且易于理解的效果,但反复审批或不透明预览会削弱它。无论如何选择,都不能省去完全仲裁和可测试的失效行为。
授权假定强制执行路径能够看到真实请求,而且无法绕过。因此,运行时必须隔离生成代码,仲裁网络和工具访问,保护凭证代理中的凭证和审计记录,并筛选送入规划器的数据。这些机制是 第 57 章 的主题。授权给出必须执行的精确边界,运行时安全则让这条边界成为现实。
延伸阅读
- Rose et al., “Zero Trust Architecture” (定义策略决策点、策略执行点,以及以资源为中心的持续访问决策), 2020. csrc.nist.govNIST 参考架构将策略决策与执行分离,并拒绝基于网络位置的隐式信任。
- Birgisson et al., “Macaroons: Cookies with Contextual Caveats for Decentralized Authorization in the Cloud” (提出一种持有者可以继续附加限制,并由验证方执行这些限制的不记名凭据), 2014. ndss-symposium.orgMacaroons 展示了如何通过串联约束实现去中心化的权限收缩,但策略语义和撤销仍需由外围系统处理。
- Lodderstedt et al., “Best Current Practice for OAuth 2.0 Security” (当前 OAuth 安全指南,包括受众限制和发送方约束的访问令牌), 2025. rfc-editor.orgRFC 9700 汇总了抵御令牌泄漏、重放、混淆和其他 OAuth 威胁的部署指南。
- Model Context Protocol, “Authorization” (为受保护的 HTTP MCP 服务器规定可选的 OAuth 配置), 2026. modelcontextprotocol.ioMCP 授权配置统一了服务器发现和受众绑定的 OAuth 访问,但不规定应用层工具策略。
- Gazitt et al., “Authorization API 1.0” (连接策略执行点与策略决策点的厂商中立协议), 2026. openid.netAuthZEN 定义了主体、动作、资源、上下文和布尔决策的交换格式,但把策略语言和执行机制留给具体实现。
- SPIFFE Project, “SPIFFE Identity and Verifiable Identity Document” (为软件工作负载定义可移植身份), 2026. spiffe.ioSPIFFE 负责识别和认证工作负载;应用仍需另行处理用户委托和授权策略。
评论
登录后评论