权限系统
多层权限控制与分类器审批
权限系统是 Claude Code 安全架构的核心。它通过多层权限源、规则匹配和分类器审批来控制工具的执行权限,确保 AI 不会执行危险操作。
核心要点
设计亮点
两阶段分类器像法院系统
当 Claude 请求执行一个工具时,Stage 1 分类器用最多 64 个 Token 做出快速判断。如果是明显安全的操作(读取文件),直接放行。如果是明显危险的(删除文件),直接阻止。只有在模糊地带(如修改配置文件),才会启动 Stage 2 的完整推理。这让 90% 的权限检查在 500ms 内完成,而不是每次都花 2-3 秒做深度分析。两个阶段共享 prompt cache,所以 Stage 2 几乎不增加额外成本。
安全工具走 VIP 通道
Read、Grep、Glob 这些只读工具被放在白名单里,完全跳过分类器。道理很简单:读取文件不可能造成破坏。跳过分类器每次省约 500ms 延迟和一次 API 调用费用。考虑到一次代码搜索任务可能调用几十次 Grep,这个优化累计节省了大量时间和成本。但白名单是保守的——只有不可能产生副作用的工具才有资格。
被没收的权限留有收据
当管理员的策略(policySettings)与用户设置冲突时,比如用户设了 bypassPermissions 但管理员禁止了,这条规则不是被默默删除,而是被移到 strippedDangerousRules 里。用户可以看到'你的这条规则因为策略限制被移除了'。这比无声失败好得多——用户不会困惑'为什么我配了但没生效',管理员也能审计哪些用户试图绕过安全策略。
模块架构图
types/permissions.ts400 LOC权限类型定义:PermissionMode、PermissionBehavior 等
utils/permissions/permissions.ts600 LOC权限检查核心逻辑
utils/permissions/permissionSetup.ts300 LOC权限上下文初始化
utils/permissions/permissionExplainer.ts200 LOC权限解释(用户可读)
hooks/useCanUseTool.tsx1,500 LOC权限检查 React Hook(40K)
关键代码
深入解析
权限系统是 Claude Code 最重要的安全机制,防止 AI 执行危险操作(如 rm -rf, git push --force)。每次 AI 请求调用工具时,都要经过权限检查。
auto 模式使用 2 阶段分类器:Stage 1(fast)用极少的 Token(最多 64 个)快速判断,如果判断为'允许'就直接放行;如果判断为'阻止',再进入 Stage 2(thinking)进行深度推理,减少误判。这个设计在安全性和延迟之间找到了精妙的平衡。
Stage 1 和 Stage 2 共享相同的系统提示词和用户内容,所以 Stage 2 可以命中 Stage 1 的 prompt cache(1 小时 TTL),几乎不增加额外的 API 成本。
安全工具免检通道:Read、Grep、Glob 等只读工具被放在 SAFE_YOLO_ALLOWLISTED_TOOLS 白名单中,完全跳过分类器调用。这每次节省一次 API 请求(~500ms 延迟 + 费用),对频繁调用的搜索工具影响巨大。
危险权限(如 bypassPermissions)在某些环境下会被自动剥离。被剥离的规则不是简单删除,而是移动到 strippedDangerousRules 字段,留有审计记录。
权限规则支持 MCP 服务器级前缀匹配:mcp__github 可以匹配来自 github 服务器的所有工具,mcp__github__* 是通配符写法。管理员可以一条规则禁用整个 MCP 服务器。
每个权限决策都包含详细的来源信息(来自哪个设置文件的哪条规则),方便用户追溯'为什么这个操作被允许/拒绝了'。
分类器使用 XML 格式的输出(<block>yes/no</block><reason>...</reason>),解析时会先剥离 <thinking> 标签内容,避免推理过程中的'yes'/'no'字样被误判为最终结论。
带自适应思考(adaptive thinking)的新模型需要特殊处理:不能简单地设置 thinking: false,而是给额外的 max_tokens 预算让模型自由使用思考能力。