08. 权限与安全¶
Claude Code 的权限系统建立在一个事实之上:模型没有直接执行能力。模型只能输出工具调用,本地运行时才决定是否调用处理器。权限、安全检查、沙箱和用户确认都发生在本地,因此模型即使在文本里“承诺安全”,也不能绕过运行时规则。
权限逻辑独立于提示词,并且会把拒绝、询问、自动放行和沙箱失败都表达成模型下一步能理解的结果。
权限判断先看显式规则。用户设置、项目设置、本地设置、命令行、策略配置和会话内修改都可能提供允许、拒绝、询问规则。拒绝的优先级最高;询问表示即使某些模式倾向放行,也要进入确认路径;允许只是通过规则层,不代表一定执行。工具还可以有自己的权限检查,例如 Bash 会解析命令、判断子命令、路径、危险操作和沙箱条件;文件编辑工具会检查目标路径和规则匹配。
权限模式决定默认态度。默认模式遇到不确定动作会询问;接受编辑模式更偏向允许编辑类操作;计划模式会限制实际修改;禁止询问模式在非交互场景下把需要询问的动作转为拒绝;绕过权限模式也不是无限制,它仍然不能越过某些工具交互要求、显式询问、安全检查和本地策略。模式改变的是“没有明确规则时怎么处理”,不是移除权限系统。
钩子不等于后门。工具使用前钩子可以修改输入、增加上下文或给出允许/拒绝/询问建议,但钩子的允许结果不会绕过拒绝规则、询问规则、工具安全检查和需要用户交互的限制。运行时会用规则检查重新约束钩子决策。这样插件或项目钩子可以参与流程,但不能把安全边界降级成提示词约定。
沙箱是权限系统的一部分,但不是唯一防线。Bash 等开放世界工具可以在沙箱中运行,限制文件系统写入、网络域名、设置文件访问和某些危险路径。沙箱配置会综合设置、权限规则、当前工作目录、额外工作目录和 WebFetch 域名规则。即使开启沙箱,也仍然需要判断命令是否适合沙箱、是否被排除、是否需要用户确认。被排除命令只是便利配置,不应被理解为安全边界本身。
交互式和非交互式入口的处理不同。交互式终端界面可以弹出权限确认,显示工具输入、风险说明和允许/拒绝选项。非交互式 SDK 或一次性执行没有用户界面,如果策略不允许自动批准,就必须拒绝或失败。自动模式可以借助分类器判断部分请求是否安全,但分类器失败时默认保守处理,并且安全检查不可由分类器随意覆盖。
权限拒绝也会回到模型。运行时不会默默吞掉失败,而是生成工具结果,说明工具没有执行或权限被拒绝。模型下一轮采样可以据此调整方案,例如改用只读命令、请求用户授权、解释无法继续,或选择不需要该工具的路径。安全系统不是循环外的异常,而是智能体推理输入的一部分。
典型结果可以按四类理解:
| 结果 | 本地动作 | 回到模型的内容 |
|---|---|---|
| 普通失败 | 工具已执行 | 退出码、错误输出或失败原因 |
| 权限拒绝 | 工具未执行 | 拒绝规则、所需确认或受限范围 |
| 沙箱阻止 | 工具被隔离层拦截 | 沙箱失败原因和是否可请求升级 |
| 用户拒绝 | 工具未执行 | 用户拒绝或非交互策略拒绝 |
模型动作面由工具结构说明决定,本地执行面由处理器决定,两者之间由权限系统隔开。模型可以建议、请求、计划,但不能直接读写文件、运行命令或调用 MCP。真正产生副作用的每一步都必须通过本地运行时的校验、规则、沙箱和确认流程。下一章会说明这些动作如何形成状态、事件和可恢复记录。