Claude Code 实现了一套 12 步决策管道,结合 5 种权限模式、规则列表、AI 分类器和沙箱机制,精细控制每次工具调用。
检查 alwaysDenyRules 中是否存在整个工具名称(如 Bash)的拒绝规则。
检查 alwaysAskRules 中是否有整个工具的规则。若有且不可沙箱化,强制弹出确认框。
调用工具实现中的 checkPermissions(input, context) 方法,工具可自定义额外权限检查逻辑。
若 checkPermissions 返回 deny 决策,立即中止,不再继续后续检查。
→ 返回 DENY若工具声明 requiresUserInteraction(),即使在 bypassPermissions 模式下也必须弹出确认(免疫绕过)。
检查是否有针对特定内容的 Ask 规则,如 Bash(npm publish:*)。若匹配,强制确认(免疫绕过)。
硬编码的安全保护路径:.git/、.claude/、shell 配置文件(.bashrc/.zshrc等)的写操作强制确认(免疫绕过)。
若当前权限模式为 bypassPermissions,且未被上述免疫保护拦截,自动放行。
检查 alwaysAllowRules 是否包含整个工具名称(无内容约束),若是则自动放行。
检查 alwaysAllowRules 中带内容模式的规则,如 Bash(git status:*),匹配则自动放行。
若工具未返回明确的 allow/deny,将其视为"需要询问",进入 useCanUseTool.tsx 的交互流程。
→ 返回 ASK弹出交互式确认框,记录用户决策,支持"记住此选择"将规则写入 alwaysAllowRules / alwaysDenyRules。
匹配时跳过用户确认,直接执行。
示例:
Bash — 允许所有 Bash 命令Bash(git status:*) — 只允许 git statusRead — 允许所有文件读取Edit(/src/**:*) — 允许 src 下所有编辑匹配时立即拒绝,模型无法绕过(除 bypassPermissions 模式下的非免疫检查)。
示例:
Bash(rm -rf:*) — 禁止删除命令Bash(npm publish:*) — 禁止发包WebSearch — 完全禁用搜索即使在 bypassPermissions 模式下也会强制弹出确认框(免疫绕过)。用于高风险但需要用户知情的操作。
示例:
Bash(git push:*) — 所有 push 需确认Bash(curl * | bash:*) — 管道执行需确认任一触发 → 自动降级到交互式弹窗,避免 Agent 被无限循环拒绝卡死。
以下检查在所有模式下都强制执行,包括 bypassPermissions:
通过 SandboxManager 检测是否启用沙箱。若命令在沙箱中执行且 autoAllowBashIfSandboxed 开启,ask-rule 会被自动升级为 allow。
排除条件:dangerouslyDisableSandbox=true + 策略允许,或命令在排除列表中。
异步子 Agent 无法显示确认框,因此:
权限检查前后支持外部 hooks:
pre-tool-use:工具调用前,可修改输入或阻止post-tool-use:工具完成后,可检查输出user-prompt-submit:用户提交前处理Plan 模式下,Claude 首先生成完整计划(仅读操作可执行),用户审查后一次性批准所有待执行操作。批准后切换为 acceptEdits 模式执行。大型任务时默认使用 Claude Opus(超 200k token 时自动切换)。