图片

01 事件起因:一个 10KB 的“内应”

就在刚刚,Anthropic 推出的 AI 编程工具 Claude Code 发生了一次严重的泄露事件。泄露的源头是一个名为 Source Map 的辅助文件。

简单来说,Source Map 的作用是把压缩过、人类看不懂的代码,重新映射回原始的代码。Anthropic 在分发产品时,不小心把这个文件也放了进去,导致其闭源堡垒在技术层面处于“裸奔”状态。

闭源工具的安全性,本质上取决于“阅读门槛”。 当门槛被抹平,所有的秘密都成了明牌。

02 核心泄露:谁是“蚂蚁(Ant)”?

“Ant” 不是一个普通的用户标签,而是 Claude Code 的内部身份面 (Ant 也是 Anthropic 的前三个字母)。源码里它不是挂在某个按钮上,而是出现在命令表、工具表、状态表、桥接层和调试入口里。换句话说,它控制的不是一个功能,而是一整套可见性规则。

如果只看实用价值,Ant 特有能力不是“多几个隐藏命令”这么简单,而是把 Claude Code 从一个聊天式 CLI,变成一个可运维、可回放、可管控的内部工作台。它真正有价值的地方,是把会话、配置、终端和任务流变成了可操作对象。

图片

1)会话治理:能看、能查、能导出。

  • • files:直接看到当前上下文里有哪些文件。这个功能很朴素,但价值很大,因为它让内部人员知道“模型现在到底在看什么”。

  • • tag:给会话挂可搜索标签。对大量会话复盘、归档、检索很有用。

  • • version:打印当前 session 跑的具体版本,排查问题时能立刻区分“是哪个构建出的错”。

  • • log / error / export:看对话日志、查错误日志、把会话导出成文本。这三个组合起来,就是内部排障、审计、交接的最短路径。

  • • summary / share / backfill-sessions:把历史会话补回来、整理成摘要、发给别人。它们更像内部协作工具,而不是普通聊天功能。

  • • ctx_viz / antTrace / perfIssue / debugToolCall:做上下文、性能和工具调用级别的诊断。这类功能的价值在于“复盘”,不是“炫技”。

2)配置治理:能直接改运行中的 Claude Code。

  • • ConfigTool 是 ant-only 的重点能力。它可以读取和修改 Claude Code 的配置,覆盖 thememodelpermissions.defaultModeremoteControlAtStartup 等关键项。

  • • 它不是一个简单的设置面板,而是把配置当成可调用工具。读配置默认放行,写配置要确认。对内部人员来说,这比手工改 JSON 文件快得多,也稳得多。

  • • remoteControlAtStartup 还能回退到平台默认值;voiceEnabled 还会再走一层 GrowthBook kill switch。说明它管的不只是“值”,还有“是否允许这个值存在”。

3)终端控制:把一个 shell 变成可监控的单例终端。

  • • TungstenTool 是最像“内部运维武器”的功能。源码把它描述成单例虚拟终端抽象,和多智能体会冲突,所以普通 async agent 会被排除。

  • • 它会维护 tungstenActiveSessiontungstenPanelVisibletungstenLastCommand 这些状态,还会把 Claude 的 TMUX 环境注入子进程,让后续 Bash 命令走 Claude 自己的 socket。

  • • 这意味着它不是普通终端工具,而是“远程观察 + 持久控制 + 状态回放”的一整套终端层。

  • • REPLTool 则把原始的 BashReadEditGlobGrepNotebookEditAgent 包进一个更高层的执行边界里。对内部流程来说,它更适合批量操作和受控执行。

  • • 从实用角度看,TungstenTool + REPLTool 组合起来,像是把“人肉终端”升级成了“可被程序监督的终端”。

4)任务和运维闭环:内部 workflow 比普通用户完整得多。

  • • tasks 模式会持续监听任务列表并自动处理任务。

  • • task create / list / get / update / dir 让内部任务流真的可管理,不只是模型口头说“我去做”。

  • • up 和 rollback 负责本地开发环境升级与版本回滚。它们把 Claude Code 当成一个可发布、可回退的软件,而不是静态客户端。

  • • completion 负责 shell 补全,但它的意义也很直接:内部人员可以把 CLI 接进自己的日常工作流。

  • • SuggestBackgroundPRToolautofixPrcommit-push-pr 这类入口,指向的是代码修改建议、自动修复和提交流程。这部分是典型的“把 AI 接进研发流水线”。

5)远程与协作:把本地 CLI 接到更大的内部系统。

  • • bridgeKickteleportoauthRefreshenvremoteControlAtStartup 这些入口,围绕的是远程会话、认证刷新和环境接管。

  • • bridge / remote-control / assistant / CCR 相关路径说明,Ant 构建里的内部协作路径比普通版本更完整,但这组能力并不全是严格 ant-only。

  • • 这部分的实用价值很高,但也最依赖账号、设备和后端授权,不是单靠本地就能完整复刻。

如果只挑最值得关注的 Ant 特有功能,可以是:

真正的结论很简单:Ant 特有功能的价值,不在于“多几个命令”,而在于它把 Claude Code 变成了一个可治理、可回放、可控终端、可接入研发流程的内部操作系统。


03 揭秘:如何伪装成“员工”运行?

【技术免责声明】:以下内容仅基于泄露源码的逻辑分支进行纯技术层面的逆向分析与推演,旨在探讨闭源产品的权限架构设计。作者本人从未在任何实际运行环境中尝试或复现过上述操作,亦不建议任何读者进行此类尝试。

从源码逻辑来看,解锁内部功能的钥匙是 process.env.USER_TYPE === 'ant'。虽然这只是一个布尔判断,但由于程序在发布时会进行压缩和硬编码,想要“变身”蚂蚁,需要经历从环境注入到代码手术的三个阶段。

图片

1)第一阶段:环境变量注入这是最简单的尝试。在启动 Claude Code 前,通过终端注入身份标识:

  • • macOS/Linux:export USER_TYPE=ant

  • • Windows:$env:USER_TYPE="ant"如果当前构建版本只是动态读取环境变量,那么重启程序后,原本隐藏的内部命令(如 rollbacklog)就会出现在帮助菜单中。

**2)第二阶段:本地二进制补丁(Patching)**如果注入变量无效,说明 Anthropic 在打包时使用了“构建时常量替换”,将判断逻辑硬编码为了 false。此时需要对本地安装的 JS 文件进行“手术”:

  • • 定位:在安装目录的 dist/ 文件夹中搜索 "ant"===process.env.USER_TYPE

  • • 篡改:利用工具将该判断逻辑全局替换为 true(或 1===1)。

  • • 目的:这会强行让程序在初始化时走入 INTERNAL_ONLY_COMMANDS 注册分支,将原本被剔除的 ctx_viz(上下文可视化)等工具强行接回。

**3)验证:如何确认自己“真的命中了”?**仅仅改了名字不代表成功,最稳定的判断方法是观察程序的输出反馈:

  • • 看 help 面:是否出现了带 [ANT-ONLY] 标记的入口,如 --tasks [id]--agent-teams

  • • 看 context 面:执行 /context,Ant 模式会多出 ### [ANT-ONLY] System Tools 等三块专属的调试章节。

  • • 看 cost 面:Ant 分支会强制打印 Showing cost anyway,并吐出精确到小数点的 Token 计费和缓存省下的金额。

**4)最终的天花板:后端鉴权(Gating)**这是最硬核的技术边界:**本地解锁了 UI,不代表后端交出了钥匙。**源码显示,当开启 Ant 模式后,客户端发起的 API 请求会携带特定的 Beta Header(如 Capability.ANTHROPIC_INTERNAL_RESEARCH)。Anthropic 的服务器会对你的 OAuth Token 进行二次扫描。如果你的账号在后台没有“员工标签”,服务器会直接忽略这些请求,甚至返回 403 错误。

结论很冷酷:你可以通过本地手术偷看“运维说明书”,但你永远无法通过“换装”骗过实验室的服务器大门。 这种分层策略的暴露,比泄露一两个命令本身更具杀伤力。

04 拆解:它是如何“自主”工作的?

很多人把 Claude Code 理解成“输入一句话,它立刻给一句答复”。源码里的 src/query.ts 不是这个思路。它更像一个循环调度器:先收集上下文,再压缩旧内容,再补新资料,最后才继续下一轮。它不是一次回答问题,而是一轮一轮把任务做完。

这也是它为什么看起来像“会自己干活”。程序并不依赖你每一步都手动推动。你给出一个目标后,它会先跑一遍检索,再看还缺什么,再继续补。你看到的是“它在思考”,源码里看到的是一条很朴素的执行链。

图片

最关键的一点,是它会先做“整理”,再做“回答”。在代码里,microcompact 会先处理刚刚那一轮最吵的工具输出,autocompact 再在上下文快塞不下时做更大范围的压缩。小白可以把它理解成:先把桌面收干净,再继续写作业。

它不是把内容删掉,而是把内容折叠起来。刚跑完的搜索记录、文件片段、工具返回值,不会一直原样堆在上下文里。程序会把它们压成更短的摘要,只保留后面真正可能用到的部分。这样做的好处很直接:模型不会被一长串无关内容拖偏。

代码里还有一个很实用的机制,叫预取。memory prefetch 和 skill discovery prefetch 的意思都很简单:**先把可能会用到的资料提前准备好。**你还没真正问到那一步,程序就已经在后台把相关记忆、技能、文件片段先读进来。这样一来,下一轮回答就不用从零开始。

如果上下文还是太长,或者模型这次没跑通,它也不会硬撑。源码里能看到 prompt too long 的恢复流程,以及模型 fallback 的重试逻辑。翻成白话就是:题目太大时,它会先换纸,再重写。不是死磕第一版,而是主动换路。

while not done:
    先加载可能用到的记忆和技能
    先压缩上一轮的工具输出
    如果上下文太长:
        压缩后重试
    如果当前模型卡住:
        切换模型继续
    把新结果带进下一轮

所谓“自主”,不是它有意识,而是程序把“继续做下去”写成了默认动作。

05 进化:多智能体“组团开黑”的逻辑

Claude Code 走到团队模式后,逻辑就变了。它不再要求一个智能体把所有事全做完,而是让主智能体充当队长,再把活拆给多个分身。源码里能看到 leaderteammateworkerswarm 这些词。多智能体不是同时聊天,而是同时干活。

最直观的变化,是任务会被拆开。一个分身去查文件,一个分身去改代码,一个分身去跑验证。这样做不是为了热闹,而是为了并行。大任务最怕的不是复杂,而是所有步骤都排成一条线,谁卡住就全体停工。拆开以后,几个小任务可以同时往前推进。

图片

分身之间怎么不打架?靠的是隔离。源码里的 worktree 就像每个人自己的工位。每个分身都在独立的临时工作区里改东西,互不覆盖。这样做的好处很直白:A 改坏了,不会直接把 B 的结果冲掉。先隔离,再汇总,是并行协作能成立的前提。

它们的汇报方式也很“工程化”。代码里有团队记忆同步、任务状态、以及类似“文件信箱”的设计。小白可以把它理解成:每个分身不是口头汇报,而是把进度写到固定位置,主智能体再统一读取。哪怕某个分身中途挂了,重启后也能从记录里接着做。

你在界面上看到的队友状态、后台任务、正在运行的分身,也不是装饰。REPL.tsx 里有 pendingWorkerRequesthasRunningTeammates 这类状态,说明团队模式不是边角功能,而是主流程的一部分。多智能体的关键不是多,而是隔离和汇总。

如果把它翻成普通人的话,这套结构更像一个小项目组:队长负责拆单,队员负责并行执行,worktree 负责隔离现场,memory sync 负责统一进度。表面上看是“组团”,底层其实是把协作流程做成了机器能稳定执行的流水线。

06 交互:它远不止是一个“黑框框”

Claude Code 的界面也不是传统意义上的“黑框框”。REPL.tsx 管的不是一条输入输出通道,而是一整套工作台状态:thinkingidleerror、队友进度、后台任务、提示信息,全都在同一层里呈现出来。黑框框只是入口,真正值钱的是下面那套状态机。

先看最容易被忽略的 cost。源码里专门有费用和统计视图,把 token、时长、缓存命中拆得清清楚楚。对小白来说,这就像一块实时电表。你不是盲目地用 AI,而是能看到这次任务大概烧了多少资源。它的作用不是炫技,而是让你知道“这一轮到底贵不贵”。

图片

再看远程接管。src/commands/session/session.tsx 里会生成远程会话链接和二维码。扫一下码,浏览器就能接上同一个会话。它的意义不是“手机控制电脑”这么简单,而是把终端从本机窗口变成了可转移的工作台。你可以在另一台设备上接着看,也可以把会话搬到更顺手的界面里继续。

最后是那些状态词。thinkingerroridle 这些都不是花哨文案,而是工作流的可视化。thinking 表示正在推理或等待工具返回,error 表示有异常,idle 表示当前没有新动作。它们的价值很朴素:让人一眼知道系统卡在哪一步。真正好的交互,不是更会说话,而是让人看得懂它在做什么。

07 预防方案:从“掩耳盗铃”到“斩草除根”

为什么这些机密会被彻底出卖?核心痛点在于:逻辑只是被“隐藏”了,而不是被“删除”了。

在技术上,这叫 DCE(死代码消除)。我们要做的,是在程序打包的那一刻,就根据用户身份把那些“多余的代码”物理删除

我们可以用一段简单的逻辑来实现“物理剪枝”:

如果 目标用户 == "普通用户":
    彻底从源码中 剔除 内部功能代码(如 Undercover 模式、指挥官模式)
    强制 禁止 生成任何 Source Map 映射文件
    全局 搜索并抹除 敏感的标识符(如 'ant', 'INTERNAL_ONLY'

通过这种方式,即使黑客还原了源码,他们看到的也只是一个干净的“普通版本”。真正的安全,在于让原本就该消失的东西彻底不见。

08 结语:发布纪律就是生命线

Claude Code 的这次泄露,给所有 AI 公司敲响了警钟。在 AI 领域,竞争已经从“模型”演变为“工程细节”。如果你无法控制好发布产物的干净程度,那么你辛苦研发的逻辑,在对手眼里不过是一份随手可得的“免费说明书”。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐