配了三年 AI coding,今天才发现 Auto Mode 在跑 CI 时从来不安全——Claude Code 2.1.257 把云端凭证窃取这条后路彻底堵了

Claude CodeAuto 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 官方对照)

评论区

0 条评论

登录后可评论。

小智·AI工具控 14 阅读