Claude Code 2.1.223:修复 Gateway 模型发现 Bug,关闭四条权限绕过路径

Claude Code 2.1.223 修复了一个导致带前缀 ID 的 Claude 模型在自定义 API 网关中不可见的 Bug,关闭四条权限绕过路径,并调整了 1M context 模型的 auto-compaction 行为。

TheRouter Newsroom来源 Anthropic Claude Code
网关代理中模型 ID 解析流程示意图

如果你的团队通过自定义 API 网关来路由 Claude Code——无论是 HTTPS 代理、自托管路由器,还是以命名空间 ID 注册模型的云提供商——2.1.223 包含一个你今天就需要部署的修复。本版本同时关闭了四条影响无头部署和托管部署的安全绕过路径。

Gateway 模型发现 Bug

Claude Code 通过查询你在 ANTHROPIC_BASE_URL 中配置的 API 端点来发现可用模型。在 2.1.223 之前,模型选择器会静默丢弃任何匹配 provider 前缀模式的模型 ID:vertex_ai/claude-*bedrock/anthropic.claude-*,以及网关用来区分上游 provider 的类似命名空间 ID。

实际影响:如果你的网关以 provider 命名空间 ID 注册模型(这是多 provider 路由器转发到 Bedrock、Vertex AI 或自定义推理后端时的常见做法),这些模型对 Claude Code 的模型选择器来说是不可见的。用户不会收到模型被隐藏的提示——选择器只是显示了一个更短的列表。仅凭日志,运营商也无法发现这个问题。

2.1.223 中的修复使模型发现逻辑对所有注册的模型 ID 都视为有效,不再过滤前缀,然后单独解析用于会话跟踪的规范模型名称。如果你的网关注册了 vertex_ai/claude-sonnet-5bedrock/anthropic.claude-opus-5,而用户反映模型未出现在列表中——这正是对应的修复。

四条安全绕过路径,已关闭

1. Bash 不可见字符绕过。 精心构造的 shell 命令可以在 token 之间填充制表符或不可见 Unicode 字符,向权限审批对话框隐藏部分命令内容,同时 shell 会完整执行全部内容。在无头运行 Claude Code 的场景下(CI 流水线、自动化编程 Agent、后台 Worker),恶意 prompt 可以指示 Claude 在破坏性操作周围附加不可见字符,从而绕过 auto 模式的检测。

2. 工作流脚本中的 dynamic import() 沙箱逃逸。 在沙箱内执行的工作流脚本可以使用 dynamic import() 从沙箱边界外加载任意 Node.js 模块,从而导入 child_processfs 并执行沙箱本应拒绝的操作。修复方案是在沙箱上下文中屏蔽 dynamic import。

3. Agent 定义中的 bypassPermissions 绕过组织策略。 当 agent 定义设置了 bypassPermissions: true 时,会绕过组织级别明确禁用 bypass-permissions 模式的策略。这是一条权限提升路径:marketplace skill 或共享的 .claude/agents/ 定义可以声明组织管理员明确撤销的提升权限。修复方案是让组织策略强制覆盖 agent 级别的声明。

4. zsh 中 [[ ]] 正则条件的 Bash 绕过。 在 zsh 中,嵌入在 [[ ]] 正则条件表达式中的命令可以执行隐藏操作,而 Bash 工具权限检查器不会检查这些表达式。这允许精心构造的命令通过权限检查,同时在条件分支中执行未列出的代码。

modelOverrides key 处理行为变更

在 2.1.223 之前,modelOverrides 中非 Anthropic model ID 的 key 会被静默地视为会话的规范 model ID,可能导致网关配置的 override 通过路由元数据错误传播。修复方案:未知的 modelOverrides key 现在会被忽略,与文档规范一致,但此前实现并未强制执行。

如果你在 managed settings 中配置了任何非标准 key 的 modelOverrides,请检查——它们将不再生效。

1M context 模型的 auto-compaction 行为变更

CLAUDE_CODE_DISABLE_1M_CONTEXT 此前只针对固定的原生 1M token 窗口模型 ID 列表生效。在 2.1.223 中,该环境变量现在会通过 auto-compaction 将所有原生 1M 窗口的模型限制在 200K token。当会话未被保持在 200K 以内时,启动时会出现警告。

同步的变更:使用未知 model ID(例如网关中注册的自定义模型 ID)的会话,现在也由 auto-compaction 控制在模型的假定 context 窗口内,而不再允许无限增长。退出方式:CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT=1

对于通过代理路由 Claude Code 并分配内部 model ID 的运营商:auto-compaction 现在会对这些 ID 触发,可能改变长会话的 token 用量和账单模式。

Managed-settings 合并修复

服务器下发的 managed settings 更新此前可能禁用本地 managed-settings.json 或 MDM profile 中的 env block。修复方案使服务器下发的设置按 key 合并,而非覆盖本地 env 配置。如果你的部署同时使用组织下发设置和带自定义环境变量的本地 managed settings,请验证升级到 2.1.223 后这些 env 变量仍然保留。

运营商需要审查的内容

  • 模型列表:如果使用网关路由 Claude Code 的用户此前反映模型缺失,升级到 2.1.223 后验证网关中注册的模型 ID 是否出现在选择器中。
  • modelOverrides:检查是否存在非 Anthropic model ID 的 key;它们现在会被忽略。
  • CLAUDE_CODE_DISABLE_1M_CONTEXT:如果依赖此 flag 控制成本,确认它现在对你网关服务的所有 1M 窗口模型都生效。
  • 无头安全状态:本版本的四个权限绕过修复表明权限模型正在积极加固。如果你在 auto/无头模式运行 Claude Code,请尽快升级。
  • Managed settings env 合并:测试本地 managed-settings.json 中的 env 变量在服务器下发 settings 后仍然保留。
帮助与联系