Claude Code 源码泄露事件

2026 年 3 月 30 日,Anthropic 将 Claude Code v2.1.88 发布到 npm。该包是压缩过的——但意外地包含了 .map 文件...

Claude Code 源码泄露事件
微信 ezpoda免费咨询:AI编程 | AI模型微调| AI私有化部署
AI工具导航 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo

2026 年 3 月 30 日,Anthropic 将 Claude Code v2.1.88 发布到 npm。该包是压缩过的——但意外地包含了完整的 .map 文件。

Source map 是由 JS/TS 打包工具生成的调试产物。它将压缩后的输出映射回原始源代码、文件结构、注释和内部逻辑。在开发环境中,它是必不可少的。但在已发布的 npm 包中,它就是你的完整源代码重构——任何人都可以通过运行 npm pack 或直接浏览注册表获取。无需漏洞利用、无需凭据、无需特殊权限。

安全研究员 Chaofan Shou 于 3 月 31 日约 08:23 UTC 公开指出了这一问题。该帖子累计获得了超过 2800 万次浏览。数小时内,一个重构后的镜像出现在 GitHub 上,超过了 84,000 颗星和 82,000 个 fork。Anthropic 在同一天撤回了该版本。

"没有敏感的客户数据或凭据被涉及或泄露。这是由人为错误导致的发布打包问题,不是安全漏洞。" —— Anthropic 发言人
None

1、泄露了什么——以及为什么它如此有价值

Source map 揭示了大约 2,000 个 TypeScript 文件 和超过 512,000 行代码。但原始大小并不是重点。重点是这个系统最终被证明是什么样的。

大多数人以为 Claude Code 只是 Anthropic API 的一个精美的 CLI 封装。泄露的内容展示了一个复杂得多的东西:一个完整的多智能体生产系统,自 2024 年 8 月以来一直在悄然发展,现在被超过 100,000 名开发者使用,并且几乎完全由 AI 生成的代码构建。

2、架构

代码库组织成不同的层次:

  • UI 层 — 基于类 React 系统的自定义终端渲染器(ink/components/screens/
  • 命令层 — 通过 Commander.js 的 CLI 子命令(commands/
  • 智能体与编排层 — 多智能体协调、子智能体生成、任务队列(coordinator/tasks/
  • 工具层 — 模块化功能:文件读写、bash 执行、Web 搜索、MCP 集成(tools/)
  • 服务层 — API 调用、压缩、OAuth、遥测(services/
  • 基础设施层 — 连接 IDE 扩展的桥梁、状态管理、会话持久化(bridge/state/

这不是演示。这是一个带有熔断器、重试逻辑、优雅关闭处理和企业级安全实践的生产系统——全部运行在你的终端中。

3、工具系统

Claude Code 拥有的每一项功能都实现为一个独立的工具,每个工具都有自己的提示词、输入模式和执行逻辑。泄露的代码清楚地展示了每个工具如何向模型描述、它需要什么权限,以及结果如何反馈到上下文中。这包括:

  • BashTool — 包含 2,593 行 shell 注入防御代码
  • FileReadToolFileWriteToolFileEditTool
  • GlobToolGrepTool — 用于代码库导航
  • AgentTool — 用于生成子智能体
  • WebFetchToolWebSearchTool
  • 用于外部工具服务器的 MCP 客户端集成

4、内存与上下文系统

最有价值的技术披露之一是 Claude Code 如何在长时间会话中管理上下文。系统使用四阶段上下文管理流水线来处理模型的固定上下文窗口:

  • 原始消息累积
  • 选择性压缩——总结较早的对话轮次,同时保留关键状态
  • 内存注入——从之前的会话中重新插入相关上下文
  • 溢出处理——当接近限制时优雅降级

CLAUDE.md 层级结构也有文档记录:来自 /etc/claude-code/CLAUDE.md 的全局指令,来自 ~/.claude/CLAUDE.md 的用户级指令,来自 CLAUDE.md.claude/rules/*.md 的项目级指令,以及来自 CLAUDE.local.md 的私有项目指令。这种多层内存系统使得 Claude Code 能够跨会话和项目保持一致的行为。

5、内部提示词与未发布功能

每一个系统提示词现在都是公开的。这不仅包括主要的助手提示词,还包括特定工具的提示词、子智能体的提示词,以及控制 Claude Code 在不同模式下行为的提示词。对于一个部分依赖于精心调优的模型行为的产品来说,这些提示词被完整记录和可复现是意义重大的。

未发布功能

几个从未公布的特性现在都有完整的文档:

  • KAIROS — 一个持久的后台智能体模式,可以自主运行任务、无需等待用户输入即可修复错误,并发送推送通知。
  • Dream Mode — 持续的后台推理模式,旨在独立开发和迭代想法。
  • Undercover Mode — 最受讨论的发现。一个系统提示词指示工具:"你正在 PUBLIC/OPEN-SOURCE 仓库中以 UNDERCOVER 模式运行。你的提交信息、PR 标题和 PR 描述 MUST NOT 包含 ANY Anthropic 内部信息。不要暴露你的身份。"
  • 反蒸馏污染 — 如果竞争对手试图抓取 Claude Code 输出来训练自己的模型,这些控制会在 API 响应中注入虚假的工具定义。
"你正在 PUBLIC/OPEN-SOURCE 仓库中以 UNDERCOVER 模式运行。你的提交信息、PR 标题和 PR 描述 MUST NOT 包含 ANY Anthropic 内部信息。不要暴露你的身份。"

6、安全后果

这次泄露比简单的知识产权披露更为严重。

AI 安全公司 Straiker 指出,攻击者现在可以精确研究数据如何流经 Claude Code 的内部上下文管道,并专门制作能够存活于上下文压缩的载荷——有效地在任意长的会话中持久存在。当架构被完全文档化后,不再需要盲目的越狱尝试。

泄露还暴露了从未打算公开的内部依赖名称——在披露后数小时内,直接引发了 npm 上的仿冒攻击活动。

7、为什么这种事情不断发生

三个流程漏洞使这次泄露成为可能——并让它发生了两次:

  1. 没有发布前 CI 检查 — 检测构建输出中是否存在 source map 是轻而易举的事情,但之前并没有检查。
  2. 过度依赖代码压缩 — 代码压缩可以混淆代码,但不是安全边界。Source map 会完全还原它。将压缩视为保护层是一个错误的假设。
  3. 没有内部包名保留 — 暴露的依赖名称未在公共 npm 注册表中注册,使它们可以立即被恶意行为者抢注。

8、如何防止这种情况

Claude Code 泄露并非罕见的失败。它是一个广为人知的风险,会影响任何发布 JS/TS 包的团队。好消息是:这个失败的每一层都有直接的解决方案。

1. 在打包工具级别排除 Source Map

第一道防线是配置。每个主流打包工具都支持排除 source map:

// esbuild
{ "sourcemap": false }

// tsconfig / tsc
{ "sourceMap": false }

// rollup
{ "sourcemap": false }

// webpack
{ "devtool": false }

// vite
// vite.config.ts
build: { sourcemap: false }

对于在开发期间内部需要 source map 但在发布输出中不需要的包,使用构建配置文件——一个用于本地开发(启用 source map)的配置,另一个用于生产(禁用 source map)的独立配置。

2. 添加发布前 CI 检查

配置可能会漂移。人们会忘记。构建工具会变化。一个 CI 门控,如果检测到 source map 就主动使发布步骤失败,可以将配置设置转变为硬性保证:

# 如果在 dist/ 目录中发现任何 .map 文件,使发布失败
if find dist/ -name "*.map" | grep -q .; then
  echo "ERROR: sourcemap files found in dist/. Aborting publish."
  exit 1
fi

将此作为发布流水线中的一个步骤,在 npm publish 运行之前执行。它无需任何成本,就能捕获导致整个事件的错误类型。

3. 使用 .npmignorepackage.json 中的 files 字段

即使 source map 在构建步骤中漏掉了,你也可以完全防止它们被包含在发布的包中。有两种方式:

选项 A — .npmignore

# .npmignore
dist/**/*.map
*.map

选项 B — package.json 中的显式 files 允许列表(推荐):

{
  "files": [
    "dist/**/*.js",
    "dist/**/*.d.ts",
    "README.md"
  ]
}

files 允许列表比 .npmignore 更安全,因为它使用显式的包含模型——只有你列出的内容才会被发布。默认情况下,其他所有内容都被排除。你不可能意外包含你不想发布的文件。

4–6. 供应链安全基础

  • 发布前审计: 运行 npm pack --dry-run(或解压 tarball)以验证将要发布的确切文件——source map 永远不应该被包含。
  • 保留内部包名: 在 npm 上发布空的占位符包,以防止在内部名称泄露时被仿冒。
  • 自动化依赖监控: 使用 npm audit、CI 中的锁文件检查、Dependabot/Renovate 和完整性检查等工具,以快速检测受损的依赖。

9、结束语

一个缺失的 CI 检查导致了 AI 领域最受关注的开发者工具之一的完整源代码泄露。镜像是永久性的。未发布功能现在已被记录。内部架构是公开的。

修复很简单。失败是系统性的。下游后果——仿冒攻击活动、越狱攻击的更清晰攻击面、竞争对手获得的蓝图——将比事件本身更持久。


原文链接: Claude Code Leak

汇智网翻译整理,转载请标明出处