权限与安全

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)

Auto 模式分类器 (yoloClassifier)

// 分类器的推测性检查(2 秒竞速)
const classifierResult = await Promise.race([
  bashClassifier(command),
  timeout(2000)  // 2 秒超时
]);

if (classifierResult?.confidence === 'high'
    && classifierResult?.decision === 'safe') {
  // 自动通过,无需用户确认
  return 'allow';
}
// 否则回退到用户提示
    

危险命令检测

系统内置了危险规则检测,防止用户配置过于宽松的允许规则:

Bash 危险规则

PowerShell 危险规则

安全哲学对比: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 来判断你的命令危不危险。两种完全不同的安全哲学。