JacquesGariepy/ClaudeCode-Reverse-Engineering

GitHub: JacquesGariepy/ClaudeCode-Reverse-Engineering

对 Anthropic Claude Code v2.1.117 客户端二进制文件进行系统化逆向工程,完整提取并分析了其插件系统、远程控制、OIDC 联合认证、Agent Teams、AFK 模式等核心架构,并识别出多个高危安全漏洞和供应链攻击向量。

Stars: 0 | Forks: 0

# Claude Code v2.1.117 — 深度逆向工程 **分析师:** Jacques Gariepy **日期:** 2026-04-22 **二进制文件:** `C:\Users\jacqu\.local\share\claude\versions\2.1.117` (247,959,712 o) **Git SHA:** `5e9d59ce46d5559e3510d71ef3dc12b5ab1e7387` **先前分析版本:** v2.1.98 (2026-04), v2.1.104 (2026-04-13) ## 0. TL;DR — 关键发现 | # | 发现 | 严重性 | 参考 | |---|---------|----------|--------| | F1 | **无加密签名的插件系统** — `claude-plugins-official` 仓库分支危及全部用户群,无强制 pin 码 | 危急 | §3.1, §10.1 | | F2 | **远程工具批准 (RC)** — 控制手机的攻击者可在不查看终端的情况下批准 Bash/Edit/Write | 高 | §3.2, §10.3 | | F3 | **Windows 缺乏操作系统级沙箱** — macOS = `sandbox-exec`, Linux = `bwrap` + seccomp; Windows = 仅环境变量清洗 + 信任对话框 | 高 | §3.8-sandbox, §10.4 | | F4 | **Datadog 遥测使用硬编码的公开 token** (`pubea5604404508cdd34afb69e6f42a05bc`) + 仅对 `_PROTO_*` 进行有限清洗 | 中 | §3.8-datadog, §10.5 | | F5 | **AFK 模式 — 显式故障开放** : 如果服务器拒绝 `afk-mode-2026-01-31`,客户端丢弃 header 并静默断路 | 中 | §3.5, §10.6 | | F6 | **OIDC 联合 — 完整实现 JWT Bearer + Token Exchange 授权类型** (RFC 7523 + RFC 8693),PRM 发现 (RFC 9728) | 信息 | §3.3 | | F7 | **Advisor 门控 (两个相同的白名单函数)** — `WfH` 和 `Z$8` 根据相同的集合 `{opus-4-7, opus-4-6, sonnet-4-6}` 评估不同的输入 — 存在静默分歧的隐患 | 信息 | §3.6 | | F8 | **42 个工具,而 v2.1.104 中为 29 个** — +13 个新增:TaskCreate/Update/Get/List/Output/Stop, EnterWorktree/ExitWorktree, CronCreate/Delete/List, ScheduleWakeup, SendMessage, PushNotification, AskUserQuestion, REPL, Monitor, RemoteTrigger | 信息 | §5 | **执行摘要 :** v2.1.117 是自这些逆向工程分析开始以来架构上最重大的版本。自 2.1.104 以来的 13 天里,Anthropic 发布了:一个无加密签名的插件市场 (F1)、一个支持枢轴的远程控制 (F2)、符合最新 RFC 的 OIDC 联合 (F6)、一个完整的任务管理器 (F8),以及一个带有故障开放断路器的 AFK 模式 (F5)。Windows 沙箱仍然是最严重的缺失 (F3)。 ## 1. 背景与方法论 ### 1.1 目标二进制文件 | 字段 | 值 | |-------|--------| | 路径 | `C:\Users\jacqu\.local\share\claude\versions\2.1.117` | | 大小 | 247,959,712 字节 (236.5 MB) | | 构建时间戳 | 2026-04-21T17:58:52Z | | Git SHA | `5e9d59ce46d5559e3510d71ef3dc12b5ab1e7387` | | 格式 | PE32+ x86-64 (12 个区段) | | `.bun` 区段偏移 | `0x7533600` (十进制 122,893,824) | | `.bun` 原始大小 | 125,055,488 o (119.3 MB) | | 区段内的 JS Bundle | Bun header (128 o 存档 + 296 o 清单) 后的偏移 +424 | | 受清单限制的 JS 大小 | 13,128,629 o (12.52 MB) | | JSC 字节码 (未解码) | 同一区段内约 106.8 MB | 来源:`EXTRACTION_REPORT.md` §1-§2。 ### 1.2 生成物 | 文件 | 路径 | 大小 | |---------|--------|--------| | `EXTRACTION_REPORT.md` | `E:/tmp/claude_extracted/2.1.117/` | 7,189 o | | `baseline_2.1.104.md` | 同上 | 35,312 o | | `raw/claude-code-v2.1.117.clean.js` | 同上 | 13,128,629 o | | `beautified/cli.beautified.js` | 同上 | 19,339,722 o | | `catalogs/apis_catalog.json` | 同上 | 168,398 o (452 个条目) | | `catalogs/tools_catalog.json` | 同上 | 13,383 o (42 个工具) | | `catalogs/env_vars_catalog.json` | 同上 | 188,603 o (540 个变量) | | `catalogs/beta_headers_catalog.json` | 同上 | 13,463 o (31 个 header) | | `internals/plugin_system.md` | 同上 | 10,647 o | | `internals/remote_control.md` | 同上 | 10,792 o | | `internals/oidc_federation.md` | 同上 | 12,196 o | | `internals/agent_teams_swarm.md` | 同上 | 15,057 o | | `internals/afk_mode.md` | 同上 | 12,317 o | | `internals/advisor_tool.md` | 同上 | 13,702 o | | `diff/apis_diff.md` | 同上 | 13,922 o | | `diff/tools_diff.md` | 同上 | 12,507 o | | `diff/env_vars_diff.md` | 同上 | 20,024 o | | `diff/beta_headers_diff.md` | 同上 | 10,817 o | | `diff/structural_diff.md` | 同上 | 38,698 o | | `cfg/plugin_install.md` | 同上 | 7,534 o | | `cfg/plugin_validate.md` | 同上 | 7,256 o | | `cfg/remote_control_bridge.md` | 同上 | 8,149 o | | `cfg/oidc_token_exchange.md` | 同上 | 9,066 o | | `cfg/agent_team_dispatch.md` | 同上 | 11,092 o | | `cfg/advisor_gate.md` | 同上 | 7,567 o | | `cfg/afk_latch.md` | 同上 | 7,938 o | | `cfg/foundry_auth.md` | 同上 | 10,407 o | | `cfg/datadog_telemetry.md` | 同上 | 9,999 o | | `cfg/sandbox_env_check.md` | 同上 | 14,621 o | | `identifier_map_2.1.117.json` | 同上 | 49,048 o (225 个映射) | ### 1.3 使用方法 **PE 提取:** 读取 DOS 头 → PE12 区段表 → 按名称定位 `.bun` → 读取 512 字节的区段头 → 在偏移 +424 处发现 `// @bun` 魔数 → 从 Bun 清单获取 JS 大小 (偏移 +420 处的 `u32LE` = 13,128,629) → 精确提取,无字节码污染。方法与 2.1.104 相同 (相同布局:128 o Bun 存档头 + 296 o 模块清单 = JS 前的 424 o)。 **美化:** `js-beautify` → `beautified/cli.beautified.js` (19.3 MB, 约 545 K 行)。 **目录提取:** 在美化后的 JS 上运行正则表达式以获取 API (`/v[0-9]+\/`)、工具 (`name:`, `description:` 常量)、环境变量 (`process.env.CLAUDE_CODE_*`, `process.env.ANTHROPIC_*`)、beta header (`"anthropic-beta"` 模式 + 关联常量)。 **内部机制 Markdown:** 针对美化代码中关键字符串区域的有针对性阅读 (`plugin`, `afk-mode`, `advisor`, `tengu_ccr_bridge`, `oidc_federation` 等) → 6 份语义文档。 **手动 CFG 重建:** 识别基本块、转换以及 10 个关键函数的重建伪代码 → 10 份 `cfg/` 文档。 **标识符映射:** 跨引用字符串上下文 + 美化 JS 上的调用邻域 → 225 个混淆→语义的映射。 **考虑但未使用的工具:** - `x64dbg` 动态分析 (导入地址断点,初始化后的堆 JS 转储) - `angr` / `Triton` 符号执行 (环境变量条件路径) - Bun JSC 字节码解码器 (106.8 MB 的 JSC 字节码仍未解析 — 魔数与 2.1.98 相比已更改) - `mitmproxy` 网络工具 (未提取 bridge_url,未捕获 OIDC token exchange 流程) ### 1.4 先前分析版本 | 版本 | 二进制大小 | 提取的 JS | 标识符 | API | 工具 | 环境变量 | Beta header | |---------|---------------|-----------|-------------|------|--------|----------|-------------| | 2.1.98 | ~230 MB | ~12 MB | 34,170 (JSC) | ~16 | ~25 | ~213 | ~15 | | 2.1.104 | 243,137,184 o (231.9 MB) | 12,800,361 o (12.2 MB) | 141,390 | ~66 | 29 | ~258 | 28 | | **2.1.117** | **247,959,712 o (236.5 MB)** | **13,128,629 o (12.52 MB)** | **143,536** | **452** | **42** | **540** | **31** | 来源:基线 `baseline_2.1.104.md` §1, §3, §4, §6 ; `EXTRACTION_REPORT.md` §4, §5。 ## 2. 2.1.117 关键数据 ### 2.1 比较表 | 指标 | v2.1.98 | v2.1.104 | v2.1.117 | 差异 104→117 | |----------|---------|----------|---------|----------| | 二进制大小 | ~230 MB | 231.9 MB | **236.5 MB** | +4.6 MB | | 提取的 JS | ~12 MB | 12.2 MB | **12.52 MB** | +0.3 MB | | 美化的 JS | — | ~18 MB | **19.3 MB** | +1.3 MB | | 唯一标识符 | 34,170 (JSC) | 141,390 | **143,536** | +2,146 | | API endpoint | ~16 | ~66 | **452** | +386 | | 工具 | ~25 | 29 | **42** | +13 | | 环境变量 | ~213 | ~258 | **540** | +282 | | Beta header | ~15 | 28 | **31** | +3 | ### 2.2 检测到的新模型 已在 `EXTRACTION_REPORT.md` §6 中确认: ``` claude-opus-4-7 claude-opus-4-6 (fast, 1m variants) claude-haiku-4-5-20251001 claude-sonnet-4-5-20250929 claude-opus-4-1-20250805 claude-opus-4-5-20251101 ``` ### 2.3 新增 CLI 子命令 在 2.1.104 中不存在,在 2.1.117 中存在 (来源:`EXTRACTION_REPORT.md` §6 L99-L113): | 命令 | 描述 | |----------|-------------| | `plugin install/enable/disable/uninstall/validate` | 插件管理 | | `plugin marketplace add/list/remove/update` | 市场 | | `auto-mode defaults/config/critique` | AFK 分类器检查 | | `agents` | 列出已配置的代理 | | `xaa` | XAA SEP-990 管理 (OIDC federation MCP) | | `setup-token` | 仅推理的长效令牌 | | `install [target]` | 原生构建安装 | | `doctor` | 自动更新程序健康检查 | | `remote-control` / `rc` | 通过 claude.ai/code 的远程控制 | ## 3. 重大架构更新 ### 3.1 插件系统 #### 技术描述 2.1.117 插件系统通过斜杠命令和 CLI 子命令 (`internals/plugin_system.md` §1, L433204-L433217) 协调安装 / 启用 / 禁用 / 卸载 / 市场 增删改 + `/plugin validate`。标准清单是 `plugin.json` 或 `.claude-plugin/plugin.json` (L198665-L198667),由 Zod schema 验证 (L45370-L46005)。 **可声明组件** (L199317-L199321) : `commands`, `agents`, `skills`, `hooks`, `outputStyles`。 **官方市场** : `github:anthropics/claude-plugins-official` (L194628)。安装统计 URL : `https://raw.githubusercontent.com/anthropics/claude-plugins-official/refs/heads/stats/stats/plugin-installs.json` (L427529) — 明文指纹。 **引用的官方插件** (L421173-L421176) : ``` /plugin install frontend-design@claude-plugins-official /plugin install playwright@claude-plugins-official /plugin install skill-creator@claude-plugins-official ``` **安装流程** (CFG `cfg/plugin_install.md`) : 函数 `C4H = installResolvedPlugin` (L198214) → 企业策略门控 `Bm8` → 依赖闭包 `wWK` → 原子写入设置 `T$(scope, {enabledPlugins})` → 8 个错误原因代码 → 遥测 `tengu_plugin_installed`。 **缓存路径** : `/cache////` (L198336)。 **作用域** : `user` (默认) 或 `project` (`.claude/settings.json`,与团队共享,L429360)。 #### cli.beautified.js 中的关键行号 | 元素 | 行 | |---------|--------| | `/plugin install` 帮助 | L433898-L433914 | | `plugin.json` 定位 | L198665-L198667 | | Zod schema `gitCommitSha` | L45968, L45991, L45972 | | 官方市场 | L194628 | | 安装流程 `C4H` | L198214-L198270 | | 缓存路径派生 | L198336 | | 路径投毒检测 | L378813 | | kebab-case 约束 | L432853 | | 清单冲突检测 | L199317-L199328 | | Seed 目录重新注册 | L378644 | #### OWASP 安全影响 - **A08 (软件与数据完整性) — 危急** : 无加密签名。`internals/plugin_system.md` §4.3 : 对 `ed25519`, `sigstore`, `cosign`, `gpg`, `openpgp`, `detached signature` 的匹配结果为 0。唯一的防护:可选的 `gitCommitSha` (L45968) + 市场白名单 `known_marketplaces.json` (L197682) + kebab-case 软警告 (L432853)。 - **A06 (易受攻击和过时的组件)** : 对 `claude-plugins-official` 的 `main` 分支的恶意推送将在无强制 pin 的情况下危及全部用户群。`stats` 分支 (L427529) 暴露明文安装名称 → 采用指纹。 - **供应链 — 7 个向量** (§6.1 内部机制) : 市场拼写抢注 (A), 依赖注入 (B), 缓解的路径遍历 (C, L378813), seed-dir 持久化 (D, L378644), 可手动编辑的 JSON 注册表 (E), 如果 `strict:true` 可被覆盖的清单冲突 (F), 公开的 `stats` 分支 (G)。 - **TOCTOU** : `validate` 可以修改 `enabledPlugins` (L197997-L197998),而没有对 `.claude/settings.json` 进行原子括号操作。 #### 与我们的 orchestrator.js 的比较 | 方面 | Claude Code 2.1.117 | poc-inter-cli | |--------|---------------------|---------------| | 市场 | `github:anthropics/claude-plugins-official` | N/A | | 清单 | `plugin.json` + Zod schema | `skills/*.md` + frontmatter JSON | | 签名 | **无** | **无** — 相同的缺陷 | | 作用域 | user / project | 仅全局 | | 依赖闭包 | 多级 `wWK` | N/A | | 策略代码 | 8 个原因代码 | 4 种权限门控模式 | **应借鉴** : 8 个细粒度原因代码用于我们的权限门控;针对 `WorkerPool.spawn()` 的事务性 reserve+rollback 模式 (L322929)。 **不应借鉴** : 从 seed_dir 自动重新注册 (反模式的持久化) ; kebab-case 仅作软限制 (在我们的 `skills-registry.js` 中应设为硬性要求)。 ### 3.2 远程控制 — `claude rc` + `tengu_ccr_bridge` + `mcp-proxy.anthropic.com` #### 技术描述 远程控制桥接暴露了 `claude --remote-control [name]` + 隐藏别名 `--rc` (`--hideHelp`, L554438)。目标 UI : `https://claude.ai/code/` (L438035, L467222)。该桥接支持: - 远程观察终端输出 - 从移动端/Web 端发送提示词 - **从其他设备批准工具调用** (L438023) - 通过 `PushNotification` 进行移动推送通知 (L187186) **资格门控** `ve6()` — 7 项顺序检查 (CFG `cfg/remote_control_bridge.md` B2-B9) : ``` B2: Og8() = Dg8() && y8("tengu_ccr_bridge", false) — feature flag GrowthBook B3: !$IH() — pas déjà dans une remote session (anti-double-hop) B4: Dg8() — abonnement claude.ai B5: RBK() — token full-scope (setup-token REFUSÉ, inference-only) B6: IBK()?.organizationUuid — UUID org présent B7: await FT("tengu_ccr_bridge") — async feature flag B8: policy("allow_remote_control") — policy managée org B9: version check serveur (L260849) — le serveur peut rejeter les clients obsolètes ``` **相关 Beta header** : `ccr-byoc-2025-07-29` (带有 `x-organization-uuid` 的桥接 L260418), `ccr-triggers-2026-01-30` (远程触发, L368645)。 **状态机** (L313103-L313106) : `connecting… → active → reconnecting → failed`。 **多会话** : `tengu_ccr_bridge_multi_session` (L484292) — 2.1.117 中新增的变体。 **会话来源** : 在审计事件中发出的 `source: "remote-control"` (L438882)。 #### 关键行号 | 元素 | 行 | |---------|--------| | CLI `--remote-control` + `--rc` | L554434, L554438 | | 特性标志门控 `tengu_ccr_bridge` | L260743-L260759 | | 拒绝 setup-token | L260756 | | 反双跳防护 | L260751 | | 状态机 | L313103-L313106 | | Debug dump `hSf` (11 个 auth 变量) | L260763 | | 组织策略 `allow_remote_control` | L467591, L491258-L491260 | | 桥接连接日志 `bridge_url` | L9415 | | PushNotification 接线 | L187186-L187187 | #### OWASP 安全影响 - **A04 (不安全设计) — 高** : 无本地上下文的远程工具批准 (`internals/remote_control.md` §6.2)。控制手机的攻击者可以在不查看终端的情况下批准 `Bash rm -rf /`、`Write .git/hooks/pre-commit`、`Edit package.json`。移动 UI 必须显示可读签名 — **[待验证]** grep 结果中未出现。 - **A07 (身份验证失败) — 处理得当** : 明确拒绝 `setup-token` (L260756 "inference-only") + 反双跳 (L260751)。防止从长效 token 或受感染会话进行枢轴扩展。 - **信息** : debug dump `hSf` (L260763) 列出了 11 个以上的明文 auth 变量 → 监控此 dump 是否落入共享/移动端日志。 - **[假设]** : 桥接 URL (`bridge_url` L9415) 未被 grep 提取 — 没有 mitmproxy 无法确认确切的 endpoint。 #### 与我们的 orchestrator.js 的比较 我们的 `telegram-bridge.js` 在概念上是类似的 (连接中/活跃状态),但没有文档化的多步门控。**应借鉴** : 将状态机形式化为枚举 (4 种状态);带原因代码的门控管道;反双跳防护。**不应借鉴** : 无上下文的远程批准 — 我们的 Tauri 已经显示了完整的 diff,保持这种 UX 优势。 ### 3.3 OIDC 联合 — XAA 链 RFC 9728/8414/8693/7523 #### 技术描述 OIDC 联合允许使用来自外部 IdP (Okta, GitHub Actions, Google Workspace, Azure AD, Kubernetes SA) 的身份令牌向 Anthropic 进行身份验证,而无需暴露 API key。 **Beta header** : `oidc-federation-2026-04-01` (L93223)。由环境变量四元组 (L37309-L37314) 触发: ``` ["ANTHROPIC_FEDERATION_RULE_ID", "ANTHROPIC_ORGANIZATION_ID", "ANTHROPIC_IDENTITY_TOKEN", "ANTHROPIC_IDENTITY_TOKEN_FILE"] ``` **两种认证类型** (L93006-L93007) : `oidc_federation`, `user_oauth`。不接受其他类型。 **重建的 OIDC 配置 schema** : ``` { "organization_id": "", "base_url": "https://api.anthropic.com", "authentication": { "type": "oidc_federation", "federation_rule_id": "", "service_account_id": "", "identity_token": { "source": "file", "path": "/path/to/id-token" }, "scope": "" } } ``` **存储** : `%APPDATA%\Anthropic\credentials\.json` (Windows) 或 `~/.config/anthropic/credentials/.json` (Unix) — L93046-L93063。 **XAA (SEP-990)** — MCP 服务器的相关机制 (L46430, L46443) : PRM 发现 RFC 9728 → AS 元数据发现 RFC 8414 → token exchange RFC 8693 (`grant_type: urn:ietf:params:oauth:grant-type:token-exchange`) → 或 JWT bearer RFC 7523 (`grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer`)。 **XAA 验证链** (L388974-389028) : - PRM 资源不匹配 → 拒绝 - Issuer 不匹配 → 拒绝 - Token endpoint 非 HTTPS → 强制拒绝 - `issued_token_type` 严格验证 (符合 RFC 8693) **Token 缓存** : `y04 = makeCachedOIDCProvider` (identifier_map L93460) — 凭证文件中的 `access_token + expires_at` 并自动刷新。 #### 关键行号 | 元素 | 行 | |---------|--------| | Beta header `oidc-federation-2026-04-01` | L93223 | | 环境变量四元组 | L37309-L37314 | | 重建的 OIDC 配置 | L93006-L93107 | | 掩码规则 ID (`…<6 chars>`) | L37271-L37273 | | XAA — PRM 发现 (RFC 9728) | L388974-389028 | | XAA — grant_type token-exchange | L389010 (`rD1`) | | XAA — grant_type jwt-bearer | L389038 (`w0_`) | | Token endpoint 强制 HTTPS | L389024 | | 凭证路径存储 | L93046-L93063 | | 活跃配置文件 | L37279-L37282 | #### 安全影响 - **积极** : token endpoint 强制 HTTPS (L389024) ; issuer 不匹配被拒绝 (L389026) ; 验证了 `issued_token_type` (严格遵循 RFC 8693)。 - **[假设]** : `service_account_id` 以明文存储在 `.json` 中。`federation_rule_id` 在显示时被掩码 (L37271),但在配置文件中以明文写入。 - **[待验证]** : 根据 IdP 而定的确切授权类型 (token-exchange vs jwt-bearer) — XAA 链首先尝试 token-exchange,如果前者失败则尝试 jwt-bearer。 - 理想场景:GitHub ActionsC token → `ANTHROPIC_IDENTITY_TOKEN_FILE` → 无需暴露 API key 的联合。 ### 3.4 Agent Teams — 扁平星型拓扑 + SwarmPermissionPoller #### 技术描述 Agent Teams 采用以主进程为中心的**扁平星型** (hub-spoke) 拓扑。队友是**进程内** worker (非子进程),类型为 `in_process_teammate` (L229025, L229044)。拓扑被显式约束:"Teammates cannot spawn other teammates — the team roster is flat" (L333270)。 **激活** : `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` 或 `--agent-teams` (L131965-L131968)。计划门控 (L333266) — 需要更高级别的 Anthropic 订阅。 **注册表** : `state.teamContext.teammates[id]` (L229111)。Swarm 标识符 : `claude-swarm-` (L227779)。 **代理间协议** : XML 块 `` (L37710, L227971),可通过 `SendMessage({to: name, content})` 寻址。 **完整任务系统** (EXTRACTION_REPORT §6) : ``` _V → TaskCreate bk → TaskUpdate ec → TaskGet BJ → TaskList JE → TaskOutput Uv → TaskStop ``` **可变所有权** : `TaskUpdate({owner: teammateId})` 用于重新分配孤立任务 (L221143)。 **Spawn 原语** `pU8 = spawnInProcessTeammate` (L229025) 返回 `{success, agentId, taskId, abortController, teammateContext}`。身份保留是通过 `mCH` 进行的事务性操作,并带有回滚 `l_$` (L322929)。 **SwarmPermissionPoller** (L229393-L229398) : 通过每个 `requestId` 的回调在 swarm 中的代理之间同步权限请求。 **两种 Agent 工具模式** (L224331, L224346, L224466) : - **Fork** : 继承完整上下文 + Anthropic 缓存 - **Fresh subagent** : 冷启动,自包含 prompt **两种 spawn 后端** (L322929, L375004) : - `spawnInProcessTeammate` (进程内,用于队友) - `PaneBackendExecutor` (可能是子进程/tmux 面板) **UltraPlan** (远程代理) : `CLAUDE_CODE_PLAN_V2_AGENT_COUNT` (L365624) ; 特性 `tengu_ultraplan_config.enabled` (L447609) ; 在云端执行 (`vtf = ["remote-agent", "ultraplan", ...]` L320890)。 #### 关键行号 | 元素 | 行 | |---------|--------| | 扁平拓扑约束 | L333270, L224476 | | 激活 env/flag | L131965-L131968 | | Swarm ID `claude-swarm-` | L227779 | | 消息 XML `` | L37710, L227971 | | Spawn 原语 `pU8` | L229025-L229070 | | 保留后回滚 | L322929 | | SwarmPermissionPoller | L229393-L229398 | | Fork vs fresh | L224331, L224346, L224466 | | TaskCreate 缩略 `_V` | L367631 | | TeammateIdle hook schema | L226768 | #### 安全影响 - **竞态条件** : `teamContext.teammates` 被并发修改 (进程内 worker,共享 V8 堆)。未观察到锁机制。 - **Fork 模式与 Anthropic 缓存** : [假设] fork 继承了 Anthropic 侧的 prompt 缓存 — 如果得到验证,成本节省显著。如果 agent 使用包含秘密的上下文进行 fork,它们将在 fork 中被继承。 - **内存隔离** : 进程内队友共享 V8 堆 — 没有像我们的子进程 worker 那样的进程隔离。 #### 与我们的 orchestrator.js 的比较 | 方面 | Claude Code 2.1.117 | poc-inter-cli | |--------|---------------------|---------------| | Worker | 进程内队友 | 通过 IPC 的子进程 | | 任务队列 | TaskCreate/Update/Get/List | 任务规划器 + `task-queue.js` | | 扁平拓扑 | 强制执行 (`L333270`) | 待验证 / 待强制执行 | | 消息协议 | XML `` | 自定义 XML + Telegram 桥接 | | 空闲跟踪 | `isIdle` + `TeammateIdle` hook | WorkerProfile 亲和性路由 | | 权限同步 | `SwarmPermissionPoller` | `permission-gate.js` 4 种模式 | | Fork 模式 | **是** (2 种 Agent 模式) | **否** — 机会 | **应借鉴** : fork 模式 (继承上下文 + 缓存) ; 一等公民的任务队列 (`TaskCreate`) ; 用于重新路由的 `TeammateIdle` hook ; 扁平拓扑强制 (防止 fork 炸弹)。 ### 3.5 AFK 模式 — `afk-mode-2026-01-31` 锁存 + 断路器 #### 技术描述 AFK (Away From Keyboard) 模式与**自动模式**耦合:Claude Code 在无人工干预的情况下继续执行,根据 ML 分类器自动批准工具调用,并通过远程控制将通知推送到移动端。 **Beta header** : `afk-mode-2026-01-31` (L91826)。存储在全局会话状态 `x8` 中 (L2099) : ``` x8 = { ..., afkModeHeaderLatched: null, fastModeHeaderLatched: null, cacheEditingHeaderLatched: null, ... } ``` **锁存** : 一旦 `afkModeHeaderLatched = true` (setter `fO8` L1837),header 将被注入到会话的后续所有请求中,直到重置。 **断路器** (L481885-L481888) : 如果服务器拒绝 `afk-mode-2026-01-31`,客户端丢弃 header 并针对该会话**对自动模式执行断路** (故障开放,非阻塞) — 标记为 `retry:afk-beta`。 **空闲阈值** (L527095-L527097) : ``` CLAUDE_CODE_IDLE_TOKEN_THRESHOLD (défaut: 100,000 tokens) CLAUDE_CODE_IDLE_THRESHOLD_MINUTES (défaut: 75 minutes) ``` **反垃圾通知** : `idleSec` (自上次按键以来的秒数,L369182) — 如果用户处于活跃状态,则抑制通知。 **自动模式分类器** (L231997-L232004, L400292, L400625, L400642) : 发起**第二次独立的 API 调用** (`classifierTokensEst`, `classifierChars` — L324094)。回退 : `"Classifier unavailable"` → 故障开放 (L400625)。 **进入自动模式前的多因素验证** (L401156) : 1. `enabledState` — 状态机 2. `disabledBySettings` — 用户设置 3. `modelSupported` — 当前模型是否支持自动模式? 4. `disableFastModeBreakerFires` — fast-mode 交互断路器 5. `carouselAvailable` — UI 选择器可用 6. `canEnterAuto` — 最终裁决 **持久化** : `/auto-mode/` (L323637) ; 分类器错误在 `/auto-mode-classifier-errors/.txt` 中 (L323643)。 #### 关键行号 | 元素 | 行 | |---------|--------| | Beta header `afk-mode-2026-01-31` | L91826 | | 全局状态 `afkModeHeaderLatched` | L2099 | | 断路器故障开放 | L481885-L481888 | | 空闲阈值环境变量 | L527095-L527097 | | 反垃圾 `idleSec` | L369182-L369213 | | 分类器第二次调用指标 | L324094-L324096 | | 诊断 `verifyAutoModeGateAccess` | L401156 | | 分类器错误日志 | L323637, L323643 | #### 安全影响 - **中等 — 故障开放** : 静默断路 (L481885)。用户不会收到 `afk-mode` 已在服务器端禁用的通知;自动模式继续以降级模式运行 (工具调用不再在 Anthropic 侧标记为 AFK,但仍然执行)。 - **隐藏成本** : 每次自动模式决策都会消耗一次额外的 API 调用 (classifierTokensEst)。对于长会话,这可能会使 token 翻倍。 - **回退 `"Classifier unavailable"`** (L400625) → 无阻塞 → 如果分类器宕机则隐式批准。 ### 3.6 Advisor 工具 — `server_tool_use` 模型双门控 #### 技术描述 Advisor 是一个由 Anthropic 基础设施执行的**服务器端工具** (不在客户端)。它**没有参数** — 完整的对话历史会自动转发到服务器端。 **Beta header** : `advisor-tool-2026-03-01` (L91827)。 **流协议** (L223353, L481970-L481991) : - `content_block_start` 类型 `server_tool_use` 名称 `"advisor"` → 锁存 `m8 = true` - `content_block_start` 类型 `advisor_tool_result` → 释放 `m8 = false` - 结果子类型 : `advisor_result` (成功) / `advisor_tool_result_error` (重试) - 针对特定 400 错误的重试 : `IY$` 剥离 advisor 消息 + `tengu_advisor_strip_retry` **双函数门控** (`cfg/advisor_gate.md`, identifier_map) : ``` function Uh() { if (truthy(process.env.CLAUDE_CODE_DISABLE_ADVISOR_TOOL)) return false; if (provider !== "firstParty" || !isOAuth()) return false; if (truthy(process.env.CLAUDE_CODE_ENABLE_EXPERIMENTAL_ADVISOR_TOOL)) return true; return growthbook("tengu_sage_compass2").enabled ?? false; } const SUPPORTED = /opus-4-7|opus-4-6|sonnet-4-6/; function WfH(baseModel) { return SUPPORTED.test(baseModel.toLowerCase()); } // Gate #1 function Z$8(advisorModel) { return SUPPORTED.test(advisorModel.toLowerCase()); } // Gate #2 function tkK(advisorModel, baseModel) { // dispatcher if (!Uh() || !advisorModel) return undefined; const canonical = resolveAlias(advisorModel); if (!WfH(baseModel)) { log.skip("base unsupported"); return; } if (!Z$8(canonical)) { log.skip("advisor invalid"); return; } return canonical; } ``` **支持的模型** (在 identifier_map L223361, L223369 中确认) : - 基础模型 : `opus-4-7`, `opus-4-6`, `sonnet-4-6` - Advisor 模型 : 相同 (2.1.117 中相同的白名单) **定位** (L223392-L223407) : 在实质性工作之前调用 + 完成后调用以进行最终审查。"更强审查者模型"前置加载策略。 **终止开关** : `CLAUDE_CODE_DISABLE_ADVISOR_TOOL` (硬关闭) + `CLAUDE_CODE_ENABLE_EXPERIMENTAL_ADVISOR_TOOL` (强制开启)。 #### 关键行号 | 元素 | 行 | |---------|--------| | Beta header `advisor-tool-2026-03-01` | L91827 | | 协议类型鉴别器 | L223353 | | 门控 `Uh()` — 4 个条件 | L223355-L223360 | | 门控 `WfH()` 基础模型 | L223361 | | 门控 `Z$8()` advisor 模型 | L223365-L223369 | | 调度器 `tkK()` | L223369-L223381 | | 系统 prompt 附录 | L223392-L223407 | | 锁存 `m8` 开始/结束 | L481970-L481991 | | 遥测事件 | L481979, L482127, L223866, L481894 | | 配置 `advisorModel` 设置 | L46701, L464342-L464349 | #### 安全影响 - **信息 — 相同白名单** : `WfH` 和 `Z$8` 对不同的输入 (基础 vs advisor 模型) 测试相同的正则表达式。如果 Anthropic 在 2.1.118 中使这两个函数产生分歧而未作记录,使用不受支持的 advisor 的用户将看不到任何可见错误 — 只有静默的 `undefined`。 - **成本** : advisor 将完整历史转发到服务器端 → token 成本与转录长度成正比。无客户端切片。 - **[假设]** : `advisorModel: D` 在所有 assistant 消息上被标记,即使在该轮次中没有 advisor 调用 (L482090, L482295 在 `D` 为真时无条件执行) → 归因于整个轮次的计费范围。 ### 3.7 Foundry Provider — `ANTHROPIC_FOUNDRY_*` + Azure AD #### 技术描述 Foundry provider 允许通过 Azure AI Foundry (Microsoft) 使用 Claude。这是第 5 个 provider (与 Bedrock, Vertex, Anthropic AWS/mantle, firstParty 并列)。 **激活** : `CLAUDE_CODE_USE_FOUNY=1` (L38015, L85982)。 **两种认证模式** : 1. `ANTHROPIC_FOUNDRY_API_KEY` (字符串) → header `x-api-key` 2. Azure AD `DefaultAzureCredential` 通过 `@azure/identity` → header `Authorization: Bearer ` **跳过认证** : `CLAUDE_CODE_SKIP_FOUNDRY_AUTH=1` → provider `() => Promise.resolve("")` → 空 Bearer (仅用于测试代理 — [假设])。 **基础 URL** : `ANTHROPIC_FOUNDRY_BASE_URL` (显式) 或派生 : `https://${ANTHROPIC_FOUNDRY_RESOURCE}.services.ai.azure.com/anthropic/` (L97354-L97378)。 **构造函数互斥约束** (L97367) : `apiKey && azureADTokenProvider` → 抛出异常 ; 两者皆无 → 抛出异常 ; `baseURL && resource` → 抛出异常。 **DefaultAzureCredential 链** : env → workload identity → managed identity → shared-token-cache → VS Code → Azure CLI → Azure PowerShell → InteractiveBrowser (最后手段,在非 TTY 的 CI 中不可用)。 **在 Foundry 上禁用的功能** (L91874, L406817, L97341) : fast-mode, `/feedback`, `beta.messages.batches`。 **遥测** : Foundry 用户发出**零** Datadog 事件 (在 `zp6` 中的门控 `provider !== "firstParty"` — 参见 `cfg/datadog_telemetry.md` B2a)。 #### 关键行号 | 元素 | 行 | |---------|--------| | Provider 调度器 `uO` | L122118 | | Foundry 分支 | L122143-L122156 | | 构造函数 `AnthropicFoundry` | L97353-L97400 | | `authHeaders()` — Bearer vs x-api-key | L97381-L97395 | | 从 resource 派生 URL | L97354-L97378 | | 互斥检查 | L97367 | | 禁用的功能 | L91874, L406817, L97341 | #### 安全影响 - **信息** : `validateHeaders()` 在 Foundry 上为空操作 (L97397-L97399) — 与 firstParty 客户端不同。自定义 header (`ANTHROPIC_CUSTOM_HEADERS`) 无验证地到达 Foundry。 - **[假设]** : 针对生产环境的 `CLAUDE_CODE_SKIP_FOUNDRY_AUTH=1` → 空 Bearer → 401 但请求**仍然**发送到网络。在客户端添加防护。 - **Provider 比较** : Foundry = 没有 SigV4 (与 Bedrock 不同) ; 没有 Google OAuth2 拦截器 (与 Vertex 不同)。简化的认证但没有请求签名。 ### 3.8 Datadog 遥测 — `http-intake.logs.us5.datadoghq.com` #### 技术描述 Claude Code v2.1.117 除了 Amplitude 管道外,还内置了 Datadog 管道。在 2.1.117 中新增 (与 2.1.104 相比的已记录空白)。 **模块** : `_HK` (L134129-L134130) — `trackDatadogEvent: zp6`, `shutdownDatadog: ys`, `initializeDatadog: KHK`。 **Endpoint** : `https://http-intake.logs.us5.datadoghq.com/api/v2/logs` (L134203 = `Lc4`)。 **Token** : `pubea5604404508cdd34afb69e6f42a05bc` (L134204 = `Jc4`) — **硬编码**,可公开提取。 **激活门控** (CFG 的 B1-B2) : 1. Provider 必须是 `firstParty` — Foundry/Bedrock/Vertex → 零发射 2. GrowthBook `tengu_log_datadog_events` 必须启用 3. 检测到 VPN → 自动禁用 **白名单** : 仅限 55 个事件 (L134227-L134283)。其他 `l(...)` 仅发送到 Amplitude (`csH`)。 **清洗器** `AO8` (L2934) : 仅删除以 `_PROTO_` 为前缀的键。非 `_PROTO_` 的 PII (URL, 路径, 错误字符串) 以明文通过。 **批处理** : 内存缓冲区 `esH`,在 100 个条目或 15 秒后自动刷新 (`CLAUDE_CODE_DATADOG_FLUSH_INTERVAL_MS` 可配置)。通过 `KK` 进行关闭刷新 (L134118)。 **用户分桶** : `sha256(installId) % 30` → 确定性整数 0..29 (`userBucket`),用于分阶段推出。 **即发即弃** : POST 失败 → 仅记录日志,不重试,不进行磁盘假脱机。 #### 关键行号 | 元素 | 行 | |---------|--------| | 模块 `_HK` | L134129-L134130 | | Datadog Endpoint | L134203 | | 硬编码 Token | L134204 | | 门控 `yc4()` | L134319-L134327 | | 入队 `zp6()` | L134154-L134200 | | 清洗器 `AO8` `_PROTO_*` | L2934 | | 55 个事件白名单 | L134227-L134283 | | 缓冲区+刷新 | L134136-L134149 | | `CLAUDE_CODE_DATADOG_FLUSH_INTERVAL_MS` | L134144 | #### 安全影响 - **中等** : 非常狭窄的清洗 (仅 `_PROTO_*`)。错误字符串、路径、模型名称、HTTP 状态详细信息以 JSON payload 发送给 Datadog。没有结构化的 PII 过滤。 - **可公开提取的 Token** : 故意为之 (公共 ingest token 为只写),但作为 RE 产物记录在案。 - **Foundry/Bedrock/Vertex 隐私优势** : 这些 provider 零 DD 发射。 - **[假设]** : `_PROTO_plugin_name` 在 DD 之前被清洗,但仍保留在 Amplitude 中 (`csH` L134333) — 不对称管道。 ## 4. API 目录 — 452 个 endpoint 概要 来源 : `catalogs/apis_catalog.json` (168,398 o, 452 个条目), `diff/apis_diff.md`。 ### 4.1 主要领域 | 领域 | 基地址 | 值得注意的 endpoint 示例 | |---------|------|-------------------------------| | Anthropic API 核心 | `https://api.anthropic.com` | `/v1/messages`, `/v1/models`, `/v1/files` | | 会话/环境 | 同上 | `/v1/sessions/$ID/events`, `/v1/environments`, `/v1/environments/bridge` | | 代理 | 同上 | `/v1/agents` (非公开) | | OAuth/认证 | 同上 | `/v1/oauth/token`, `/v1/oauth/hello`, `/api/oauth/claude_cli/*` | | 反馈/指标 | 同上 | `/api/claude_cli_feedback`, `/api/claude_code/metrics`, `/api/claude_code/organizations/metrics_enabled` | | Foundry (Azure) | `https://.services.ai.azure.com/anthropic/` | 基于 Azure 的标准 Anthropic | | mcp-proxy | `https://mcp-proxy.anthropic.com` | MCP 流式 HTTP 代理 | | GitHub Copilot MCP | `https://api.githubcopilot.com/mcp/` | Copilot MCP endpoint | | Notion MCP | `https://mcp.notion.com/mcp` | Notion MCP endpoint | | Datadog | `https://http-intake.logs.us5.datadoghq.com/api/v2/logs` | 遥测管道 | | claude.ai | `https://claude.ai/upgrade/max`, `https://claude.ai/code`, `https://clau.de/chrome/permissions` | UI/认证 | | 文档 | `https://code.claude.com/docs/en/microsoft-foundry` | 2.1.117 中新增 | ### 4.2 相对于 2.1.104 的新 endpoint 亮点 (`diff/apis_diff.md`) : - `https://api.anthropic.com/v1/sessions/$SESSION_ID/events?page=page_abc123` — 会话事件流 - `https://api.anthropic.com/v1/files/$FILE_ID/content` — Files API - `https://api.anthropic.com/v1/files?scope_id=$SESSION_ID` - `https://mcp-proxy.anthropic.com` — Anthropic 用于 MCP 的反向代理 - `https://api.githubcopilot.com/mcp/` — GitHub Copilot MCP - `https://mcp.notion.com/mcp` — Notion MCP - `http-intake.logs.us5.datadoghq.com/api/v2/logs` — Datadog (新增) - `https://code.claude.com/docs/en/microsoft-foundry` — Foundry 文档 ## 5. 工具目录 — 42 个工具 来源 : `catalogs/tools_catalog.json` (13,383 o), `diff/tools_diff.md`, `EXTRACTION_REPORT.md` §6 (identifier_map)。 ### 5.1 包含混淆映射的完整列表 | 工具 | 混淆名 | 类别 | 相对 2.1.104 新增 | |------|----------|-----------|---------------------| | Agent | `DK` | subagent | 否 | | Bash | `d$` | shell | 否 | | Read | `Cq` | filesystem | 否 | | Edit | `jK` | filesystem | 否 | | Write | `U_` | filesystem | 否 | | Glob | `xf` | filesystem | 否 | | Grep | `$4` | search | 否 | | WebFetch | `TY` | network | 否 | | WebSearch | `Ik` | network | 否 | | TodoWrite | `Gh` | planning | 否 | | NotebookEdit | `cD` | notebook | 否 | | ToolSearch | `aO` | meta | 否 | | Skill | `qw` | skill | 否 | | EnterPlanMode | `H4H` | plan | 否 | | ExitPlanMode | `Rk` | plan | 否 | | AskUserQuestion | `Gz` | interaction | 否 (原为受限) | | REPL | `Wz` | repl | 否 (原为受限) | | PowerShell | `m7` | shell | **是** | | ScheduleWakeup | `$w` | async | **是** | | Monitor | `wW` | async | **是** | | PushNotification | `sc` | notification | **是** | | SendMessage | `_L` | teams | **是** | | RemoteTrigger | `V2H` | remote | **是** | | EnterWorktree | `Eu8` | worktree | **是** | | ExitWorktree | `hu8` | worktree | **是** | | TaskCreate | `_V` | tasks | **是** | | TaskUpdate | `bk` | tasks | **是** | | TaskGet | `ec` | tasks | **是** | | TaskList | `BJ` | tasks | **是** | | TaskOutput | `JE` | tasks | **是** | | TaskStop | `Uv` | tasks | **是** | | CronCreate | — | cron | **是** | | CronDelete | — | cron | **是** | | CronList | — | cron | **是** | | LSP | — | language | 否 (原为受限) | | SendUserMessage | — | user | **是** | **内部工具 (非公开)** : `TeamCreate`, `TeamDelete`, `SyntheticOutput`, `AdvisorTool`, `Workflow`。 ### 5.2 按领域分类 | 类别 | 数量 | 描述 | |-----------|-------|-------------| | Filesystem | 5 | Read, Edit, Write, Glob, Grep | | Shell | 2 | Bash, PowerShell | | 任务管理器 | 6 | TaskCreate/Update/Get/List/Output/Stop | | 异步/调度 | 3 | ScheduleWakeup, Monitor, CronCreate/Delete/List | | 团队/消息传递 | 2 | SendMessage, SendUserMessage | | Worktree | 2 | EnterWorktree, ExitWorktree | | 规划 | 2 | EnterPlanMode, ExitPlanMode | | 网络 | 2 | WebFetch, WebSearch | | 远程 | 1 | RemoteTrigger | | Subagent | 1 | Agent | | 通知 | 1 | PushNotification | | Meta | 2 | ToolSearch, TodoWrite | | 用户 | 1 | AskUserQuestion | | REPL/notebook | 2 | REPL, NotebookEdit | | 技能 | | Skill | ## 6. 环境变量目录 — 540 个变量 来源 : `catalogs/env_vars_catalog.json` (188,603 o), `diff/env_vars_diff.md`。 ### 6.1 按命名空间分组 | Namespace | 数量 | 代表性示例 | |-----------|-------|------------------------| | `CLAUDE_CODE_*` | ~220 | `DISABLE_ADVISOR_TOOL`, `EXPERIMENTAL_AGENT_TEAMS`, `IDLE_THRESHOLD_MINUTES`, `SCRIPT_CAPS`, `SUBPROCESS_ENV_SCRUB` | | `ANTHROPIC_*` | ~60 | `FEDERATION_RULE_ID`, `ORGANIZATION_ID`, `FOUNDRY_BASE_URL`, `FOUNDRY_API_KEY`, `IDENTITY_TOKEN`, `IDENTITY_TOKEN_FILE`, `SERVICE_ACCOUNT_ID` | | `AWS_*` | ~50 | `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`, `AWS_BEARER_TOKEN_BEDROCK` | | `AZURE_*` | ~10 | `AZURE_CLIENT_SECRET`, `AZURE_CLIENT_CERTIFICATE_PATH` | | `GOOGLE_*` | ~5 | `GOOGLE_APPLICATION_CREDENTIALS` | | `OTEL_*` | ~10 | OpenTelemetry exporter 变量 | | `GITHUB_*` / `ACTIONS_*` | ~15 | `ACTIONS_ID_TOKEN_REQUEST_TOKEN`, `ALL_INPUTS`, `OVERRIDE_GITHUB_TOKEN` 等 | | 其他 | ~170 | 代理、路径、调试、杂项 | ### 6.2 "秘密"变量 — 在子进程环境中清洗的 23 个变量 (`M4f` L174684) ``` ANTHROPIC_API_KEY CLAUDE_CODE_OAUTH_TOKEN ANTHROPIC_AUTH_TOKEN ANTHROPIC_FOUNDRY_API_KEY ANTHROPIC_AWS_API_KEY ANTHROPIC_BEDROCK_MANTLE_API_KEY ANTHROPIC_CUSTOM_HEADERS OTEL_EXPORTER_OTLP_* (4 vars) AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN AWS_BEARER_TOKEN_BEDROCK GOOGLE_APPLICATION_CREDENTIALS AZURE_CLIENT_SECRET AZURE_CLIENT_CERTIFICATE_PATH ACTIONS_ID_TOKEN_REQUEST_TOKEN ACTIONS_ID_TOKEN_REQUEST_URL ACTIONS_RUNTIME_TOKEN ACTIONS_RUNTIME_URL ALL_INPUTS OVERRIDE_GITHUB_TOKEN DEFAULT_WORKFLOW_TOKEN SSH_SIGNING_KEY ``` 来源 : `cfg/sandbox_env_check.md` §B8。 ### 6.3 值得注意的新变量 (2.1.117) | 变量 | 作用 | |----------|------| | `ANTHROPIC_FEDERATION_RULE_ID` | OIDC 联合规则 | | `ANTHROPIC_ORGANIZATION_ID` | 用于 OIDC 的组织 | | `ANTHROPIC_IDENTITY_TOKEN` | 内联 JWT | | `ANTHROPIC_IDENTITY_TOKEN_FILE` | 通过文件获取 JWT | | `ANTHROPIC_SERVICE_ACCOUNT_ID` | SA OIDC | | `ANTHROPIC_FOUNDRY_BASE_URL` | Foundry URL | | `ANTHROPIC_FOUNDRY_API_KEY` | Foundry 密钥 | | `ANTHROPIC_FOUNDRY_RESOURCE` | 用于 URL 派生的 Azure Resource | | `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` | 激活 Teams | | `CLAUDE_CODE_IDLE_THRESHOLD_MINUTES` | AFK 空闲阈值 (默认 75 分钟) | | `CLAUDE_CODE_IDLE_TOKEN_THRESHOLD` | 空闲 token 阈值 (默认 100K) | | `CLAUDE_CODE_REMOTE_MEMORY_DIR` | 跨会话的远程记忆 | | `CLAUDE_CODE_DATADOG_FLUSH_INTERVAL_MS` | 遥测刷新 (默认 15 秒) | | `CLAUDE_CODE_DISABLE_ADVISOR_TOOL` | Advisor 终止开关 | | `CLAUDE_CODE_ENABLE_EXPERIMENTAL_ADVISOR_TOOL` | 强制开启 advisor | | `CLAUDE_CODE_SCRIPT_CAPS` | 针对 Bash 的每个子字符串 JSON 上限 | ## 7. Beta header — 可见的 Anthropic 路线图 来源 : `catalogs/beta_headers_catalog.json` (31 个条目), `diff/beta_headers_diff.md`。 ### 7.1 时间线 2025-07 → 2026-04 | Header | 日期 | 产品解释 | |--------|------|----------------------| | `ccr-byoc-2025-07-29` | 2025-07 | 远程控制 BYOC (自带云) — 多租户桥接 | | `files-api-2025-04-14` | 2025-04 | Files API (可能在 2.1.104 中已稳定) | | `structured-outputs-2025-12-15` | 2025-12 | JSON 结构化输出 | | `advanced-tool-use-2025-11-20` | 2025-11 | 工具使用管道改进 | | `effort-2025-11-24` | 2025-11 | 模型努力级别控制 | | `afk-mode-2026-01-31` | 2026-01 | 带自动分类器的 AFK 模式 | | `ccr-triggers-2026-01-30` | 2026-01 | RC 远程触发 | | `redact-thinking-2026-02-12` | 2026-02 | 编辑思考块 | | `fast-mode-2026-02-01` | 2026-02 | Opus 快速模式 | | `compact-2026-01-12` | 2026-01 | 内存压缩 | | `task-budgets-2026-03-13` | 2026-03 | 按任务的 token 预算 | | `advisor-tool-2026-03-01` | 2026-03 | 服务器端 Advisor 工具 | | `context-hint-2026-04-09` | 2026-04 | 模型的上下文提示 | | `managed-agents-2026-04-01` | 2026-04 | 托管代理 (Agent Teams 公测?) | | `oidc-federation-2026-04-01` | 2026-04 | 企业 OIDC 联合 | ### 7.2 稳定的 Header (2.1.104 中已存在) `mcp-client`, `mcp-servers`, `message-batches`, `token-counting`, `web-search`, `interleaved-thinking`, `context-1m`, `context-management`。 ### 7.3 路线图解读 - **2025 年 Q3** → BYOC 基础设施,Files API - **2025 年 Q4** → 结构化输出,努力控制,高级工具使用 - **2026 年 1 月** → AFK 模式,RC 触发器,压缩内存 - **2026 年 2 月** → 快速模式,编辑思考 - **2026 年 3 月** → 任务预算,Advisor 工具 - **2026 年 4 月** → 托管代理 (Teams GA?),企业 OIDC,上下文提示 `managed-agents-2026-04-01` 窗口表明 Agent Teams 将在 2026 年 Q2 的某个时候进入 GA 阶段。 ## 8. CFG — 重建的关键函数 来源 : `cfg/*.md` (10 个文件,总计约 90 KB)。 ### 8.1 10 个 CFG 摘要 | 函数 | CFG 文件 | 块 | 关键点 | |----------|-------------|-------|-------------| | `C4H = installResolvedPlugin` | `plugin_install.md` | B1-B6 (+ B7 子 CFG) | 8 个策略原因代码 ; 带有 `l_$` 回滚的事务性操作 ; 遥测 `tengu_plugin_installed` 标记 "third-party" | | `pluginValidate` | `plugin_validate.md` | B1-B10 | Zod schema L45370-L46005 ; 可选 `gitCommitSha` ; 路径投毒检查 L378813 ; kebab-case 软警告 L432853 | | `tryConnectRemoteControl` = `ve6()` | `remote_control_bridge.md` | B1-B14 | 7 个顺序门控 ; 4 状态状态机 ; 多会话标志 ; 拒绝 token `setup-token` | | `xaaFullFlow = oz$` | `oidc_token_exchange.md` | PRM→AS→exchange | RFC 9728 + 8414 + 8693/7523 ; 强制 HTTPS ; 拒绝 issuer 不匹配 | | `spawnInProcessTeammate = pU8` + Task tools | `agent_team_dispatch.md` | B1-B15 | 15 个块 ; 强制扁平拓扑 ; 事务性 `mCH`+回滚 ; 六元组任务队列 | | `tkK` (advisor gate) | `advisor_gate.md` | B1-B7 | 特性门控 `Uh()` → 基础门控 `WfH()` → advisor 门控 `Z$8()` → 入队 `advisor_20260301` ; 400 时剥离重试 | | `setAfkModeHeaderLatched` + circuit-break | `afk_latch.md` | — | 锁存到 `x8.afkModeHeaderLatched` ; 断路器故障开放 L481885 ; 可配置的空闲阈值 | | `createClient` foundry 分支 | `foundry_auth.md` | B1-B9 | Azure DAC 链 ; 互斥 apiKey/azureADTokenProvider ; 从 resource 派生 baseURL ; 禁用的功能 | | `zp6` (Datadog enqueue) + `Ap6` (flush) | `datadog_telemetry.md` | B1-B10 | Provider firstParty 防护 ; 55 个事件白名单 ; 窄范围清洗 `_PROTO_*` ; 即发即忘 ; 硬编码公开 token | | `zc4/U5` (sandbox trust) + `Tk` (subprocess env) | `sandbox_env_check.md` | B1-B12 | 23 变量清洗列表 ; macOS `sandbox-exec -p` ; Linux `bwrap` + seccomp ; **Windows = 仅环境变量清洗** ; `sd6` script-caps 防泄露 | ### 8.2 反复出现的架构模式 - **锁存 + 会话状态** : 对于 `x8` 中的 `afkModeHeaderLatched`, `fastModeHeaderLatched`, `cacheEditingHeaderLatched`, `thinkingClearLatched` 采用相同模式 (L2099) — 我们可以预测未来 beta 功能的新锁存。 - **GrowthBook 特性标志门控** : `y8("tengu_XXX", false)` 同步或 `FT("tengu_YYY")` 异步 — 所有关键块都通过此抽象。 - **事务性 reserve+rollback** : `mCH` (团队文件更新) + `l_$` (回滚 L322929) — 可在我们的 `WorkerPool` 中重用的模式。 - **断路器故障开放** : AFK,advisor 剥离重试,分类器不可用 → 全部继续运行而不阻塞。 ## 9. 增量标识符映射 来源 : `identifier_map_2.1.117.json` (49,048 o)。 ### 9.1 统计数据 | 指标 | 值 | |----------|--------| | 2.1.117 总标识符 | 143,536 | | 已映射标识符 (本次运行) | 225 | | 相对于 2.1.104 的新增 (估计) | ~2,500 | | 方法 | 跨引用上下文 + 字符串邻域 + 调用点分组 | ### 9.2 按领域分布 | 领域 | 数量 | 值得注意的示例 | |---------|-------|-----------------------| | Advisor | 12 | `tkK=resolveAdvisorModel`, `WfH=baseModelSupportsAdvisor`, `Z$8=isValidAdvisorModel` | | OIDC/联合 | 18 | `oz$=xaaFullFlow`, `rD1=GRANT_TYPE_TOKEN_EXCHANGE`, `w0_=GRANT_TYPE_JWT_BEARER` | | 远程控制 | 14 | `ve6=checkRemoteControlEligibility`, `Og8=isRemoteControlAvailable`, `$IH=isInsideRemoteSession` | | Agent Teams | 22 | `pU8=spawnInProcessTeammate`, `qq8=killTeammate`, `JV8=buildTeammateContext` | | AFK/自动模式 | 8 | `fO8=setAfkModeHeaderLatched`, `lA6=getAfkModeHeaderLatched`, `x8=globalSessionState` | | 特性标志 | 6 | `y8=getSyncFeatureFlag`, `FT=getAsyncFeatureFlag` | | 会话/运行时 | 8 | `E8=getCurrentSessionId`, `W16=rotateSessionId` | | XAA | 15 | `eD1=xaaDiscoverPRM`, `Hw1=xaaDiscoverAuthorizationServer`, `PA8=redactTokenInJson` | | 核心杂项 | 122 | `ej=getTrimmedEnvVar`, `Yp$=getAnthropicConfigDirSync` 等 | ### 9.3 值得注意的映射 ``` // Feature flags (universels) y8 = getSyncFeatureFlag // y8("tengu_ccr_bridge", false) FT = getAsyncFeatureFlag // await FT("tengu_ccr_bridge") // Session state global x8 = globalSessionState // { afkModeHeaderLatched, fastModeHeaderLatched, sessionId, ... } E8 = getCurrentSessionId // return x8.sessionId W16 = rotateSessionId // x8.sessionId = randomUUID() // XAA grant types (constantes) rD1 = GRANT_TYPE_TOKEN_EXCHANGE // "urn:ietf:params:oauth:grant-type:token-exchange" w0_ = GRANT_TYPE_JWT_BEARER // "urn:ietf:params:oauth:grant-type:jwt-bearer" oD1 = SUBJECT_TOKEN_TYPE_JWT // "urn:ietf:params:oauth:token-type:jwt" // Advisor whitelist WfH = baseModelSupportsAdvisor // /opus-4-7|opus-4-6|sonnet-4-6/.test(model) Z$8 = isValidAdvisorModel // même regex ``` ## 10. 安全 ### 10.1 供应链攻击面 (无加密签名的插件系统) **主要向量** (OWASP A08) : 官方市场 `github:anthropics/claude-plugins-official` 是中心故障点。客户端未任何加密签名。对受损 `main` 分支的推送将在无 `gitCommitSha` pin 的情况下危及**所有**用户。 **已记录的 7 个向量** (`internals/plugin_system.md` §6.1) : | # | 向量 | 当前缓解 | 缺陷 | |---|---------|---------------------|-----| | A | 市场拼写抢注 | Kebab-case 软警告 (L432853) | 未阻止 Unicode 混淆字符 | | B | 依赖注入 | 仅根信任 (L197899) | 仅限根市场的传递信任 | | C | 路径遍历 | 检查 `isInside(Y)` (L378813) | 已覆盖 | | D | Seed-dir 重新注册 | 警告消息 (L378644) | 启动时的静默持久化 | | E | JSON 注册表可编辑 | 检测 `corrupted installLocation` (L378813) | 无完整性的读写 | | F | 清单冲突 | 显式错误 (L199321) | `strict:true` 可被覆盖 | | G | GitHub `stats` 分支 | N/A | 明文采用指纹 | **对 poc-inter-cli 的建议** : 如果我们添加技能市场,设计时必须强制使用 ed25519 签名 ; 默认进行哈希 pin ; seed_dir = 仅限 read-ACK。 ### 10.2 暴露的秘密 **在子进程中清洗的 23 个变量** (`M4f`) — 详尽列表见 §6.2。 **有风险的 "skip-auth" 变量** : `CLAUDE_CODE_SKIP_FOUNDRY_AUTH`, `CLAUDE_CODE_SKIP_BEDROCK_AUTH`, `CLAUDE_CODE_SKIP_VERTEX_AUTH`, `CLAUDE_CODE_SKIP_ANTHROPIC_AWS_AUTH` — 全部允许绕过认证进行测试,但仍会发送网络请求。 **配置中的明文秘密** : `.json` 中的 `service_account_id` ; `federation_rule_id` 在显示时被掩码但在文件中未掩码。 **硬编码的 Datadog Token** : `pubea5604404508cdd34afb69e6f42a05bc` (L134204) — 公共 ingest token 只写,任何拥有二进制文件的人均可提取。 ### 10.3 远程控制门控与开放风险 **有效的保护措施** : 拒绝 `setup-token` (L260756),反双跳 (L260751),托管策略 `allow_remote_control` (L467591),服务器版本检查 (L260849)。 **残余风险** : - 来自移动端的工具批准缺乏完整的本地上下文 (§F2, OWASP A04) - Debug dump `hSf` (L260763) 列出了 11 个以上的 auth 变量 — 监控日志 - 确切的 `bridge_url` 未提取 - 没有 mitmproxy 无法确认网络隔离 - 带有 `hideHelp` 的别名 `--rc` (L554438) — 安全功能的模糊性 ### 10.4 沙箱 — Windows 缺陷 **macOS** (B11) : `sandbox-exec -p `,具有网络拒绝、文件系统规则 `ed6`、受限制的 mach 查找。已覆盖。 **Linux** (B12) : `bwrap --unshare-net --unshare-pid [--unshare-user] --dev /dev --proc /proc` + 通过 `apply-seccomp` 的 seccomp BPF (L174255) + 用于 HTTP 代理的 socat 桥接 UNIX socket。已覆盖。 **Windows** : **未检测到 `JobObject`, `AssignProcessToJobObject`, `CreateJobObject`** (`cfg/sandbox_env_check.md` §notes F12)。Windows 保护仅依赖于 : 1. 环境变量清洗 (`M4f` 23 个变量) 2. 信任对话框 + `hasTrustDialogAccepted` 3. `x-anthropic-additional-protection: true` (服务器 header, L122105) **在 Windows 上缺乏有效的 `CLAUDE_CODE_BASH_SANDBOX_SHOW_INDICATOR`** — Windows 用户看不到沙箱/非沙箱的区别。 **Script-caps** `CLAUDE_CODE_SCRIPT_CAPS` (L174630) : 通过重复进行防泄露保护 (例如: `{"curl": 5}`)。适用于所有操作系统。 ### 10.5 遥测 PII 清洗受限 `AO8` (L2934) 仅清洗 `_PROTO_*` 键。其他所有内容 (URL, 路径, 错误消息, 模型名称) 作为 JSON payload 发送给 Datadog。 `_PROTO_plugin_name` 和 `_PROTO_marketplace_name` 在 Datadog 之前被清洗,**但保留在 Amplitude 中** (并行的 `csH` L134333 管道未过滤)。 ### 10.6 故障开放模式 | 功能 | 故障开放模式 | 影响 | |---------|-------------------|--------| | AFK 断路器 | 服务器拒绝 beta → 丢弃 header,自动模式继续 (L481885) | 静默回退 | | Advisor 剥离重试 | 特定 400 → 剥离 + 一次重试,无阻塞 (L481894) | 潜在的降级结果 | | 自动模式分类器不可用 | 回退 `"Classifier unavailable"` → 隐式宽松决策 (L400625) | 工具调用在无分类器的情况下被批准 | | Datadog 刷新失败 | 仅记录日志,不重试 (L134139) | 静默丢失事件 | | Foundry skip-auth | `() => Promise.resolve("")` → 仍然发送空 Bearer (L122147) | 带有空 token 的请求发往生产环境 | ## 11. 对我们 orchestrator.js 的启发 ### 11.1 应借鉴 — 直接适用 **任务管理器** : 我们的 `src/orchestrator.js` 将任务作为单体实体管理。任务队列 (`TaskCreate`) + 分配 (`TaskUpdate owner`) + 输出流 (`TaskOutput`) 的分离更具可组合性。与我们的 `mission.enqueue` + `plan.phase` 概念一致。 **扁平拓扑强制** : 我们的编排器已支持 hub-spoke 模型 (非递归 worker),但在协议层面没有强制执行。在 `handleWorkerMessage` 中添加防护 `if (msg.params.parentWorker) throw`。 **TransactionalReserve+Rollback** (模式 `mCH` + `l_$`, CFG agent_team_dispatch B5) : 我们的 `WorkerPool.spawn()` 应该在初始化之前将身份写入注册表,然后在初始化失败时原子回滚。目前,失败的 spawn 可能会在注册表中留下“幽灵”worker。 **Hook `TeammateIdle`** : 我们的 `WorkerProfile.affinity` 路由可以从 worker 没有更多任务时发出的 `workerIdle` hook 中受益。这将允许无需轮询的动态重新路由。 **Telegram 桥接的正式状态机** : 状态 `connecting → active → reconnecting → failed` (L313103-L313106) 用于我们的 `telegram-bridge.js`。目前状态是隐式的。 **AFK 锁存模式** : 我们的 `/loop` (Claude Code 中的 `ScheduleWakeup` + `CronCreate`) 可以从会话模式锁存中受益。当用户启动 `/loop` 时,在全局会话状态中锁存一个“autonomous”标志,并在中断或完成时妥善重置。 ### 11.2 应适配 — 需谨慎 **Advisor 双门控** : “分别验证基础模型 + 验证 advisor 模型
标签:AI助手, AI安全, API安全, Chat Copilot, CISA项目, Claude Code, Conpot, Datadog, IP 地址批量处理, JSON输出, JWT, macOS安全, Modbus, OIDC, RFC 7523, RFC 8693, TLS抓取, Token Exchange, Windows安全, 二进制分析, 云安全运维, 云资产清单, 企业安全, 协议分析, 数据展示, 数据遥测, 权限提升, 沙箱逃逸, 漏洞分析, 知识库安全, 红队, 网络安全, 网络资产管理, 自定义脚本, 路径探测, 软件安全, 远程控制, 逆向工程, 隐私保护