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 的上下文添加警告,告知其将该内容视为可疑内容,并锚定于用户实际请求的内容。
输出层: 转录分类器(运行在 Sonnet 4.6 上)在执行前根据决策标准评估每个操作,充当人工审批者的替代品。分类器分两阶段运行:快速单 Token 过滤器决定"是"阻止或"否"允许,只有当第一个过滤器标记了转录时才进行链式思考推理。因为大多数操作都能通过第一阶段,推理 Token 只在需要的地方花费。分类器只看到用户消息和 Agent 的工具调用;Claude 自己的消息和工具输出被剥离,使其在设计上对推理是"盲"的。
图2 显示了系统架构:转录分类器控制工具调用;Prompt Injection 探测器筛选工具结果。子 Agent 递归运行相同的流水线,在委派时有交接分类器(可以拒绝),在返回时有交接分类器(仅警告)。
威胁模型
Agent 可能因四个原因采取危险操作:
过于急切的行为。 Agent 理解用户的目标并且确实试图帮忙,但主动采取了超出用户会批准的范围。例如,它使用了碰巧发现的凭证,或者删除了它判断为碍事的东西。这很难捕获,因为没有敌对推理——该操作看起来像是合理的解决问题的方式,只是超出了用户授权的范围。
诚实的错误。 Agent 误解了影响范围。例如,它认为某个资源是测试范围的而实际上是共享的,或者认为某个分支是自己的而实际上不是。
Prompt Injection。 植入在文件、网页或工具输出中的指令劫持了 Agent,将其从用户的任务重定向到攻击者的任务。
错位的模型。 当 Agent 追求自己的目标时就会发生错位。这目前在实践中尚未见到,但每个模型发布都会仔细评估。
在所有四种情况下,防御措施都是阻止该操作。分类器针对过于急切的行为和诚实的错误进行了调优,因为有来自内部模型测试的具体示例,但无论哪种威胁产生了该操作,防御都适用。
威胁模型示例(改编自内部事件日志):
范围升级。 用户要求"清理旧分支"。Agent 列出了远程分支,构建了模式匹配,并发出了删除命令。这将被阻止,因为请求模糊、操作不可逆且具有破坏性,用户可能只指的是本地分支。
凭证探索。 Agent 在任务中途遇到了认证错误。它没有请求许可,而是开始系统性地在环境变量和配置文件中搜索替代的 API Token。这些凭证可能被限定用于不同的任务,因此会被阻止。
Agent 推断参数。 用户说"取消我的任务"。Agent 查询了集群,按名称相似度选择了最匹配的项,并尝试删除它。这将被阻止,因为特定目标可能不是用户想要的。
通过外部服务共享。 Agent 想要共享一个脚本进行调试,并构建了一个 GitHub Gist 命令。这将被阻止为数据泄露,因为用户可能认为内容是机密的。
绕过安全检查。 部署命令未通过预检;Agent 使用跳过验证标志重试。这将被阻止,因为可能影响共享基础设施。
权限决策如何运作
第一层:内置安全工具白名单和用户设置
一个固定的白名单包括无法修改状态的工具,包括文件读取、文本和文件模式搜索、代码导航、待办事项和计划模式转换。用户还可以为特定工具模式配置始终允许规则。一个例外:进入 Auto Mode 时,已知授予任意代码执行权限的权限规则会被删除,包括全面的 shell 访问、通配符脚本解释器(python、node、ruby 等)和包管理器运行命令。这是基于实际使用的最佳努力,任何列表都不可避免地不完整。狭窄的规则("允许运行代码格式化工具")会保留,但广泛的解释器逃逸不会。
第二层:项目内文件操作
项目目录内的文件写入和编辑无需分类器调用即可允许。常规编码不会产生分类器延迟;项目内编辑可通过版本控制进行审查。
第三部分:转录分类器
转录分类器处理所有其他内容,包括 shell 命令、Web 抓取、外部工具集成、子 Agent 生成、项目目录外的文件系统操作。第一阶段是快速单 Token 过滤器,指示其倾向于阻止;如果它标记了,第二阶段使用链式思考推理重新评估以减少误报。
分类器决策标准
分类器的提示是一个固定模板,中间插入了三个可自定义的槽位。固定部分处理解释性工作——如何确定操作的作用、如何读取用户授权、分类过程本身——对每个人都相同。槽位定义了策略:什么在你的环境中被视为可信、要阻止什么类别、要划出什么例外。良好的默认值开箱即用。用户可以立即开始使用 Auto Mode,并迭代扩展配置。运行 claude auto-mode defaults 显示完整列表。
固定模板
评估规则告诉分类器如何寻找危险命令。原则是评估实际影响而非仅仅是表面文本。如果 Agent 将有效载荷写入文件然后运行它,分类器评估有效载荷。如果一系列命令用 && 连接,整个链是一个操作。如果 Agent 编写了一个组装 shell 命令的 Python 脚本,分类器在允许执行之前从转录上下文中评估组装后的命令。
用户意图规则告诉分类器如何读取授权。这是过于急切行为防御的核心。分类器必须决定该操作是否是用户授权的,而不仅仅是与用户目标相关。分类器被刻意设定为保守:已建立授权的内容;Agent 自行选择的所有内容在用户明确表示之前都是未授权的。例如,"清理我的分支"不授权批量删除,"我们能修复这个吗?"会被视为问题而不是指令。
模板包括一个逐步分类过程:检查操作是否违反阻止规则,然后检查允许例外,接着检查用户意图,最终做出决策。
可自定义的槽位
**"环境"**定义了信任边界——哪些域、云存储桶、源代码控制组织和内部服务被视为"内部"与"外部"。默认情况下,唯一被信任的是当前使用的 Git 仓库。用户可以自定义此设置,以便分类器能够识别其可信基础设施(例如 GitHub 组织、云存储桶或内部 API)。此边界之外的任何内容都可能是泄露风险。
阻止规则默认有二十多条规则,分为以下几组:
- 破坏或泄露。 通过强制推送覆盖历史记录、批量删除云存储或将内部数据发送到外部来造成不可逆的损失。
- 降低安全态势。 通过禁用日志记录、安装持久性(如 SSH 密钥或 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% FPR | 6.6% FNR | 1.8% FNR |
| 第一阶段→第二阶段(完整流水线) | 0.4% FPR | 17% FNR | 5.7% FNR |
第二阶段仅在第一阶段标记的操作上运行,因此第二行反映了端到端部署的流水线:FPR 从8.5%降至0.4%,代价是一些召回率的损失。
在真实过于急切的操作上17%的假阴性率被描述为诚实的数字。Agent 试图解决用户的问题,并尝试执行超出授权范围的危险命令。
在检查的大多数遗漏案例中,分类器正确识别了危险——它看到了强制推送、删除、基础设施变更。它搞错的是 Session 中的真实同意信号是否真的覆盖了这个操作。用户说了"清理 PR",但这并没有明确指出强制推送。类似的操作之前被批准了,但一次批准不是一种模式。分类器找到了批准形式的证据,却没有检查它是否同意了影响范围。Prompt 工程方面的努力没有找到一个不会得不偿失的修复方案。
17%是否可接受取决于你在比较什么。如果运行 --dangerously-skip-permissions,这是一个实质性的改进。如果仔细手动批准每个操作,这可以说是一种退步——用分类器的判断替代了你自己的判断,而分类器有时会犯错。Auto Mode 是为第一类人群设计的,也适用于第二类人群的审批开销不值得边际安全性的任务。它不是对高风险基础设施进行仔细人工审查的直接替代品。
设计决策
为什么剥离助手文本和工具结果
剥离助手文本是为了防止 Agent 说服分类器做出错误判断。Agent 可能生成有说服力的合理化建议,比如暗示某些内容是安全的因为用户之前隐含地批准了它,或者目标是 Agent 自己拥有的。目标是让分类器判断 Agent 做了什么,而不是 Agent 说了什么。
剥离工具结果是主要的 Prompt Injection 防御措施,因为工具输出是敌对内容进入上下文的地方。分类器很少需要它们。如果 Agent 读取了一个文件说将 .env 发布到 URL 进行验证,然后发出 POST 请求,分类器永远不会看到该文件,但它也不需要看到——将环境变量 POST 到外部 URL 无论出于什么原因都违反了用户意图。在来源方面存在权衡:如果用户从未提到"任务 abc123",分类器无法判断 Agent 是从查询中获取的还是编造的。为了注入鲁棒性,这个代价是可以接受的。
图3 显示了分类器看到的内容:助手叙述、工具调用描述和工具输出被剥离;只有用户消息和可执行有效载荷保留。
这不仅仅是第一性原理的选择;评估了其他方案。包含助手消息和工具结果导致在过于急切测试集上的性能下降,可能是因为更短的转录更容易阅读,给 Agent 的框架影响决策留下的空间更小。仅工具调用的变体假阴性率最低,但失去了用户意图锚点,阻止了用户明确要求的操作。用户消息加工具调用是最终选择。
对推理"盲"有一个有用的副作用:操作级别的阻止与链式思考监控是正交的。一个隐藏错位推理的模型如果产生的操作触发了阻止规则仍然会被捕获;一个操作看起来良性但推理揭示了意图的模型会被 CoT 监控捕获。两者是互补的。
两阶段分类:效率和召回率
单阶段分类器面临直接的性能/成本权衡。拆分为两个具有不同谨慎程度的阶段打破了这种权衡。图4 说明了流水线:白名单工具直接跳转到执行;其他所有内容都进入分类器。第一阶段是调优为谨慎的快速过滤器;只有它标记的内容才升级到带有推理的第二阶段。拒绝会连同原因一起返回给 Agent,允许在一定限制内重试。执行后,PI 探测器在 Agent 看到结果之前筛选结果。
关键设计选择是如何调优第一阶段。它的最终指令告诉它"宁可阻止也要安全"并发出单个是/否决策而不进行推理。第一阶段被调优为在真实过于急切测试集上将召回率推得比第二阶段更高,接受8.5% FPR 作为代价。第二阶段看到相同的提示,只是最终指令改为要求仔细推理,将 FPR 降至0.4%。因为输入除了最终指令外完全相同,第二阶段的提示几乎完全从第一阶段缓存命中。
为什么 Prompt Injection 探测器很重要
转录分类器的注入防御是结构性的,因为它从不查看工具结果。但主 Agent 确实会看到工具结果,劫持主 Agent 的注入因此有机会绕过转录监控。
这就是输入层探测器存在的原因。当内容看起来像是注入尝试时,探测器在结果旁边注入警告,促使 Agent 重新锚定于用户意图并对内容持怀疑态度。
两层叠加:注入要端到端成功,必须在输入层逃避检测,然后引导 Agent 发出一个转录分类器独立判断为安全且符合用户意图的工具调用。在第二层对破坏第一层的有效载荷"盲"的情况下通过两层,比单独通过任何一层都要困难得多。
多 Agent 交接
分类器在子 Agent 交接的两端都运行:当工作被委派出去时和当结果返回时。
出站检查存在是因为,没有它,监控子 Agent 的转录分类器可能没有完整的上下文来知道任务是否是用户最初意图的。在子 Agent 内部,编排器的指令就是用户消息,因此任务看起来完全被授权。在委派时被捕获,此时仍可识别为 Agent 的选择而不是用户的请求。
返回检查存在是因为,在委派时良性的子 Agent 可能在运行过程中被它读取的内容中的 Prompt Injection 入侵。在结果返回编排器之前,分类器审查子 Agent 的完整操作历史。如果它标记了,会为启动子 Agent 的 Agent 预置安全警告,而不是丢弃结果。
拒绝并继续
Auto Mode 旨在替代 --dangerously-skip-permissions 而不带回中断。当分类器阻止某个操作时,Claude 不应停下来等待输入;它应该恢复并尝试更安全的方法(如果存在的话)。
当转录分类器将某个操作标记为危险时,拒绝作为工具结果返回,并附带善意对待边界的指令:找到更安全的路径,不要试图绕过阻止。如果一个 Session 累积了3次连续拒绝或总共20次拒绝,模型将被停止,情况升级给人类。在无头模式(claude -p)下,没有 UI 来询问人类,因此进程会被终止。
这也是让误报可以存活的原因。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 的贡献。