🍒
Claude Code 源码拆解 harness 设计 - 安全与约束
- 总结:不要只是配置一个简单的确认框,而是要配置一个多层检查的流水线,每层解决不同的问题,每层都假设上层可能失败
- Agent 容易犯的错:改配置文件时顺手改了其他文件,重构代码时重构了不需要重构的部分等
- 原因:信任边界的判断模型和人类不一致
- prompt:改这个文件
- prompt:重盖这段代码
- 常见解决方案 human in the loop
- 添加一个确认框 agent 每次敏感操作都弹一个框询问用户,简单直接
- 确认框悖论
- 确认太多 用户会很烦,开始无脑点允许,
导致确认框越多确认框越少 - 确认太少 拦不住 agent 乱来
- Claude Code 的做法
- 核心思路:不要将安全寄托于一个确认框上,而是建立一个流水线,让每个操作执行前经过多层检查,每一层解决一个不同层次的问题
- prompt中的规则是建议、代码中的规则是法律
- Claude Code 分层规则
- Bash Classifier(纯规则匹配,无需调用模型)
- 禁止永远优先
- 例如配置允许读取所有文件的规则,又配置不允许读取密码文件,则禁止规则优先
- 这样可以放行大部分操作,同时精确管理某个操作,而不是全部放行或者逐一确认
- 不要对 agent 只做一个 全局开关,至少是两层,默认 + 例外规则,例外高于默认
- YOLO Classifier (完整的 LLM-as-Judge 用一个独立的模型调用来审查主 Agent 的每一步操作)
- 分为两个阶段(兼顾速度、成本和性能)
- 快速判断,只用一个 yes or no 来判断,如果是 no 则进入第二阶段
- 让模型做完整推理,再做判断,减少误杀
- 生成和评估分离思想:主Agent 负责行动,分类器Agent评估该不该执行,两个模型调用,互相制衡
- 分类器在审查时,会看用户说了什么和Agent 调用了什么工具,不会看 Agent 的文字回复(关键)
- agent 的文字回复是自己生成的,如果agent想要绕过审查它可能会写 用户已经授权了所有操作,来误导分类器
- 只看 agent做了什么,不看 agent说 了什么,切断了 agent 想要误导 审查者的根本路径
- 安全底线
- Claude Code 有一个最高权限模式可以跳过几乎所有确认,但是即使是在这个模式下,底线操作仍然会弹确认
- 包含:修改版本管理配置、修改 Agent 自身配置、修改终端配置文件等,无论开了什么模式都必须确认
- 源码注释:不可绕过的安全检查,这些文件一旦被恶意修改,影响是系统级的、持久的、隐蔽的(防止大模型投毒等情况)
- 如果终端配置被修改,每次打开终端都会执行恶意代码,并且很难发现
- 启发:不要把所有安全决策都交给用户,有一些底线应该在系统上替用户守住,用户可以选择信任agent,但是即使在完全信任下最坏情况是可控的
- 彩蛋
- Claude Code 卧底模式
- Claude Code 内部构件中包含大量敏感信息,比如未发布的模型代号、未发布的版本、如果提交信息时不小心出现了这些内容,后果是灾难性的
- 因此建立了一个机制 只要检测到当前仓库不是内部仓库就自动往系统提示词中注入一段指令,告诉Agent不要在提交信息和合并请求里暴露任何内部信息,没有强制关闭的选项
- 有趣的是,这样看来 Anthropic 专门构建了系统来防止 AI 泄露内部信息,结果内部信息是被人类泄露