Claude Code v2.1.88 原始碼外洩事件來龍去脈:一個忘記寫在 .npmignore 的 .map 檔,揭開了 51.2 萬行 TypeScript
重點摘要
- 事件時間:2026 年 3 月 31 日(週二),Claude Code v2.1.88 在 npm 發布後數小時內被安全研究員 Chaofan Shou 在 X 上公開揭露。
- 外洩檔案:
@anthropic-ai/[email protected]中夾帶的cli.js.map,檔案大小約 59.8 MB,內含sourcesContent陣列,可還原出完整的原始 TypeScript 程式碼。 - 洩漏規模:約 1,900 個 TypeScript 檔案、512,000+ 行程式碼、~40 個內建工具與 ~50 個 slash commands。另外 source map 還指向 Anthropic 自家 Cloudflare R2 上的一個 zip 壓縮檔,任何人拿到 URL 都能下載原始碼打包檔。
- 根本原因:release 團隊忘記把
*.map加入.npmignore,也沒有在package.json設定files白名單。搭配 Bun(Anthropic 2025 年底收購)預設會產生 source map 的特性,等於把 debug 素材直接上架。 - Anthropic 回應:官方定性為
release packaging issue caused by human error, not a security breach,強調沒有客戶資料或金鑰外洩,並承諾加強發布流程防呆。 - 社群反應:GitHub 鏡像倉庫數小時內竄出,其中一個 fork 幾小時內就累積超過 41,500 個 fork,後續更突破 84,000 stars / 82,000 forks,被 Layer5 譽為「GitHub 歷史上成長最快的倉庫之一」。
事件時間線
3 月 30 日晚間:v2.1.88 照常發布
Anthropic 依照每日 patch bump 的節奏,在 npm 上發布 @anthropic-ai/[email protected]。這是 2026 年 3 月底以來每日小版本更新系列的一環——表面上看起來跟前幾天的 v2.1.85、v2.1.86、v2.1.87 沒什麼兩樣。
3 月 31 日早上:Chaofan Shou 發現異常
安全研究員 Chaofan Shou 在對新版 npm package 做例行檢查時,注意到 tarball 裡面多了一個異常巨大的 cli.js.map 檔案。他把檔案解出來一看,裡面的 sourcesContent 欄位把所有原始 TypeScript 檔案都塞了進去——註解、變數名、架構全都在。
他隨即在 X 上公開:
Claude code source code has been leaked via a map file in their npm registry!
消息立刻在開發者圈炸開。短短幾個小時內,GitHub 上就出現數十個鏡像倉庫,有人把還原後的 TypeScript 原始碼上傳並附上 README,有人做了 diff 分析,還有人動手把 source map 裡面提到的 Cloudflare R2 zip 檔下載下來備份。
3 月 31 日下午:主流媒體跟進
The Register、VentureBeat、BleepingComputer 等媒體陸續刊登報導。Anthropic 發言人於當日稍晚回應:
This was a release packaging issue caused by human error, not a security breach. No customer data or credentials were exposed.
4 月 1 日起:Anthropic 開始清理
Anthropic 接續的每日 patch bump(v2.1.89–v2.1.92)移除了 .map 檔案,同時清理 Cloudflare R2 上的 zip 壓縮檔,但舊版 v2.1.88 的 tarball 仍然存在於 npm registry,因此技術上來說,任何人只要 npm pack @anthropic-ai/[email protected] 還是能拿到完整檔案。這也是許多安全研究員批評 npm 生態的老問題——歷史版本不會真正消失。
技術根因:一個 .npmignore 引發的血案
Source Map 是什麼?
Source map(.map 檔)本來是前端開發的好朋友。當你把 TypeScript 編譯成 JavaScript、或者把多個檔案 bundle 成一包之後,原本的行號、變數名、檔案結構都會被打亂。Source map 就是一份「地圖」,讓瀏覽器或 debugger 在出錯時可以從混淆後的 JS 反推回原本的 TypeScript 檔案,顯示友善的 stack trace。
問題在於,source map 內部的 sourcesContent 欄位會把原始碼完整內嵌。對瀏覽器來說這是方便除錯;對攻擊者或競爭對手來說這是白送的聖誕禮物。
Bun 的預設行為
根據 Dev.to 上 Gabriel Anhaia 的分析,Claude Code CLI 是用 Bun 而不是 Node.js 打包的。Anthropic 在 2025 年底收購 Bun 後,就把自家工具鏈搬上 Bun。而 Bun 在編譯 CLI 時預設會產生 .map ——這個行為本身沒錯,debug 時很好用。
發布流程的三道失守
要避免 .map 上架 npm,有三層防線:
.npmignore:加一行*.map就好。package.json的files欄位:用白名單方式明確列出要發布的檔案,未列出的一律排除。npm pack --dry-run:發布前先跑一次 dry run,看清楚到底會打包什麼進去。
Anthropic 的 release 團隊三道全沒守住。既沒有 ignore,也沒有白名單,也沒有 dry-run 檢查。結果就是 Bun 吐出來的 .map 原封不動進了 tarball。
Cloudflare R2 的另一把鑰匙
更尷尬的是,這個 source map 還包含一個對 Anthropic 自家 Cloudflare R2 bucket 的參照 URL,指向一個 zip 壓縮檔。任何人拿到這個 URL(source map 裡公開可見)就能下載整包原始碼——連還原都省了。這一步等於直接把 S3 風格的 signed URL(或沒簽名的 public object)放在 public npm package 裡。
洩漏內容有什麼?
根據 Gabriel Anhaia 的整理 以及多家媒體的拆解,外洩內容包括:
| 模組 | 規模 | 功能 |
|---|---|---|
| Query Engine | 約 46,000 行 | LLM API 呼叫、streaming、快取、編排 |
| Tool System | 約 29,000 行 | 權限閘(permission gates)架構、~40 個內建工具 |
| Slash Commands | ~50 個 | /init, /compact, /fast, /cost… |
| Multi-Agent Orchestration | — | 派生子代理 (swarms) 執行並行任務 |
| IDE Bridge | — | JWT 驗證 的雙向通訊,供編輯器整合 |
| Persistent Memory | — | 跨 session 的檔案型 context 儲存 |
技術棧曝光
這次洩漏也讓 Claude Code 的內部技術棧一覽無遺:
- Runtime: Bun(不是 Node.js)
- Terminal UI: React + Ink(用 React 組件寫 CLI 介面)
- Schema 驗證: Zod v4,全程用來驗證 tool arguments 與 LLM 回傳
- Observability: OpenTelemetry,採 lazy-loading 避免冷啟動變慢
- 打包: Bun bundler 直接輸出單一
cli.js
Gabriel Anhaia 的一段評論很精準:
This isn’t a toy project. Claude Code is a production-grade, heavily architected system.
對於想寫類似工具的開發者來說,這份程式碼本身就是一本現代 AI CLI 架構教科書。
資安面的隱憂
雖然 Anthropic 強調「沒有資料外洩」,但 Penligent.ai 的分析 指出這次事件對攻擊者的幫助不容小覷:
- 權限閘研究:有了完整的 tool system 程式碼,攻擊者可以更有系統地找 pre-trust execution order bug、scope 繞過、檔案編輯的邊界條件。
- 歷史 CVE 對照:Claude Code 過去曾有多個 CVE 紀錄(如 CVE-2026-21852、CVE-2025-59828、CVE-2025-58764、CVE-2025-52882),都與權限邊界與啟動流程有關。原始碼公開後,追蹤這些 CVE 的修補細節變得更容易——對防守方與攻擊方都是。
- 系統 prompt 可能被推斷:雖然系統 prompt 的字串未必全部以 plaintext 存在(有些可能是用 build-time env var 注入),但從 prompt builder 邏輯可以合理推論 Anthropic 對 Claude 的 instructions 長什麼樣。對想做「越獄」研究的人來說,這是寶貴的線索。
但從另一個角度看,Zscaler ThreatLabz 等企業資安單位也表示,這次外洩的並不是 Claude 模型本身的權重或訓練資料,也沒有碰到任何客戶資料或 API key。Claude Code 的安全性本來就不是靠「客戶端程式碼保密」來維持——LLM 的安全邊界在伺服器端,不在 CLI 端。這次事件比較像是商業機密 vs 競爭優勢的問題,而不是典型的資料外洩事故。
Clean-room 重寫與社群鏡像
事件發生後數小時內,GitHub 上出現多個倉庫,宣稱是「根據 source map 還原的 Claude Code 原始碼」。根據 Layer5 的整理,其中最熱門的一個倉庫在短短兩小時內衝到 50,000 stars,幾天後突破 84,000 stars / 82,000 forks。
這當然牽涉到著作權與合約問題:
- 這些倉庫大多是直接把還原出來的 TypeScript 上傳,屬於 Anthropic 的著作權作品,技術上 Anthropic 可以發 DMCA takedown。
- 也有一些倉庫標榜是 「clean-room rewrite」——意思是寫程式的人沒有看過原始碼,只看架構說明文件。但在已經有大量鏡像流通的前提下,要真的做到 clean-room 幾乎不可能。
- Anthropic 目前沒有大規模發 takedown,可能是判斷 Streisand effect 會讓事情更糟。
對其他 npm 套件作者的教訓
這起事件最大的警示不是針對 Anthropic——而是針對所有用 Bun、esbuild、Webpack、Vite 等打包工具發 npm 套件的開發者。
立刻檢查你的專案
-
看看
package.json有沒有files白名單:{ "files": ["dist/cli.js", "dist/cli.cjs", "README.md"] }有白名單就沒有意外,沒寫在裡面的東西都不會被發出去。
-
加強
.npmignore:*.map *.log .env* src/ test/ -
發布前一定
npm pack --dry-run:npm pack --dry-run # 輸出會列出所有要打包進去的檔案,逐行檢查 -
關掉 source map,或者分開發布:如果真的需要 source map 給自己 debug 用,考慮在 CI 上傳到私有 bucket,而不是跟發布檔綁在一起。
結語:最好的工具也會在人手上翻船
Claude Code 本身是 2026 年最熱門的 AI CLI 工具之一——它幫很多開發者自動化日常工作、寫測試、重構程式碼。諷刺的是,這次事件的根因完全不是 AI 的問題,而是一個最古老的 release engineering 失誤:人忘記把 debug 檔案放進 ignore 清單。
對 Anthropic 來說,這是一次尷尬但不致命的事件——商業影響可控,品牌公信力稍微受傷但可以修復。對社群來說,這是一次難得的「大型 AI CLI 工程源碼開箱」。對每一個 npm 套件作者來說,這是一個今晚就該回去檢查自己 .npmignore 的提醒。
從本站追蹤的每日版本資料來看,Claude Code 在事發後的 v2.1.89–v2.1.92 每日 patch bump 節奏並沒有因此被打亂——Anthropic 明顯選擇用「不動聲色、持續出版」的方式把事件淡化掉。這可能是公關上最務實的決定,但也留下了一個尷尬的事實:v2.1.88 的 tarball 永遠不會真的消失。
延伸閱讀與資料來源
- The Hacker News:Claude Code Source Leaked via npm Packaging Error, Anthropic Confirms
- The Register:Anthropic accidentally exposes Claude Code source code
- VentureBeat:Claude Code’s source code appears to have leaked — here’s what we know
- Dev.to(Gabriel Anhaia):Claude Code’s Entire Source Code Was Just Leaked via npm Source Maps
- Penligent.ai:Claude Code Source Map Leak — What Was Exposed and What It Means
- Layer5:The Claude Code Source Leak — 512,000 Lines, a Missing .npmignore
- Zscaler ThreatLabz:Anthropic Claude Code Leak 分析
- BleepingComputer:Claude Code source code accidentally leaked in NPM package
推薦閱讀
AI 找漏洞變快了,vibe coding 開發者不能只靠「之後再更新」
譯寫自 Cisco Talos:A tale of two eras
2026 年 6 月 Microsoft 修補日:用 AI 寫 code 的開發者該注意什麼
譯寫自 Cisco Talos:Microsoft Patch Tuesday for June 2026 — Snort rules and prominent vulnerabilities
AI 開發時代,資安不能只等工具跳警報
譯寫自 Cisco Talos:Reporting from Vegas: Networking, AI, and good boys
AI Agent 使用工作坊 — 從環境建置到版本控制,手把手帶你上手
一場 4.5 小時、70% 實作的工作坊。從 VS Code 環境建置、REPL 思考模型、Claude Code 實戰到版本控制手把手,完整學會跟 AI Agent 協作開發。
訂閱最新文章
每週接收 Claude Code 最新動態、AI 開發工具趨勢與技術分析,直接送到你的信箱。
訂閱成功!歡迎加入,我們會寄一封確認信到你的信箱。
我們尊重你的隱私,隨時可以取消訂閱。
本文由 Namog Vibe Coding 自動化監控系統生成
讀者回應
載入中...