权限与安全

Claude Code 的执行能力很强,所以权限与安全不是附属机制,而是主流程的一部分。你可以把它理解成一套贯穿输入、工具、主循环与 UI 的控制链。

系统如何决定哪些动作可以执行、哪些动作必须限制或确认。

优先看工具协议、工具注册、权限规则系统和 QueryEngine 回流。

理解默认模式、计划模式、自动模式为何会影响整条执行链。

权限贯穿路径

如果把 Claude Code 看成一条“输入 -> 主循环 -> 工具 -> 状态 -> 渲染”的执行链,那么权限和安全逻辑几乎嵌在每一层里。它不是单点拦截器,而是一套贯穿整个执行过程的控制系统。

权限控制主要落在哪

权限为什么必须和工具层绑定

  • 真正危险的动作发生在工具调用阶段,而不是纯文本生成阶段。
  • 不同工具的风险模型不同,必须保留细粒度控制。
  • 自动模式、计划模式、默认模式等权限策略都要统一落在可执行能力上。

输入层安全透视

模块定位

输入层的安全职责不是最终拍板是否放行,而是尽量在进入高成本主循环前完成基础分流和部分前置约束。

关键文件

上游 / 下游

  • 上游:用户输入、桥接输入、系统生成 prompt
  • 下游:本地命令、QueryEngine、hook 链

运行时行为

  • 决定某次输入究竟是普通 prompt、slash command 还是 meta prompt
  • 执行 prompt submit hooks
  • 在进入主循环前形成更稳定的输入语义,减少后续安全控制的歧义

常见误区

输入层不会代替工具层做最终授权判断,它更多负责“先分清输入要去哪条路”。

建议阅读顺序

  1. processUserInput
  2. hook 执行相关逻辑
  3. 再看 QueryEngine 如何消费结果

工具协议与注册层安全透视

模块定位

Tool.tstools.ts 是安全边界最核心的两层:前者定义权限上下文和工具抽象,后者决定哪些能力在当前会话里真正暴露。

关键文件

上游 / 下游

  • 上游:QueryEngine 的工具请求
  • 下游:具体工具实现、权限规则、环境依赖

运行时行为

  • 统一工具调用协议
  • 根据环境、feature gate 和会话配置裁剪可用工具集合
  • 为后续权限系统提供一致的工具名、规则匹配和上下文入口

常见误区

很多人把安全逻辑全归到 utils/permissions/,但如果没有 Tool 协议和工具注册层提供统一接口,后面的权限系统很难做到细粒度而一致的控制。

建议阅读顺序

  1. Tool.ts 的类型与上下文
  2. tools.ts 的注册和 feature gate
  3. 再进入具体权限规则

权限规则与模式透视

模块定位

src/utils/permissions/ 是权限系统的策略层,负责把“允许什么、不允许什么、在什么模式下允许”表达成可执行规则。

关键文件

  • src/utils/permissions/permissionSetup.ts
  • src/utils/permissions/PermissionMode.ts
  • src/utils/permissions/permissions.ts
  • 工具执行层模块页

上游 / 下游

  • 上游:Tool 协议、工具名、用户配置、环境变量、GrowthBook / policy 条件
  • 下游:具体工具放行 / 拒绝、自动模式限制、危险规则过滤

运行时行为

  • 解析 permission mode
  • 从磁盘与配置源加载规则
  • 识别危险 Bash / PowerShell 规则
  • 在自动模式或受限模式下收窄能力边界

常见误区

权限模式不是单纯的 UI 文案状态,而是会真实改变工具暴露面和规则集的运行时配置。

建议阅读顺序

  1. PermissionMode.ts
  2. permissionSetup.ts
  3. permissions.ts 和危险模式定义

QueryEngine 回流透视

模块定位

安全系统不能只负责“拒绝动作”,还必须负责把拒绝结果正确回流到会话主循环,否则模型和用户都无法理解刚刚发生了什么。

关键文件

上游 / 下游

  • 上游:工具执行结果、权限拒绝结果
  • 下游:消息历史、后续轮次、状态更新、UI 反馈

运行时行为

  • 将权限拒绝或工具错误编码进消息流
  • 维护 tool use / tool result 的配对关系
  • 让模型在后续轮次感知“某个工具为什么没被执行”

常见误区

如果只看权限规则本身,很容易忽略“被拒绝之后系统怎么继续运行”。而这恰恰是 QueryEngine 很重要的职责。

建议阅读顺序

  1. QueryEngine 的消息持有与提交逻辑
  2. query.ts 中工具结果与错误处理路径
  3. 再回头看工具权限上下文

状态与 UI 反馈透视

模块定位

权限系统最后必须把内部判断转成用户可理解的反馈,否则安全策略就只是黑箱。

关键文件

上游 / 下游

  • 上游:QueryEngine、工具层、权限规则系统
  • 下游:终端 UI、状态栏、提示信息、后续用户交互

运行时行为

  • 在 AppState 中保存 toolPermissionContext
  • 把授权状态、拒绝状态和相关提示展示到 UI
  • 让用户理解当前模式下为什么某类动作被允许或被限制

常见误区

安全反馈不只是弹一次确认框。对于长会话、后台任务、bridge 或自动模式来说,持续可见的状态表达同样重要。

建议阅读顺序

  1. AppStateStore.ts 中与权限相关的状态
  2. 相关 UI 组件
  3. 再回看工具层如何更新这些状态

默认模式、计划模式、自动模式的落点差异

三种模式的差异,不只是“严格程度不同”,而是落在流程中的位置不同:
  • 默认模式:以工具执行时的逐次判断为主,强调显式授权
  • 计划模式:偏向限制执行、鼓励先分析后实施,因此会影响工具使用边界和用户预期
  • 自动模式:最依赖规则系统、危险模式识别和工具裁剪,因为它要减少人工确认同时避免越界
因此,权限系统的复杂度并不是来自“多写几条规则”,而是来自不同模式要在同一条执行链中共享一套可解释的控制逻辑。

你应该重点关注什么

  1. 权限模式如何表示
  2. 危险规则如何定义
  3. 工具授权失败后如何反馈回 QueryEngine
  4. 权限状态如何影响后续消息与 UI

建议联动阅读