Claude Code Auto Mode 安全机制
背景问题
Claude Code 默认在运行命令或修改文件前会请求用户批准。这虽然保证了安全,但也带来了"审批疲劳"——用户逐渐不再仔细审视每次审批内容。
现有解决方案:
- 沙箱模式:安全但高维护成本,新能力需要单独配置,依赖网络或主机访问的能力会破坏隔离
- --dangerously-skip-permissions:零维护但无保护
Auto Mode 是介于人工审批和完全无护栏之间的新模式,将审批权委托给基于模型的分类器。
安全威胁模型
Agent 可能因四种原因采取危险操作:
- 过度积极行为:理解用户目标,但采取的行动超出了用户授权范围(如发现凭据后直接使用)
- 无心之失:Agent 误解了影响范围(如以为资源是测试用的,实际是共享的)
- 提示词注入:文件中植入的指令劫持 Agent 行为
- 模型对齐问题:Agent 追求自身目标(目前实践中未观察到)
工作原理
Auto Mode 采用两层防御:
输入层:提示词注入检测
服务端的 prompt-injection probe 扫描工具输出(文件读取、网页获取、shell 输出),发现内容可疑时注入警告,让 Agent 锚定在用户真实意图上。
输出层:转录分类器
- 运行在 Sonnet 4.6 上
- 在每个工具调用执行前评估操作
- 两阶段设计:
- Stage 1:快速单 token 过滤器(yes 表示阻止,no 表示允许)
- Stage 2:仅当 Stage 1 标记时才进行链式思维推理
- 分类器只看到用户消息和 Agent 的工具调用,Claude 自身的消息和工具输出被剥离(reasoning-blind 设计)
权限决策三层架构
Tier 1: 内置安全工具白名单 + 用户设置
└── 只读工具(文件读取、搜索、代码导航)
└── 进入 Auto Mode 时丢弃已知的任意代码执行权限规则
Tier 2: 项目内文件操作
└── 项目目录内的文件写入/编辑无需分类器调用
Tier 3: 转录分类器(真正的决策层)
└── shell 命令、外部工具集成、子 Agent 启动、目录外文件系统操作分类器决策标准
固定模板
- 评估规则:评估操作的现实影响,而非仅看调用文本表面
- 用户意图规则:判断操作是否经过用户授权,分类器故意保守——Agent 自己选择的操作都未经授权
可定制槽位
环境(Environment):定义信任边界(哪些域名、哪些 GitHub org、哪些内部服务属于"内部")
阻止规则(Block Rules):
- 销毁或泄露:强制推送、批量删除云存储、向外发送内部数据
- 降低安全态势:禁用日志、安装持久化(SSH key、cronjob)
- 跨信任边界:在外部 repo 上运行代码、扫描凭据存储
- 绕过审查或影响他人:直接推送到 main、跳过验证标志
允许例外(Allow Exceptions):阻止规则技术上匹配但实际无害的情况(如安装已声明的包)
评估结果
| 数据集 | Stage 1 FPR | Stage 1 FNR | Stage 1→2 FPR | Stage 1→2 FNR |
|---|---|---|---|---|
| 真实流量 (n=10,000) | 8.5% | — | 0.4% | — |
| 真实过度行为 (n=52) | — | 6.6% | — | 17% |
| 合成数据泄露 (n=1,000) | — | 1.8% | — | 5.7% |
17% 的假阴性率主要原因是:分类器正确识别了危险操作,但判断错了用户是否真的授权了该操作。
关键设计决策
为什么剥离 Assistant 文本和工具结果
- 防止 Agent 通过生成的论证说服分类器做出错误判断
- 同时也是主要的提示词注入防御
- 测试表明,包含 Assistant 消息时过度行为测试集性能下降
两阶段分类的效率权衡
- Stage 1 调优为高召回率,接受 8.5% FPR 作为代价
- Stage 2 保持相同输入,仅改变最终指令要求仔细推理
- 由于输入相同,Stage 2 几乎完全复用 Stage 1 的缓存
多 Agent handoff
- 派出时检查:防止子 Agent 看起来像是完全授权的任务
- 返回时检查:防止子 Agent 在运行中被提示词注入攻击
Deny-and-Continue
- 阻止操作时返回工具结果 + 重试指令,Agent 寻找更安全的路径
- 连续 3 次或累计 20 次阻止后终止并升级给人类
- 这使假阳性可容忍:0.4% FPR 的误判只产生一次重试
核心要点
- Auto Mode 不是完全没有风险,而是显著优于
--dangerously-skip-permissions - 不适合作为高风险基础设施上人工仔细审查的直接替代
- 用户应关注残留风险,对哪些任务和环境自主运行做出判断