事件始末
美国东部时间 2026 年 3 月 31 日凌晨 4 点 23 分,安全研究者 Chaofan Shou 在 X 发布推文, 发现 Anthropic 发布到 npm 的 Claude Code 包中,官方没有删除 source map 文件, 这意味着 Claude Code 的完整 TypeScript 源码全部泄露, 包含 1902 个源文件以及 513,237 行代码,但不包括服务端的模型训练代码和 API 后端逻辑。
为什么会发生源码泄露?
- 将 JavaScript/TypeScript 包发布到 npm 时,构建工具链通常会生成 source map 文件(.map 文件)。这些文件能将压缩后的生产代码与原始源码关联起来,方便进行调试
- Source maps 包含原始源代码,这些源代码以字符串形式嵌入在 JSON 文件的 sourcesContent 键下。如下所示:
{
"version": 3,
"sources": ["../src/main.tsx", "../src/tools/BashTool.ts", "..."],
"sourcesContent": ["// The ENTIRE original source code of each file", "..."],
"mappings": "AAAA,SAAS,OAAO..."
}
- 当
*.map未添加到.npmignore,或者未在生产环境下禁用 source maps 时,完整的原始源代码将会被上传到 npm 注册表
整体架构
ClaudeCode 采用"CLI 引导层 → TUI/REPL 交互层 → Query/Agent 执行内核 → Tool/Permission 层 → Memory/Persistence 层 → MCP/Remote/Swarm 扩展层"的六层分层结构

- 程序入口:
main.tsx是程序主入口,也是系统编排中心;该入口可通过解析 CLI 参数来触发不同的执行路径(权限/模型/工具等);entrypoints/cli.tsx则承担入口分流的作用,通过快路径的识别和退出(比如输出版本、日志追踪、查看系统提示等),避免完整应用的启动 - 初始化层:分成逻辑初始化(
entrypoints/init.ts)和环境初始化(setup.ts)两个阶段;逻辑初始化包括配置加载、安全证书配置、遥测(可关闭)与 React 组件延迟加载、API 接口预热(减少请求延迟);环境初始化包括版本与环境安全检查、tmux/worktree 快照(包括会话和独立工作区)、记忆初始化、后台服务(hooks 监听、文件访问、内存监控)异步加载 - 控制面/命令层:
commands.ts是所有命令的注册中心、加载器和过滤器,负责所有内部指令的定义和聚合,能够动态加载外部命令(skills,插件、工作流),并进行权限控制与缓存管理,并决定最终可暴露的 API - TUI/REPL 层:
REPL组件是用户与 Claude Code 交互的主要界面,包括处理用户输入(文本、命令、附件)、渲染对话消息流、管理查询生命周期(发起、流式响应、中断)、协调所有弹窗、权限请求、通知和底部面板;其底层还有一套全局状态管理(AppStateStore.ts)做支撑 - 执行内核:系统的核心主循环,包括上下文组装(记忆注入)、Claude API 调用、工具管理与执行(并发/串行)、上下文压缩检查、hook 执行
- Tool 与 Permission 层:
Tool.ts定义了所有工具的接口、类型、上下文和辅助函数(也包括工具的协议与规范);工具执行编排器toolOrchestration.ts根据工具的只读性和并发安全性,制定工具并发/串行执行策略、实现高效而安全地批量运行工具 - Memory 与 Persistence 层:
sessionStorage.ts负责会话的原始数据存储 ,包含每一轮对话、工具调用和元数据,支持远程同步;memdir.ts管理长期记忆系统,维护MEMORY.md索引文件和分类记忆文件,为模型提供跨会话的上下文;sessionMemory.ts负责会话的摘要总结与记忆写入 - 扩展层:主要包括外部能力扩展(MCP/Plugin)或内部协作管理(Swarm/多 Agent 协作)
ClaudeCode 支持多种运行形态,共用一套执行内核
- REPL/TUI 形态(默认):动态加载+循环渲染的交互会话
- Headless / SDK 形态:无 UI 的执行引擎,基于 SDK 的实例化
- MCP Server 形态:作为 MCP 的客户端/服务器,对外暴露能力
- Remote / Bridge 形态:本地与远程混合的 agent 平台
流程梳理:
- 启动与初始化,环境检查、配置加载、预热网络,服务延迟加载
- 装配能力,命令过滤与聚合,准备内置工具、MCP、subagent 和 skills
- 启动 REPL,管理对话界面,接收用户输入,调用 Anthropic API 流式响应
- 工具权限校验与执行,工具结果回流,并继续下一轮的 API 调用
- 会话与记忆管理,会话存储,自动提取摘要,上下文控制与压缩
架构特点总结:
- 多入口与异步流式:cli.tsx 做早期入口分流,main.tsx 是真正编排中心,两者职责分离;整个对话循环形成一个异步交互响应的事件流,能实时展现给用户其中中间状态(思考过程、工具调用计划、执行进度)
- 成熟的权限安全边界:Claude Code 的权限管理嵌入到了其核心 pipeline 中,从需求触发到结果反馈的过程中,存在工具可见性过滤、输入校验、权限分级与决策、沙盒保护、输出限制等多个安全检查点
- 平台化设计:设计上分层解耦,UI、工具层、memory 层、扩展层各自独立,执行内核居中协调;功能模块包含独立执行内核、权限系统、memory 体系和多 agent 协作
安全分析
用户信息收集
(1)注入模型的上下文信息,风险最高
- 用户输入的所有对话内容、图片与附件、文件内容与代码片段
- 第三方插件/工具结果,包括 MCP 返回内容、工具执行结果
- Git 状态快照、CLAUDE.md 与 memory 文件
(2)本地持久化存储结果
- 每次对话完整内容及其元数据,agent 运行记录
- 用户配置信息、项目配置信息、账户缓存、memory 文件
(3)从对话中提炼的长期记忆,最隐蔽
- 用户偏好与习惯、身份背景(职位、语言、技术栈)
- 项目关键信息、参考资料与项目约束条件
- 会话摘要、agent 记忆、团队共享记忆
(4)遥测数据,由系统主动向外发送的统计数据(不包含源码)
- 设备标识、会话标识、软件和系统版本、运行环境
- 账户和组织标识、订阅类型与配额级别
- 远程仓库的哈希标识、工具调用次数、文件的哈希指纹
(5)团队同步与上传(Team Memory)
- 自动进行本地记忆的推送 push 与团队记忆的拉取 pull
- 可能包含项目流程、内网知识库、运维路径、团队规章等敏感内容
(6)用户主动发送的内容,最透明
- 用户提交反馈时,会自动上传后会话记录(代码会做一定脱敏)
- 用户开启“帮助改善 Claude”后,其编码和对话可能被用于模型训练
代码安全分析
提示词注入(Prompt Injection)
- 攻击者可以在一个开源仓库的代码注释里隐藏指令,Claude 可能被诱导执行恶意操作
- 应对方案(1)NFKC 规范化,对字符进行分解、安全过滤和规范化重组,消除格式/样式差异,可能丢失部分语义(2)删除危险的 Unicode 分类字符,避免隐蔽的 Unicode 隐写攻击(3)显式删除已知危险范围内的字符,进行风险保障与兜底
Unicode 隐写攻击:攻击者利用 Unicode 标准中不可见字符、同形字符或控制字符,在看似正常的文本中隐藏信息或篡改语义,从而绕过安全检测、欺骗用户或执行恶意操作
危险范围内的字符:零宽字符,在屏幕上完全不显示但存在于文本数据中;方向性格式字符,可用于文字反转欺骗;方向隔离字符、字节顺序标记、私有使用区字符等
Shell 命令注入
- 攻击者能让模型生成含有恶意载荷的命令字符串,就可能劫持宿主机
- 应对方案:在自动批准模式(auto)下,对宽泛授权进行自动撤销,避免 AI 无限制运行任意 Python/Node 等脚本(其危险程度等同于系统管理员权限)
Git 逃逸攻击
- 攻击者在沙盒内创建假仓库并注入恶意 hook,让沙盒外的 Git 操作触发沙盒内的攻击
- 应对方案:命令执行完毕后,强制扫描并清空沙盒内被植入的 Git 裸库文件
MCP 服务器的不可信输入
- 不受信任的 MCP 服务器可能返回带有恶意指令的"工具结果"
- 应对方案(1)清洗 MCP 服务的返回结果,比如 Unicode 危险字符(2)独立权限认证系统,控制 MCP 的访问权限(3)利用白名单,限制 MCP 触发的文件写入操作
安全性防范
(1)双重权限闸门,应用层进行逻辑拦截,系统层通过沙盒进行内核级隔离 (2)白名单驱动的细粒度权限控制;热更新同步配置,避免时间窗口逃逸 (3)多层级的权限模式,覆盖严格到宽松(避免 bypassPermissions)多种场景 (4)客户端密钥扫描,避免用户意外把 API 密钥、访问令牌等敏感凭据上传 (5)遥测数据的隐私隔离设计,个人信息路由保护+MCP 工具名脱敏 (6)路径安全验证,对所有文件路径操作进行了防御性校验
如何规避或降低用户信息的收集
- 不让敏感内容进入模型上下文,比如密钥、证书或客户数据
- 定期清理本地存储的会话和记忆,避免长期的持久化
- 不开启同步、遥测、团队分享和远程能力
核心机制
记忆系统
多层文件化记忆系统:把不同生命周期、不同作用域、不同可见性的内容分开保存
记忆内容分类:
Auto Memory是面向整个用户和项目协作过程的长期记忆Session Memory当前会话摘要,辅助上下文压缩和长会话持续运行Agent Memory面向某个 agent 类型的持久记忆,和 agent 定义直接绑定Team Memory面向团队共享的项目级知识与规范同步
记忆的作用域
user跨项目复用的 agent 长期记忆project当前项目内共享的 agent 记忆local当前项目、当前机器或当前挂载环境的本地 agent 记忆
记忆系统的优点:
- 透明与可治理:记忆是用户可见、可编辑的 Markdown 文件。不同层级可以独立开关、同步和约束。
- 检索成本可控:通过调用轻量模型选择最相关的 5个 记忆文件内容注入上下文,而非全量召回;历史对话内容检索直接依赖 AI 自主决定的 grep 文本搜索,该方式优于复杂的 RAG 策略(工程复杂度显著下降)
- 严格的权限与沙箱:特定记忆的更新权限被严格限制在单个特定文件,增加路径约束和边界校验
- 记忆注入限制:只存指针,不存内容;最多 200 行,最大 25KB;对超出部分内容进行裁剪,并追加 Warning
- 多级压缩策略:(1)裁剪过久的对话片段(2)清理旧的工具执行结果,卸载到缓存里(3)对中间的对话做折叠摘要,只保留关键信息(4)当上下文占用超过阈值时,触发全量摘要自动压缩,最多允许失败 3 次(5)当 API 返回 413 “提示词太长” 错误时,紧急触发兜底的应急压缩
一套包含触发、预处理、智能裁剪、状态恢复的工程流程,确保了超过模型上下文限制的长会话能够继续稳定运行,避免生成 API 无法处理的孤立消息
Agent 协作
(1)协作模式
- 当
CLAUDE_CODE_COORDINATOR_MODE=1时,Claude Code 进入协作模式 - 协作者只能使用 Agent 管理、任务停止、消息传递等功能,不能直接操作文件
- 只有不同工作者(子 Agent)才能使用命令行工具、进行文本操作(读写)
(2)团队模式(Swarms)
- Claude Code 内建工具系统支持的多 Agent 团队合作模式
- 该内置工具支持团队的基本管理,包括增删成员、消息传递等功能
(3)子 Agent 的执行
- 每个子 Agent 都有独立的系统提示、文件隔离,能够进行独立的观察、工作和调试,每个子 Agent 也存在工具限制,并且默认不能衍生新的子 Agent (防止无限递归)
- Fork Subagent 是另一种更轻量的子 Agent,其会继承父 Agent 的完整上下文,在保持效率的同时,通过提示缓存共享来降低成本;权限请求会上浮到父 agent ,再由用户确认
性能改进
(1)系统提示的缓存分裂
- Anthropic 的 API 支持系统提示的缓存,提高请求的复用,避免反复处理
- 由于系统提示词前半部分都不变,因此 API 可以直接缓存这部分静态内容
- 而后半部分内容(比如 Claude.md,Git 状态),则每个用户各不相同,独立加载
边缘案例
(1)配置文件的信任分级
CLAUDE.md文件有四个信任层级,从高到低为:Managed(系统级) >User(用户级) >Project(项目级) >Local(本地规则)- 系统硬性限制了嵌套深度上限为 5 层,避免递归解析攻击(DoS)
- 在信任建立前,系统仅应用“安全”的环境变量,缩小注入攻击的窗口
(2)多 agent 架构的上下文同步
- 当生成子 Agent 时,系统会执行深拷贝(deepCopy)父 Agent 的上下文快照给子 Agent
- 子 Agent 执行完毕后,其对上下文(如权限模式、工作目录)的修改通过回流
- 所有修改执行按照固定顺序统一应用,保持父 Agent 的上下文原子化(避免反复修改与混乱)
(3)隐私耦合的主动切断设计
- 将“隐私安全”从运行时检查(可能被绕过或遗忘)前移到编译时强制确认,从源头防止意外泄漏
- 输入字段在进入存储或网络之前,会被自动“清洗”一遍,剥离其中可能携带的隐蔽标识或格式化信息
- 遥测数据不绑定任何长期稳定的用户身份,从数据源头就切断了隐私耦合
有趣发现
封号机制
封号逻辑总结:
| 排名 | 原因 | 风险等级 | 说明 |
|---|---|---|---|
| 1 | 订阅滥用/共享账号 | 极高 | Device ID 跨设备关联,检测多设备共享同一账号 |
| 2 | 速率限制违规 | 高 | 超出 rateLimitTier 配额,短时间高频调用 |
| 3 | 内容策略违规 | 高 | 消息内容指纹 + anti-distillation 检测 |
| 4 | 自动化滥用 | 中 | CI/CD 环境检测 + 非交互模式识别 + 异常 token 消耗 |
| 5 | 使用非官方客户端/篡改 | 中 | 指纹校验失败 + 版本归因 header 异常 |
数据采集体系:
| 层级 | 内容 | 目的 |
|---|---|---|
| 身份层 | Device ID + Account UUID + Email + Fingerprint | 精确追踪用户 |
| 环境层 | OS + 架构 + 终端 + CI + 容器 + 部署环境 | 构建设备指纹 |
| 行为层 | 640+ 事件 + Token 用量 + 工具调用 + 进程资源 | 分析使用模式 |
三层数据实时上报,形成对每个用户完整的使用画像,从多个维度检测异常并触发封号决策
挫败感知
负面关键词检测:
- 用正则匹配 wtf、this sucks、damn it 之类词汇
- 在用户提交 prompt 时,快速给输入打一个“负面情绪/不满”标签
- 最后写进埋点事件,作为产品分析和体验评估的轻量信号
不是安全过滤器,也不是内容审查器,更不是用来拦截用户输入的
该机制的工程目的:
- 识别明显的挫败/抱怨输入,作为用户对产品状态的即时反馈信号
- 给后端分析一个廉价而稳定的标签,成本低/延迟低/稳定/易统计
- 作为更复杂体验系统的前置信号,纳入后续的挫败感信号维度分析
- 为反馈收集和质量改进提供触发条件,自动弹出反馈和分享提示
缺点:召回有限、存在误报、语言覆盖差(仅限英语)、不够全面
隐藏彩蛋
内部专属命令
- 隐藏方式(1)身份判断(2)仅编译时期可见(3)命令对象的不可用属性
- 隐藏命令中主要包括一些特殊的高权限指令(比如破坏缓存,会话回填,内部评分,强制修剪历史,强制刷新权限,超级 plan 模式/30 分钟深度思考,重置 token 等)和待废弃的过渡期命令
Undercover 模式
- 当 Claude Code 判断自己可能在一个公开仓库中工作时,它会自动隐藏所有与 Anthropic 内部相关的痕迹(安全外围加固),并指示模型以普通人类的身份编写提交信息
- 通过设置
CLAUDE_CODE_UNDERCOVER=1环境变量可强制激活该模式 - 核心目的:防止向公开/开源仓库提交代码时泄露公司内部信息(模型代号、版本等)
反蒸馏与投毒
- Claude Code 在向服务端发请求时会带上
anti_distillation: ['fake_tools'],该请求表示要求服务端在系统提示词里偷偷插入一些“假的工具定义”,以此混入伪造工具来“污染”蒸馏数据 - 在某些场景下,服务端会把工具调用之间的文本先做摘要处理,然后配合签名返回,后续轮次再通过签名恢复,,这样抓包的人只能拿到摘要,而不是完整的中间文本
- 原生客户端 API 请求里会先放一个哈希校验值,服务器用此来判断是否为伪造客户端
KAIROS,后台常驻的自治 Agent
- 一个持续运行、长期积累上下文、自动响应外部事件的 agent 系统(尚未发布)
- 例如有一个
/dream技能用于“夜间记忆蒸馏”、每天日志追加、后台 daemon worker 等
Buddy 电子宠物系统
- 展示形式:输入框旁边坐着一个小生物,会偶尔在气泡里评论
- 其背后是一套完整人格化子系统,具备稳定的骨架和灵魂,不能随意更改
- 稀有度、眼睛、帽子和属性都做成了完整抽卡规则(闪光宠物概率为 1%)
- 有完整的上线节奏、发现机制和投放路径,孵化上线期是 2026 年 4 月 1 日
- 内置完整的小状态机,可用于交互(爱心上浮动画,说话气泡与免遮挡)
网友还原的 buddy 原型:
duck
__
<(◉ )___
( ._>
`--´
goose
(◉>
||
_(__)_
^^^^
blob
.----.
( ◉ ◉ )
( )
`----´
cat
/\_/\
( ◉ ◉)
( ω )
(")_(")
dragon
/^\ /^\
< ◉ ◉ >
( ~~ )
`-vvvv-´
octopus
.----.
( ◉ ◉ )
(______)
/\/\/\/\
owl
/\ /\
((◉)(◉))
( >< )
`----´
penguin
.---.
(◉>◉)
/( )\
`---´
turtle
_,--._
( ◉ ◉ )
/[______]\
`` ``
snail
◉ .--.
\ ( @ )
\_`--´
~~~~~~~
ghost
.----.
/ ◉ ◉ \
| |
~`~``~`~
axolotl
}~(______)~{
}~(◉ .. ◉)~{
( .--. )
(_/ \_)
capybara
n______n
( ◉ ◉ )
( oo )
`------´
cactus
n ____ n
| |◉ ◉| |
|_| |_|
| |
robot
.[||].
[ ◉ ◉ ]
[ ==== ]
`------´
rabbit
(\__/)
( ◉ ◉ )
=( .. )=
(")__(")
mushroom
.-o-OO-o-.
(__________)
|◉ ◉|
|____|
chonk
/\ /\
( ◉ ◉ )
( .. )
`------´
核心提示词
本小节内容摘录自 Claude Code 系统提示词大公开
(1)核心身份与任务定义
You are an interactive agent that helps users with software engineering tasks.
Use the instructions below and the tools available to you to assist the user.
IMPORTANT: You must NEVER generate or guess URLs for the user unless you are
confident that the URLs are for helping the user with programming.
- 核心身份:定义一个“帮助用户解决软件工程任务的交互式代理”
- 安全边界:明确标识为“AI 编程助手”,同时划定安全边界(不随意生成 URL)
(2)系统运作机制
# System
- All text you output outside of tool use is displayed to the user.
- Tools are executed in a user-selected permission mode.
- Tool results and user messages may include <system-reminder> tags.
- The system will automatically compress prior messages as it approaches context limits.
- 明确告知模型它的文本输出会直接显示给用户,而工具调用则为后端执行
- 告知模型系统具备自动压缩历史对话(突破长度限制)的能力,引入权限模式概念
(3)任务执行准则
# Doing tasks - The user will primarily request you to perform software engineering tasks: - solving bugs, adding new functionality, refactoring code, explaining code... - You are highly capable and often allow users to complete ambitious tasks. - In general, do not propose changes to code you haven't read. - Do not create files unless they're absolutely necessary. - Be careful not to introduce security vulnerabilities such as command injection, XSS, SQL injection, and other OWASP top 10 vulnerabilities
- Don't add features, refactor code, or make "improvements" beyond what was asked.
- Don't add error handling, fallbacks, or validation for scenarios that can't happen.
- Don't create helpers, utilities, or abstractions for one-time operations.
- Don't add docstrings, comments, or type annotations to code you didn't change.
- Default to writing no comments. Only add one when the WHY is non-obvious.
- Don't explain WHAT the code does, since well-named identifiers already do that.
- 代码修改原则:核心是 “先读代码,再改代码” ,杜绝盲目修改
- 代码风格约束:不做额外的美化、抽象、注释,只解决实际问题
(4)行动安全边界
# Executing actions with care
Carefully consider the reversibility and blast radius of actions.
- Local, reversible actions like editing files or running tests: OK
- Hard-to-reverse or risky actions: CHECK WITH USER FIRST
Examples of risky actions:
- Destructive: deleting files/branches, dropping database tables, rm -rf
- Hard-to-reverse: force-pushing, git reset --hard, amending published commits
- Visible to others: pushing code, creating/closing PRs, sending messages
- 明确需要确定的“高风险操作”(如删除分支/文件,代码提交重置/强制推送)
(5)工具使用规范
# Using your tools
- To read files use Read instead of cat, head, tail, or sed
- To edit files use Edit instead of sed or awk
- To create files use Write instead of cat with heredoc or echo redirection
- Reserve using Bash exclusively for system commands
You can call multiple tools in a single response. Maximize use of parallel
tool calls where possible to increase efficiency.
- 使用 Read, Edit, Write 等专用工具,代替通用命令,以提高效率和安全性
- 鼓励在一次响应中 “最大化使用并行工具调用” ,从而提升整体效率
(6)输出风格
# Tone and style
- Only use emojis if the user explicitly requests it.
- Your responses should be short and concise.
- When referencing specific functions include file_path:line_number
- Do not use a colon before tool calls.
# Output efficiency
IMPORTANT: Go straight to the point. Try the simplest approach first.
Keep your text output brief and direct.
Focus on:
- Decisions that need the user's input
- High-level status updates at natural milestones
- Errors or blockers that change the plan
- 回复要简洁明了,不使用表情包(除非用户要求)
- 注意精准引用,关注用户需要输入的关键决策和错误信息
相关资料
Claude Code 源码分析
Claude Code 完整架构解析
泄露源码存档-包含可直接运行版
御舆:解码 Agent Harness,Claude Code 架构深度解析
Claude Code 源码里有意思设定:伪造、投毒、卧底、封号
一场泄露看懂 Claude Code:Harness 是让 Agent 干活靠谱的关键