配了三年 AI coding,今天才发现 Auto Mode 在跑 CI 时从来不安全——Claude Code 2.1.257 把云端凭证窃取这条后路彻底堵了
Claude Code 的 Auto Mode 设计初衷是减少审批疲劳: classifier 帮你判断哪些操作可以放行,哪些需要拦下来问一句。但9月1日 v2.1.257 打了一个标签为”Containment Escape”的补丁,堵上的不是边边角角——是云端 AI coding 在 CI 里跑 Auto Mode 的整个信任假设。
攻击链长什么样
云环境里跑 AI agent,有一个动作看起来完全正常:查云端 metadata 服务。AWS 的 169.254.169.254、GCP 的元数据端点,都是标准基础设施。Claude Code 在工作目录里读写文件、提交代码,都需要权限——但 agent 跑去读云 metadata,在旧版本 Auto Mode 里会被静默放行。
这个端点的返回内容包含临时凭证。拿到它,攻击者理论上可以横向移动到同一租户下的其他资源。容器逃逸的标准第一步,就是查 metadata。整个攻击链安静地发生在 Auto Mode 的后台,classifier 没有标记,审批流没有弹窗。
v2.1.257 之前的 Auto Mode,对这类请求是”环境预期行为”直接放行。你以为 CI 里跑 Auto Mode 很安全——它确实不会让你删生产数据库,但它从来没拦过这一步。
Containment Escape 规则怎么堵
2.1.257 在 auto mode 的 classifier 逻辑里加了一条新规则,名字就叫 Containment Escape。它把三件事从”默认放行”踢到了”需要环境显式声明”:
云端 metadata 凭证获取 — 查 AWS/GCP/Azure metadata 端点
出口绕过(egress evasion) — 检测到网络请求试图绕过代理或防火墙配置
跨租户访问(cross-tenant reach) — 请求的目标地址和当前 session 的信任域不匹配
除非你明确在环境变量或 settings 里声明”这个 session 本来就应该访问这些端点”,否则 classifier 会拦下来。
对应的环境变量标记方式:
# 声明这个 CI session 预期行为
export CLAUDE_AUTO_MODE_EXPECTED="cloud-metadata,internal-apis"
或者在 settings.json 里声明 trust boundary:
{
"autoMode": {
"environment": [
"Cloud APIs: api.internal.example.com",
"CI metadata service: 169.254.169.254"
]
}
}
blockReadsOutsideWorkingDirectories:工作目录外的文件读取
除了网络请求,v2.1.257 还堵了另一条缝:读工作目录外的文件。
Auto Mode 以前默认可以读你整个 home 目录——包括 ~/.aws/credentials、~/.ssh/id_rsa。你可能以为沙箱在保护你,但沙箱只管 Bash 命令,Read 工具走的是另一套逻辑。
2.1.257 第一次读工作目录外的文件时,会弹一个一次性确认:
“即将读取工作目录外的文件,是否继续?”
如果你点了”禁止”,后续同类读取会被直接拒绝。这个选择通过 permissions.blockReadsOutsideWorkingDirectories: true 持久化到 settings,之后同类读取不再弹窗直接拦截。
{
"permissions": {
"blockReadsOutsideWorkingDirectories": true
}
}
这条规则在跑 untrusted repo 或多人共享 CI runner 时特别重要——你不想你的 agent 去读隔壁项目的 .env。
同批还有哪些安全修复
2.1.257 修了 12 个 permission/sandbox/auto mode 的漏洞,是 8 月以来的第四个密集安全包:
沙箱绕过 — example.com.(带尾点)本来不会触发 deny 规则,修掉了
插件路径穿越 — marketplace 插件通过 symlink 可以读插件目录外的文件,现在直接拒绝
复合命令绕过 — && 和子 shell 里的命令会跳过 permissions.ask 规则,现在修了
zsh 条件判断自动放行 — [[ ]] 条件在 zsh 里解析行为和 bash 不同,旧版会静默通过,现在触发审批提示
项目 settings 强制 bypass — 一个 committed 到 repo 的 settings 文件可以把整个项目开成 bypass 模式,这个门关上了
三步落地
第一步:确认你受不受影响
# 检查当前 CI 环境是否在跑 Auto Mode
claude auto-mode config | grep defaultMode
# 如果是 auto,说明你可能依赖了旧的信任假设
第二步:审计你的 trust boundary
在 settings 里补声明,明确哪些端点是你的 agent 预期要访问的:
{
"autoMode": {
"environment": [
"npm registry: registry.npmjs.org",
"GitHub API: api.github.com",
"内部 CI metadata(如果你的 runner 需要)"
]
}
}
如果 CI 里根本不需要 metadata 访问,不声明就行了——不声明 = Containment Escape 默认拦。
第三步:开启 blockReadsOutsideWorkingDirectories
在共享 runner 或跑 untrusted repo 的场景下,加这一行:
{
"permissions": {
"blockReadsOutsideWorkingDirectories": true
}
}
这件事为什么重要
Auto Mode 是 Claude Code 最被推荐给团队的特性,因为它让 AI 在长任务里自己跑下去不用你盯着。但”自己跑下去”的前提是它对危险操作有足够的判断力——而 2.1.257 之前,这个判断力在云端 metadata 这一步是空白的。
Containment Escape 不只是修了一个 bug。它重新划了 Auto Mode 的安全边界:credential 读取不再是无条件放行,网络请求不再默认信任,跨租户访问不再被当作正常工作流。
如果你在 CI 里跑 Auto Mode,这件事值得立刻检查你的 settings——不是因为你被攻击了,而是因为你从来没意识到这个口子存在过。
搜索来源
- yet-another-changelog.ai(2.1.257 安全修复完整解析)
- claude-news.today(Daily Briefing 2026-09-02)
- ai-tldr.dev(Containment Escape 技术细节)
- worldprogramming.org(沙箱机制深度拆解)
- vividkit.dev(Permission Modes 官方对照)
评论区
登录后可评论。