Chapter 04
权限与安全
Claude Code 使用多层权限架构来控制工具执行 — 从 6 种权限模式到 LLM 分类器自动审批,再到危险命令检测。
6 种权限模式
权限模式决定了工具调用的默认处理方式:
default
每个工具调用都需要用户明确批准。最安全的模式,适合首次使用或敏感操作。
plan
执行前需要审批整体计划。进入 Plan Mode 后,工具调用暂停直到计划被批准。
acceptEdits
自动批准文件编辑操作(FileWrite, FileEdit),其他工具仍需确认。
bypassPermissions
WARNING: 自动批准所有工具调用。危险模式,跳过所有权限检查。
auto
LLM 分类器驱动的自动审批。模型推理判断命令安全性,高置信度自动通过。
dontAsk
自动拒绝所有未预批准的调用。用于后台 Agent,避免交互式提示。
7 层规则系统
权限规则来自多个来源,按优先级从高到低排列:
1
flagSettings (最高优先级)
命令行 --allow / --deny 参数。直接在启动时设置。
2
cliArg
初始化设置参数(如首次运行配置)。
3
userSettings
用户配置文件 ~/.claude/settings.json 中的规则。
4
projectSettings
项目配置文件 .claude/settings.json 中的规则。
5
policySettings
组织强制策略(远程管理的规则)。
6
command
运行时 /allow-tool 命令设置的规则。
7
session (最低优先级)
会话级临时规则(用户在权限对话框中的选择)。
每条规则的结构:
interface PermissionRule { source: PermissionRuleSource // 来源 (7 层之一) ruleBehavior: 'allow' | 'deny' | 'ask' ruleValue: { toolName: string // 'Bash', 'Read', 'mcp__server__tool' ruleContent?: string // 可选内容: Bash(prefix:npm), Read(/path) } } // 规则示例 { toolName: 'Bash', ruleContent: 'prefix:npm' } // npm 开头的命令 { toolName: 'Read', ruleContent: '/home/user/src' } // 特定目录 { toolName: 'mcp__github__*' } // MCP server 通配
权限检查流程
每次工具调用都经过 hasPermissionsToUseTool() 的完整检查链:
1. Deny Rules — 匹配任何 deny 规则? → 立即拒绝
↓
2. Allow Rules — 匹配任何 allow 规则? → 立即通过
↓
3. Ask Rules — 匹配 ask 规则? → 进入提示队列
↓
4. LLM Classifier — (auto 模式) 模型推理判断安全性
↓
5. Hook Check — PreToolUse 钩子可以拦截 (exit code 2 = 阻止)
↓
6. Default Fallback — 根据当前权限模式处理 (ask/deny)
LLM 分类器 — 用 AI 判断安全性
这是 Claude Code 最独特的安全机制 — 用一次额外的 LLM 调用来判断工具调用是否安全:
核心思想: 与 Codex CLI 使用 OS 内核级沙箱不同,Claude Code 调用一个轻量级模型来分类命令的危险程度。高置信度安全 → 自动通过;低置信度或危险 → 要求用户确认。
Bash 分类器 (bashClassifier)
- 评估 Bash 命令的危险模式
- 检测:
rm -rf,git push --force,curl | sh等 - 返回置信度等级
- 2 秒超时的推测性检查(Speculative Check)
Auto 模式分类器 (yoloClassifier)
- 使用模型推理评估工具安全性
- 返回决策 + 置信度
- 高置信度 → 在 auto 模式下自动批准
- 低置信度 → 回退到用户提示
// 分类器的推测性检查(2 秒竞速) const classifierResult = await Promise.race([ bashClassifier(command), timeout(2000) // 2 秒超时 ]); if (classifierResult?.confidence === 'high' && classifierResult?.decision === 'safe') { // 自动通过,无需用户确认 return 'allow'; } // 否则回退到用户提示
危险命令检测
系统内置了危险规则检测,防止用户配置过于宽松的允许规则:
Bash 危险规则
isDangerousBashPermission()检测允许任意代码执行的规则- 检测模式:通配符 (
*)、解释器 (python,node)、包管理器 (pip install) - Auto 模式会自动剥离危险规则,强制使用提示
PowerShell 危险规则
isDangerousPowerShellPermission()检测- 检测:
Invoke-Expression,Start-Process,iex等
安全哲学对比:Claude Code vs Codex CLI
| 维度 | Claude Code | Codex CLI |
|---|---|---|
| 实现语言 | TypeScript | Rust (81 crates) |
| 安全模型 | LLM 分类器 + 多层规则 | OS 内核沙箱 (Landlock/Seatbelt) |
| 隔离方式 | 进程级 + Git Worktree | 内核级命名空间隔离 |
| 安全保证 | 概率性(依赖模型判断) | 确定性(依赖 OS 内核) |
| 灵活性 | 高(规则可自定义,模型可理解语义) | 低(系统调用级别的黑白名单) |
| 权限粒度 | 工具级 + 内容匹配 (prefix, path) | 系统调用级 (read/write/exec) |
| 绕过风险 | 存在(Prompt Injection, 模型误判) | 极低(需要 OS 内核漏洞) |
| 额外开销 | 每次审批需要一次 LLM 调用 | 无额外开销(内核原生支持) |
核心差异: 一个用 Rust 写了 81 个 crate,靠操作系统内核来保证安全;另一个用 TypeScript 做了 54 个工具,靠额外调一次 LLM 来判断你的命令危不危险。两种完全不同的安全哲学。