Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

模型: openai/gpt-5.4
生成日期: 2026-04-01
书名: Claude Code VS OpenCode:架构、设计与未来
章节: 第23章 — 安全与自主的平衡
Token用量: 约 6,000 input + 1,980 output

23.3 能力声明模式

最安全的自主系统,不一定是能力最少的系统,而是能力被显式声明、范围被清晰限定、授予过程可审计的系统。这就是 capability declaration pattern(能力声明模式)的核心思想。

在很多现有系统里,权限其实是隐式的。某个插件“能做某事”,只是因为它恰好运行在宿主内部;某个工具“能联网”,只是因为没人专门禁止它;某个 subprocess(子进程)继承了环境变量里的凭证,因此天然拥有额外权力。这样的安全模型非常脆弱,因为 authority(权力)不是被正式授予的,而是靠环境偶然形成的。宿主系统有时甚至并不知道扩展真正拥有多大有效权限。

能力声明模式的思路,正好反过来。系统不再问“它实际上碰巧能做什么”,而是问“它明确声称自己需要哪些能力、这些能力的范围是什么、在什么条件下有效”。一个设计良好的扩展、工具或 MCP server,应该声明自己是否需要文件系统读权限、写权限、网络出口、外部 API token、shell 执行、后台运行、长期存储、宿主级钩子等。这些声明最好是 machine-readable(机器可读)的,而不是藏在文档角落里的口头约定。

为什么显式声明比隐式权限更好?因为显式能力更容易推理、更容易限制、更容易审计、更容易撤销。它还能更好地支持组合和委派。如果父 agent 要把任务交给子 agent,运行时就可以决定:是继承全部能力、只继承一部分,还是重新发一个最小能力集合。如果没有显式声明,委派往往会直接继承 ambient authority(环境中天然存在的权力),这几乎是最危险的默认值。

这个模式一旦与 scoped time-limited tokens(有范围且有时效的令牌) 结合,再通过 credential proxy(凭证代理) 发放,就会变得更强。所谓 credential proxy,可以理解为一个凭证中介层:智能体并不直接拿长期密钥,而是向代理申请某个明确目的的临时凭证,例如只读某个仓库、只调用某个服务、只上传某个产物、只执行一步部署,并在短时间后过期。这样,长期秘密不会直接暴露在自主运行时面前。

这和现实中一个非常常见的反模式形成鲜明对比:把宽范围 API key 直接注入环境变量,然后希望模型“不要乱用”。这种 ambient secret(环境型秘密)很危险,因为它让“显式授予的能力”和“实际可用的能力”之间出现巨大裂缝。系统口头上也许没给 agent 生产部署权,但如果环境里已经躺着生产 token,那它事实上就拥有这份权力。

credential proxy 的另一个优点,是增强审计能力。如果每个 token 都是为特定目的、特定资源、特定时长签发的,那么日志就更有意义。安全团队可以回答:哪个 agent 请求了什么权限,为了哪个动作,对哪个资源,持续多久。相比之下,如果扩展只是默默继承静态环境变量,那这种可追踪性几乎不存在。

能力声明还有一个产品层优势:让用户看得懂。与其让用户在模糊信任里做决定,例如“要不要安装这个工具”,不如明确展示这个扩展到底要求什么:需要只读仓库访问、需要外网访问、不需要文件写入、需要一个短时 issue-tracker 凭证。用户面对的是具体声明,而不是抽象信任感。这会明显改善 informed consent(知情同意)的质量。

OpenCode、OMO、Claude Code 都能从这个模式中受益。开放生态里工具和扩展很多,显式声明能防止隐性权力蔓延;OMO 的角色化设计已经隐含了按 agent 类型分能力的思路;Claude Code 更强的安全取向则提示下一步:从零散权限弹窗,进一步走向更形式化的 capability model(能力模型)。这不是某个产品的私有需求,而是所有第三方扩展型 agent 系统迟早要面对的成熟课题。

当然,实现上也会有挑战。能力声明可能变得冗长,开发者可能为了省事一口气申请很宽的范围,宿主需要定义统一词汇表,用户也可能被过多细粒度权限搞得麻木。但这些都只是设计难题,不是否定这个模式的理由。它们说明我们需要更好的抽象,而不是继续依赖隐式权限。

从架构原则上说,可以把它压缩成两句话:显式能力优于隐式权限。短期、限域凭证优于长期、环境继承秘密。 这两条一旦成立,agent 系统就更有机会做到既强大,又可治理。

如果说沙箱定义了“运行时最多能走到哪里”,那么能力声明定义的就是“它在这个边界内可以申请哪些权力”。两者缺一不可。而能力声明的重要性在于,它让原本隐藏的权力结构变得可见。自主系统要想真正被信任,首先就必须让权力变得可被看见、可被审查、可被缩减。