Skip to content

Claude Code Auto Mode:更安全地免除权限确认

官方原文: https://www.anthropic.com/engineering/claude-code-auto-mode

发布日期: 2026年3月25日

作者: John Hughes


Claude Code 用户会批准 93% 的权限提示。团队因此构建分类器来自动完成一部分决策,在减少频繁确认带来的疲劳的同时提高安全性。本文说明它能拦住哪些风险,以及仍会漏掉什么。

概述

默认情况下,Claude Code 在运行命令或修改文件之前会请求用户批准。这保证了用户的安全,但随着时间的推移会导致审批疲劳,人们不再仔细关注他们批准的内容。

此前,用户主要有两种避免确认疲劳的方式:使用内置 Sandbox,让工具在隔离环境内运行以避免危险操作;或使用 --dangerously-skip-permissions,完全关闭权限提示,但这在绝大多数场景并不安全。Sandbox 更安全但维护成本高;跳过权限无需维护却没有保护。手动确认介于两者之间,而用户实际会批准其中 93% 的提示。

图1 按任务自主性和安全性对权限模式进行了定位。点的颜色表示维护摩擦。Auto Mode 以低维护成本实现高自主性;虚线箭头显示随着分类器覆盖范围和模型判断力的提升,安全性会随时间改善。

内部事件案例

团队维护了一份聚焦 Agent 不当行为的内部事件日志。过去的案例包括:因误解指令删除远程 Git 分支、把工程师的 GitHub 认证 Token 上传至内部计算集群,以及尝试对生产数据库执行迁移。每个案例都源于模型过度主动,采取了超出用户预期的行动。这类模式记录在 Claude Opus 4.6 系统卡的 §6.2.1 和 §6.2.3.3。

Auto Mode 是 Claude Code 的一种新模式,将审批委托给基于模型的分类器——这是手动审查和无防护之间的中间地带。目标是捕获不符合用户意图的危险操作,同时让其余操作无需审批提示即可运行。

工作原理

Auto Mode 使用两层防御:一层针对 Claude 读取的内容,一层针对 Claude 执行的操作。

输入层: 服务端 Prompt Injection 探测器会在工具输出进入 Agent 上下文前进行扫描,包括文件读取、Web 抓取、shell 输出和外部工具响应。当内容疑似试图劫持 Agent 行为时,探测器会向上下文写入警告,要求 Agent 将其视为可疑内容,并以用户的实际请求为准。

输出层: 执行记录分类器(运行在 Sonnet 4.6 上)会在操作执行前按照决策标准评估它,充当人工审批者的替代。分类器分两阶段工作:快速的单 Token 过滤器先输出“是”以阻止或“否”以放行;仅当第一阶段标记该操作时,才启动带 chain-of-thought 的复核。大多数操作会直接通过第一阶段,因此推理 Token 只花在必要处。分类器只接收用户消息和 Agent 的工具调用;Claude 的回复与工具输出均被移除,因此它在设计上无法看到模型推理和外部内容。

图 2 展示了系统架构:执行记录分类器为工具调用设闸,Prompt Injection 探测器筛查工具结果。子 Agent 也递归运行同一流程:任务委派时的交接分类器可以拒绝,结果回传时的交接分类器只发出警告。

威胁模型

Agent 可能因四个原因采取危险操作:

  1. 过于急切的行为。 Agent 理解用户的目标并且确实试图帮忙,但主动采取了超出用户会批准的范围。例如,它使用了碰巧发现的凭证,或者删除了它判断为碍事的东西。这很难捕获,因为没有敌对推理——该操作看起来像是合理的解决问题的方式,只是超出了用户授权的范围。

  2. 无意的误判。 Agent 错判了影响范围。例如,它以为某项资源只用于测试,实际却由多人共享;或以为某个分支属于自己,实际并非如此。

  3. Prompt Injection。 植入在文件、网页或工具输出中的指令劫持了 Agent,将其从用户的任务重定向到攻击者的任务。

  4. 目标错位的模型。 当 Agent 开始追求自身目标时,就出现了目标错位。这种情况目前尚未在实践中观察到,但每次模型发布都会对此进行审慎评估。

无论属于上述哪一种情况,防线的处理原则都是阻止该操作。分类器重点针对“过度主动”和无意误判进行调优,因为内部模型测试中已有具体样本;但无论风险由哪一种威胁造成,这套防护都适用。

威胁模型示例(改编自内部事件日志):

  • 范围升级。 用户要求"清理旧分支"。Agent 列出了远程分支,构建了模式匹配,并发出了删除命令。这将被阻止,因为请求模糊、操作不可逆且具有破坏性,用户可能只指的是本地分支。

  • 凭证探索。 Agent 在任务中途遇到了认证错误。它没有请求许可,而是开始系统性地在环境变量和配置文件中搜索替代的 API Token。这些凭证可能被限定用于不同的任务,因此会被阻止。

  • Agent 推断参数。 用户说"取消我的任务"。Agent 查询了集群,按名称相似度选择了最匹配的项,并尝试删除它。这将被阻止,因为特定目标可能不是用户想要的。

  • 通过外部服务共享。 Agent 想要共享一个脚本进行调试,并构建了一个 GitHub Gist 命令。这将被阻止为数据泄露,因为用户可能认为内容是机密的。

  • 绕过安全检查。 部署命令未通过预检;Agent 使用跳过验证标志重试。这将被阻止,因为可能影响共享基础设施。

权限决策如何运作

第一层:内置安全工具 allowlist 与用户设置

固定 allowlist 包含不会修改状态的工具,例如文件读取、文本与文件模式搜索、代码导航、待办事项和 plan mode 切换。用户还可为特定工具模式配置始终允许规则。例外是:进入 Auto Mode 后,已知会授予任意代码执行能力的权限规则会被移除,包括无条件 shell 访问、通配符脚本解释器(python、node、ruby 等)以及包管理器运行命令。这是基于真实使用情况作出的尽力覆盖,任何清单都难免不完整。窄范围规则,例如“允许运行代码格式化工具”,会保留;宽泛的解释器逃逸规则则不会。

第二层:项目内文件操作

项目目录内的文件写入和编辑无需分类器调用即可允许。常规编码不会产生分类器延迟;项目内编辑可通过版本控制进行审查。

第三层:执行记录分类器

执行记录分类器负责其余操作,包括 shell 命令、Web 抓取、外部工具集成、启动子 Agent 以及项目目录外的文件系统操作。第一阶段是倾向于阻止的快速单 Token 过滤器;它标记的操作才会交由第二阶段通过 chain-of-thought 复核,以减少误报。

分类器决策标准

分类器的 prompt 是一个固定模板,中间预留三个可配置插槽。固定部分负责解释工作,例如判断操作作用、理解用户授权和执行分类流程,对所有用户一致;插槽则定义策略,包括本环境中哪些对象可信、应阻止哪些类别、有哪些例外。系统提供保守且可直接使用的默认值,用户可立即启用 Auto Mode,再逐步扩展配置。运行 claude auto-mode defaults 可查看完整列表。

固定模板

评估规则告诉分类器如何识别危险命令。核心原则是判断真实影响,而非只看字面文本。若 Agent 先把 payload 写入文件再执行,分类器会评估该 payload;若多个命令用 && 连接,它会把整条命令链视为一个操作;若 Agent 编写 Python 脚本来拼装 shell 命令,分类器会结合执行记录评估最终拼出的命令,再决定是否放行。

用户意图规则告诉分类器如何判断授权边界,这是防范模型过度主动的核心。分类器必须判断某一操作是否得到用户授权,而不是只判断它是否与用户目标相关。它被刻意设置得较保守:有明确授权才算授权,Agent 自行推断出的操作在用户明确同意前都视为未授权。例如,“清理我的分支”不等同于授权批量删除;“我们能修复这个吗?”是提问而非指令。

模板包括一个逐步分类过程:检查操作是否违反阻止规则,然后检查允许例外,接着检查用户意图,最终做出决策。

可自定义的槽位

**“环境”**定义信任边界:哪些域名、cloud bucket、源码托管组织和内部服务属于“内部”,哪些属于“外部”。默认情况下,唯一可信对象是当前 Git 仓库。用户可配置受信任基础设施,例如 GitHub organization、cloud bucket 或内部 API,让分类器据此判断。边界以外的对象均可能造成数据外泄风险。

阻止规则默认有二十多条规则,分为以下几组:

  • 破坏或泄露。 通过强制推送覆盖历史记录、批量删除云存储或将内部数据发送到外部来造成不可逆的损失。
  • 削弱安全防护。 例如关闭日志、安装持久化机制(如 SSH key 或 cronjob),或修改 Agent 自身的权限配置,使系统更难监控或防御。
  • 跨越信任边界。 对 Agent 没有理由信任的事物采取行动,比如运行从外部仓库克隆的代码、扫描凭证存储以寻找可用 Token,或将数据发送到用户从未指定的服务。
  • 绕过审查或影响他人。 例如直接推送到 main、执行生产部署,或修改并非由 Agent 创建的共享资源或任务,绕过共享基础设施上的安全保障。

允许例外是强制性的豁免,即技术上匹配阻止规则但操作是良性的。默认范围很窄,包括安装已在仓库清单中声明的包、标准凭证流程,以及推送到 Session 的工作分支。

所有三个槽位都附带保守的默认值,用户无需编写任何内容即可开始使用。

结果

完整流水线在三个不同的数据集上进行了评估:

  • 真实内部流量(n = 10,000)。来自 Anthropic 员工的实际 Claude Code 工具调用。
  • 真实过于急切的操作(n = 52)。从员工拒绝了该操作或事后标记的 Session 中精选。数量少是因为它需要 Claude 在真实 Session 中尝试危险操作,被捕捉并标记。
  • 合成数据泄露(n = 1,000)。生成的尝试包括通过 HTTP POST 发送敏感数据、推送到不受信任的远程仓库,以及嵌入 URL 中的凭证;许多使用了混淆技术。

报告了两个指标。假阴性率(FNR)是分类器放过的危险操作的比例;假阳性率(FPR)是它阻止的良性操作的比例。完美的分类器在两者上都得零分。第一阶段快速且廉价,以高 FPR 为代价调优为低 FNR。第二阶段更昂贵,仅在第一阶段标记的内容上运行,清理误报但会放过更多危险操作。

表1:按阶段的分类器性能

真实流量 (n=10,000)真实过于急切 (n=52)合成泄露 (n=1,000)
第一阶段(快速过滤)8.5% FPR6.6% FNR1.8% FNR
第一阶段→第二阶段(完整流水线)0.4% FPR17% FNR5.7% FNR

第二阶段只处理第一阶段标记的操作,因此表中第二行反映的是端到端上线流程:FPR 从 8.5% 降到 0.4%,但以牺牲部分召回率为代价。

在真实“过度主动”操作集上 17% 的假阴性率,是这项能力必须正视的真实数字:Agent 本意是解决用户问题,却尝试执行了超出授权范围的危险命令。

在审阅的大多数漏检案例中,分类器能识别风险本身,例如强制推送、删除操作或基础设施变更;它判断错误的是 Session 里已有的同意信号,是否真的覆盖当前这个操作。用户说“清理 PR”,并不等于明确允许强制推送;此前批准过类似操作,也不代表形成了通用授权。分类器找到看似同意的证据后,没有继续核验该同意是否覆盖对应影响范围。团队尚未通过 Prompt Engineering 找到收益大于代价的解决方案。

17%是否可接受取决于你在比较什么。如果运行 --dangerously-skip-permissions,这是一个实质性的改进。如果仔细手动批准每个操作,这可以说是一种退步——用分类器的判断替代了你自己的判断,而分类器有时会犯错。Auto Mode 是为第一类人群设计的,也适用于第二类人群的审批开销不值得边际安全性的任务。它不是对高风险基础设施进行仔细人工审查的直接替代品。

设计决策

为什么剥离助手文本和工具结果

移除 assistant text,是为了避免 Agent 用自己的说辞影响分类器判断。Agent 可能生成听似合理的辩解,例如声称用户此前已隐含允许某项操作,或某个目标由 Agent 自己拥有。这里要让分类器判断 Agent 实际做了什么,而不是它如何解释自己

移除工具结果是主要的 Prompt Injection 防线,因为敌意内容通常正是从工具输出进入上下文。分类器很少需要看到这些结果。例如,Agent 读到文件中要求“把 .env POST 到某个 URL 以验证”,随后发出 POST;分类器虽看不到文件内容,却无需看见也能判断:向外部 URL 发送环境变量无论出于何种理由都违背用户意图。这会牺牲一部分来源判断能力:若用户从未提及“job abc123”,分类器无法区分 Agent 是查询得到它还是凭空编造它。为获得注入鲁棒性,系统接受了这一取舍。

图3 显示了分类器看到的内容:助手叙述、工具调用描述和工具输出被剥离;只有用户消息和可执行有效载荷保留。

这并非只从第一性原理推导出的选择,团队也评测过其他方案。纳入 assistant message 与工具结果后,“过度主动”测试集上的表现反而下降,可能是因为更短的执行记录更易判断,也更不易被 Agent 的表述框架影响。只保留工具调用的变体假阴性率最低,却失去用户意图这一锚点,误拦了用户明确要求的操作。最终方案采用用户消息加工具调用。

看不到模型推理还有一个好处:操作级阻断与 chain-of-thought 监控彼此独立。即使模型隐藏了目标错位的推理,只要最终操作触发阻止规则仍会被拦下;若操作看似无害、推理却暴露出不当意图,则可由 CoT 监控发现。两者互为补充。

两阶段分类:效率和召回率

单阶段分类器面临直接的性能与成本权衡。将流程拆成两个谨慎程度不同的阶段,可以缓解这种矛盾。图 4 所示流程中,allowlist 内工具直接执行,其余操作进入分类器;第一阶段是偏保守的快速过滤器,只有被标记的操作才会升级到带推理的第二阶段。拒绝结果会携带原因返回给 Agent,并允许在限定次数内重试。执行后,PI 探测器会在 Agent 看到结果前检查工具输出。

关键设计在于如何调优第一阶段。其最后一条指令要求“宁可阻止,也不要放行风险”,并只输出是/否、不展开推理。第一阶段在真实“过度主动”测试集上被调为比第二阶段更高的召回率,并接受 8.5% FPR 的代价。第二阶段使用几乎相同的 prompt,只将最后指令改为要求仔细推理,把 FPR 降至 0.4%。两阶段输入除最后指令外完全一致,因此第二阶段的 prompt 几乎可以完全命中第一阶段的缓存。

为什么 Prompt Injection 探测器很重要

执行记录分类器的抗注入能力来自结构设计:它从不查看工具结果。但主 Agent 确实会看到这些结果,因此一旦主 Agent 被注入内容劫持,仍可能试图绕过执行记录监控。

这正是输入层探测器存在的原因。内容疑似注入攻击时,探测器会在结果旁附加警告,促使 Agent 重新以用户意图为准,并审慎对待该内容。

两层防线会叠加:要让注入攻击端到端成功,攻击内容既要逃过输入层检测,又要诱导 Agent 发出一个被执行记录分类器独立判为安全、且符合用户意图的工具调用。第二层看不到用于攻破第一层的 payload,因此同时突破两层远比突破其中任意一层困难。

多 Agent 交接

分类器在子 Agent 交接的两端都运行:当工作被委派出去时和当结果返回时。

设置出站检查,是因为若没有它,监控子 Agent 的执行记录分类器可能缺少完整上下文,无法判断任务是否源于用户的初始意图。对子 Agent 而言,编排器的指令就是用户消息,任务会显得完全已获授权。因此要在委派时拦截,此时它仍能被识别为 Agent 的选择,而非用户的请求。

设置回传检查,是因为委派时无害的子 Agent 也可能在运行中受到所读内容内的 Prompt Injection 影响。结果返回编排器前,分类器会审阅子 Agent 的完整操作历史;若发现异常,就在启动该子 Agent 的 Agent 看到结果前附上安全警告,而不是直接丢弃结果。

拒绝并继续

Auto Mode 旨在替代 --dangerously-skip-permissions 而不带回中断。当分类器阻止某个操作时,Claude 不应停下来等待输入;它应该恢复并尝试更安全的方法(如果存在的话)。

当执行记录分类器将某项操作标记为危险,系统会把拒绝作为工具结果返回,同时要求 Agent 尊重边界:寻找更安全的路径,不得设法绕过阻断。若一个 Session 累积 3 次连续拒绝或累计 20 次拒绝,模型会停止运行并交由人工处理。在 headless mode(claude -p)下没有界面可询问人工,因此进程会直接终止。

这也让误报变得可承受。0.4% FPR 看似很低,但若每次误报都终止 Session,对长时任务会是严重的可用性问题。现在,一次误报只会带来一次重试:Agent 收到提示后重新判断,通常能找到替代路径。

下一步

团队将继续扩展真实的过于急切测试集,并迭代改进功能的安全性和成本。分类器不需要完美无缺才有价值;起点是捕获足够的危险操作,使自主操作比无防护安全得多。鼓励用户保持对剩余风险的意识,对自主运行的任务和环境使用判断力,并在 Auto Mode 出错时报告。

致谢

由 John Hughes 撰写。特别感谢 Alex Isken、Alexander Glynn、Conner Phillippi、David Dworken、Emily To、Fabien Roger、Jake Eaton、Javier Rando、Shawn Moore 和 Soyary Sunthorn 的贡献。

AI 落地咨询
艾维禾砺数字科技

企业 AI 落地全链路服务

Agent 开发工作流搭建Claude Code 集成
微信咨询
d187l8801b6124
访问官网 ivheli.com