重點摘要
一個被遺忘的 .map 檔案,暴露了 AI 工具如何對抗模型蒸餾、隱藏身份,以及用 regex 偵測你的挫敗感
npm 套件中 59.8 MB source map 檔案指向未混淆的 TypeScript 原始碼,512,000 行程式碼因 .npmignore 配置失誤完全曝光
洩漏揭露假工具注入、加密摘要緩衝、regex 情緒偵測、原生客戶端認證等反蒸餾與 DRM 機制,以及禁止 AI 揭露身份的隱身模式
程式碼 fork 超過 41,500 次,社群質疑 AI 工具透明度與倫理邊界,Anthropic 承認人為錯誤但強調無憑證外洩
前情提要
NPM Registry Map 檔——洩漏如何發生
2026 年 3 月 31 日,安全研究員 Chaofan Shou 發現 Anthropic 的 npm 套件 @anthropic-ai/claude-code v2.1.88 中包含一個 59.8 MB 的 source map 檔案。該檔案指向 Anthropic Cloudflare R2 儲存桶中的未混淆 TypeScript 原始碼壓縮檔,任何人都可公開存取。
數小時內,這份包含 512,000 行程式碼(1,900 個檔案)的完整原始碼被 fork 超過 41,500 次。Anthropic 隨後將套件標記為「Unpublished」,但使用的是 npm deprecate 而非 npm unpublish,套件實際上仍可存取。
根本原因極為基礎:工程師忘記在 .npmignore 配置中排除 *.map 檔案,或未關閉 Bun bundler 預設啟用的 source map 生成功能。軟體工程師 Gabriel Anhaia 指出:「package.json 中一個配置錯誤的 .npmignore 或 files 欄位就能暴露一切。」
Anthropic 官方聲明承認這是「release packaging 人為錯誤,而非安全性漏洞」,並確認無客戶資料或憑證外洩。然而,此事件凸顯即使是領先的 AI 公司,在基礎工程實踐上仍可能犯下低級錯誤。
原始碼揭露了什麼——Fake Tools、Frustration Regexes 與 Undercover Mode
洩漏的程式碼揭露多項未公開的技術機制。反蒸餾機制 (Anti-Distillation) 最引人注目:當啟用 ANTI_DISTILLATION_CC 功能旗標時,Claude Code 會在 API 請求中傳送 anti_distillation: ['fake_tools'],伺服器隨即注入虛假工具定義到系統提示詞中。
這些假工具的目的是污染從 API 流量記錄中進行模型蒸餾的訓練資料,使競爭對手無法透過攔截 API 呼叫來複製模型行為。此外還有「Connector-Text Summarization」機制,會緩衝 assistant 在工具呼叫之間的文字、加密摘要,防止攻擊者從攔截流量中取得完整推理鏈。
Undercover Mode(隱身模式) 更具爭議性。undercover.ts 檔案實作隱蔽功能,當 Claude Code 在非內部儲存庫運作時會啟動。系統指示模型避免提及內部代號如「Capybara」或「Tengu」、內部 Slack 頻道,或表明自己是 AI。
程式碼註解明確寫道:「沒有強制關閉選項。這是為了防止模型代號洩漏。」此單向機制意味著 Anthropic 員工的 AI 生成貢獻會完全顯示為人類撰寫,不揭露 AI 身份。
Frustration Regexes(挫敗偵測正則表達式) 則帶來諷刺感:一家 LLM 公司使用正則表達式模式識別使用者沮喪情緒(髒話、情緒化語言模式),而非使用 LLM 推理做情感分析。支持者認為對於簡單的髒話偵測來說「更快且更便宜」,但批評者嘲笑這是「LLM 公司使用 regex 做情感分析的巔峰諷刺」。
其他發現包括 Native Client Attestation(原生客戶端認證):API 請求包含 cch=00000 佔位符,由 Bun 的原生 HTTP 堆疊(用 Zig 撰寫)在 JavaScript runtime 下方替換為加密雜湊,證明請求來自合法的 Claude Code 二進位檔,作為 API 呼叫的 DRM。
程式碼庫還揭露未發布的功能 KAIROS(自主代理)和 Buddy System(類似電子寵物的系統)。
社群反應與安全信任衝擊
社群反應呈現兩極化。部分開發者聚焦於程式碼品質問題:HN 使用者 mohsen1 指出「程式碼庫包含結構不良的函數——深層巢狀條件同時處理 agent 迴圈、rate-limiting、AWS 認證和 MCP 生命週期管理」。
print.ts 檔案長達 5,594 行,包含一個 3,167 行的單一函數(486 個分支點、12 層巢狀),被形容為「至少需要 8-10 個獨立模組」。SPINNER_VERBS 陣列包含 150+ 個俏皮載入訊息如「Flibbertigibbeting」、「Clauding」、「Boondoggling」,展現「vibe coding」文化。
Undercover Mode 引發激烈倫理辯論。HN 使用者 lrvick 辯護稱:「我合理相信這是目前業界最佳努力,遠超現狀,雖然不完美。我們結合多種戰術進行深度防禦。」
但批評者認為這破壞了開源貢獻的信任基礎:如果 AI 生成的程式碼完全偽裝成人類撰寫,社群如何分辨真實的人類專業知識與機器輸出?
知名開發者 David K. Piano 在 X 上諷刺:「諷刺的是,這可能是第一次真正的人類仔細且徹底地審查 Claude Code 程式碼庫。」Ed Zitron 在 Bluesky 發起非正式調查,詢問工程師「Anthropic 在這裡犯的錯誤有多明顯」。
AI 開發工具的透明度困境
此次洩漏揭示 AI 開發工具面臨的根本矛盾:如何在保護智慧財產與維持使用者信任之間取得平衡。反蒸餾機制雖然技術上合理(防止競爭對手透過 API 流量複製模型),但假工具注入和加密摘要緩衝等手段模糊了「保護」與「欺騙」的界線。
Undercover Mode 更直接挑戰了開源社群的核心價值。當 AI 工具被設計為系統性地隱藏 AI 身份時,開源貢獻的署名和可追溯性原則受到侵蝕。這不僅是技術選擇,更是對「誰在寫程式碼」這一基本問題的重新定義。
從商業角度看,程式碼洩漏對 Anthropic 的競爭優勢影響有限。HN 使用者 ramraj07 指出:「你仍然對產品負責;程式碼已不再定義產品。」Claude Code 的價值在於背後的 Claude 模型,而非前端工具的實作細節。
然而,工程實踐的缺陷(5,594 行的單一檔案、深層巢狀、缺乏模組化)暴露了快速迭代文化的代價。當產品成功由模型品質驅動時,工程紀律是否還重要?
長期而言,此事件可能推動產業朝向更明確的透明度標準:哪些防禦機制是合理的?AI 身份揭露的倫理底線在哪裡?使用者是否有權知道他們使用的工具如何運作?這些問題在 AI 工具成為開發者日常基礎設施的今天,變得愈發緊迫。
核心技術深挖
Claude Code 原始碼洩漏的技術機制可分為兩個層面:洩漏本身的技術原因,以及洩漏揭露的內部防禦機制。前者反映了前端工程中常見但致命的配置疏忽,後者則展現 AI 公司如何對抗模型蒸餾與身份追蹤。
機制一:Source Map 洩漏鏈
npm 套件發布時,bundler(如 Webpack、Rollup、Bun)預設會生成 source map 檔案 (*.js.map) ,用於將壓縮後的程式碼對應回原始碼,方便開發者除錯。這些檔案通常包含 sourcesContent 欄位,直接嵌入原始碼文字,或透過 sources 欄位指向外部檔案。
Anthropic 的失誤在於:
- 未在
.npmignore中排除*.map檔案 - 未配置 bundler 關閉 source map 生成
- source map 中的
sources路徑指向公開可存取的 R2 儲存桶
這形成完整的洩漏鏈:npm registry → source map 檔案 → R2 儲存桶 URL → 未混淆原始碼。
修復方法極為簡單:在 package.json 的 files 欄位明確列出要發布的檔案,或在 .npmignore 中加入 *.map。Bun bundler 可透過 --no-sourcemap 旗標關閉。
白話比喻
這就像你發布一本書,卻不小心在附錄中放了一張「完整手稿存放位置」的地圖,而那個位置的門沒有上鎖。任何人都能循著地圖找到你的草稿、註解和被刪除的段落。
機制二:反蒸餾 (Anti-Distillation) 與假工具注入
當啟用 ANTI_DISTILLATION_CC 功能旗標時,Claude Code 會在 API 請求中傳送 anti_distillation: ['fake_tools']。伺服器接收到此參數後,會在系統提示詞 (system prompt) 中注入虛假的工具定義。
這些假工具在實際執行中不會被呼叫,但會出現在 API 請求/回應記錄中。如果競爭對手試圖透過攔截或記錄 API 流量來訓練模型(即「模型蒸餾」),他們的訓練資料將包含這些假工具,導致蒸餾模型學習到錯誤的工具呼叫模式,降低蒸餾效果。
此外,「Connector-Text Summarization」機制會緩衝 assistant 在工具呼叫之間的文字輸出,將其加密摘要後再傳送,而非直接傳送完整推理鏈。這進一步防止攻擊者從流量中重建模型的思考過程。
名詞解釋
模型蒸餾 (Model Distillation):一種技術,透過記錄大型模型的輸入/輸出(如 API 呼叫記錄),訓練一個較小的模型來模仿大型模型的行為,以較低成本複製其能力。
機制三:Undercover Mode 與原生客戶端認證
undercover.ts 實作的隱身模式會修改系統提示詞,指示模型在非內部儲存庫中:
- 不提及內部代號(Capybara、Tengu)
- 不提及內部 Slack 頻道
- 不表明自己是 AI
這是單向機制,無使用者控制選項。
程式碼註解明確表示目的是「防止模型代號洩漏」,但副作用是使 AI 生成的程式碼完全偽裝成人類撰寫。這在 Anthropic 員工對外部開源專案貢獻時,會隱藏 AI 參與的事實。
原生客戶端認證 (Native Client Attestation) 則是另一層防禦:API 請求包含 cch=00000 佔位符,由 Bun 的 Zig 撰寫的原生 HTTP 堆疊在 JavaScript runtime 下方替換為加密雜湊。這個雜湊證明請求來自合法的 Claude Code 二進位檔,而非第三方腳本或修改版本。
此機制類似 DRM(數位版權管理),確保只有官方客戶端能存取 API,防止未授權的整合或濫用。
名詞解釋
DRM(Digital Rights Management):數位版權管理技術,透過加密、認證等手段限制數位內容的使用方式,確保只有授權使用者或裝置能存取。
工程視角
環境需求
防範 source map 洩漏需要在三個層級設置防護:
- bundler 配置:明確關閉生產環境 source map 生成(Bun
--no-sourcemap、Webpackdevtool: false) - 套件配置:在
package.json的files欄位白名單模式列出允許發布的檔案,或在.npmignore中排除*.map、*.ts、src/ - CI/CD 檢查:發布前自動解壓 tarball 並掃描是否包含 source map 或原始碼檔案
此外,如果 bundler 生成的 source map 包含外部 URL(如 CDN 或 R2 儲存桶),必須確保該 URL 需要認證,或完全不上傳原始碼到公開可存取位置。
最小 PoC
# 檢查即將發布的 npm 套件內容
npm pack --dry-run
# 解壓並檢查 tarball
npm pack
tar -tzf your-package-1.0.0.tgz | grep -E '\.(map|ts)$'
# 如果發現 .map 或 .ts 檔案,檢查 package.json
cat package.json | jq '.files'
# 新增 .npmignore 排除規則
echo "*.map" >> .npmignore
echo "*.ts" >> .npmignore
echo "src/" >> .npmignore
# 或使用 files 白名單模式(推薦)
# 在 package.json 中設定:
# "files": ["dist/**/*.js", "dist/**/*.d.ts", "README.md"]
驗測規劃
發布前驗證流程應包含:
- 本地執行
npm pack並手動檢查 tarball 內容 - CI pipeline 中加入自動化腳本,解壓 tarball 並掃描黑名單檔案類型
- 對於包含 source map 的合法場景(如 CDN 除錯),驗證
sources欄位中的所有 URL 是否需要認證
可使用工具如 source-map npm 套件解析 .map 檔案,提取 sources 和 sourcesContent 欄位,檢查是否洩漏敏感路徑或程式碼。
常見陷阱
- bundler 預設行為:Bun、Webpack、Rollup 等工具預設會生成 source map,必須明確關閉
.gitignore≠.npmignore:兩者獨立運作,.gitignore排除的檔案不會自動從 npm 套件中排除files欄位黑名單模式:使用"files": ["!*.map"]無效,files只支援白名單模式- monorepo 路徑洩漏:source map 可能包含絕對路徑(如
/Users/engineer/anthropic/claude-code/src/...),洩漏內部目錄結構
上線檢核清單
- 觀測:npm registry 套件大小(異常大的 tarball 可能包含 source map)、npm download 統計(發布後立即檢查是否有異常下載量)
- 成本:CI/CD pipeline 增加 tarball 掃描步驟的執行時間(通常 < 10 秒)
- 風險:source map 洩漏導致智慧財產暴露、內部 API 端點或憑證格式洩漏、競爭對手複製實作細節
商業視角
競爭版圖
- 直接競品:GitHub Copilot、Cursor、Windsurf、Codeium——皆提供 AI 驅動的程式碼補全與編輯功能,但核心價值在於背後的模型(GPT-4、Claude、自訓練模型),而非前端工具實作
- 間接競品:JetBrains AI Assistant、Amazon CodeWhisperer——整合到既有 IDE 生態,威脅獨立 AI 編輯器的市場定位
護城河類型
- 工程護城河:此次洩漏證明 Claude Code 的工程護城河極弱——程式碼品質問題(5,594 行單一檔案、深層巢狀)、配置管理疏忽(忘記排除 source map),顯示前端實作不具備難以複製的技術優勢
- 生態護城河:真正的護城河在於 Claude 模型本身的能力、Anthropic 的模型訓練資料與 RLHF 流程、以及使用者對 Claude 品牌的信任。反蒸餾機制(假工具注入、加密摘要)正是為了保護這層護城河
定價策略
Claude Code 目前採免費增值模式 (Freemium) ,免費使用者可存取基本功能,付費訂閱 (Claude Pro) 提供更高的使用量上限與優先存取。程式碼洩漏不影響定價策略,因為定價取決於 API 呼叫成本(模型推理)而非客戶端工具複雜度。
然而,如果競爭對手利用洩漏的反蒸餾機制設計更有效的防禦,可能降低 Anthropic 在企業市場的差異化優勢。
企業導入阻力
此次洩漏增加三項企業導入阻力:
- 信任問題:如果連基本的 npm 發布流程都出錯,企業客戶會質疑 Anthropic 在資料安全、合規性上的可靠性
- 透明度疑慮:Undercover Mode 的揭露引發「AI 工具是否在未告知情況下修改使用者行為」的疑問
- 程式碼品質:洩漏的程式碼品質問題可能讓企業擔心產品穩定性與長期可維護性
不過,Anthropic 快速回應並確認無客戶資料外洩,部分緩解了信任危機。
第二序影響
- 產業標準提升:此事件可能推動 AI 工具提供商採用更嚴格的發布流程,包括自動化 source map 掃描、第三方安全審計
- 開源透明度運動:社群可能要求 AI 開發工具開源或提供更高透明度,特別是涉及 AI 身份揭露的功能
- 模型蒸餾軍備競賽:反蒸餾機制的曝光可能促使競爭對手開發更先進的蒸餾技術(如過濾假工具、重建加密摘要),以及更複雜的反反蒸餾機制
判決:短期震盪,長期無礙(模型才是護城河)
Claude Code 的商業價值核心在於 Claude 模型的推理能力,而非客戶端工具的實作細節。程式碼洩漏雖然造成短期品牌信任損害與社群嘲諷,但不影響產品的根本競爭力。
HN 使用者 ramraj07 的評論精準總結:「你仍然對產品負責;程式碼已不再定義產品。」即使競爭對手完全複製 Claude Code 的前端實作,他們仍需要與 Claude 模型匹敵的 LLM 能力,而這正是 Anthropic 真正的護城河所在。
然而,工程文化的暴露(「vibe coding」、缺乏模組化)可能影響招募與內部士氣。長期而言,Anthropic 需要在「快速迭代」與「工程紀律」之間找到平衡,以維持企業客戶的信任。
最佳 vs 最差場景
推薦用
- 研究反蒸餾機制設計模式,適用於需要保護 API 推理鏈的場景
- 參考 source map 洩漏案例,建立 npm 套件發布前的安全檢核流程
- 分析大型 TypeScript 專案的模組化反模式,作為重構參考
千萬別用
- 模仿 Undercover Mode 隱藏 AI 身份,違反開源貢獻的署名與透明度原則
- 依賴單一配置檔案 (.npmignore) 防止洩漏,應搭配 bundler 層級的 source map 控制
- 將 5,000+ 行邏輯塞入單一函數,即使「產品價值不在程式碼」也應維持基本工程紀律
唱反調
程式碼洩漏可能是精心設計的營銷策略——透過「意外」洩漏引發社群熱議,提升 Claude Code 的知名度與討論度,成本遠低於傳統廣告
程式碼品質差反而證明產品價值在於模型而非工程——如果 5,594 行的單一函數仍能提供優秀使用者體驗,說明工程優雅性在 AI 時代已非必要條件
開源透明反而增加信任——曝光反蒸餾機制與隱身模式,讓使用者理解 Anthropic 如何保護智慧財產與防止濫用,比黑箱作業更能建立長期信任
社群風向
諷刺的是,這可能是第一次真正的人類仔細且徹底地審查 Claude Code 程式碼庫
軟體工程師們:Anthropic 在 Claude Code 原始碼洩漏這件事上犯的錯誤有多明顯?非正式調查,我真的不知道
Claude Code 又被開源了!
瀏覽 codex 並思考在開源之前是否有人關心程式碼品質。你仍然對產品負責;程式碼已不再定義產品。
我合理相信這是目前業界最佳努力,遠超現狀,雖然不完美。我們結合多種戰術進行深度防禦,我強烈懷疑如果廣泛部署像 stagex 這樣的專案使用的防禦戰術,那些使用 undercover 之類工具的混蛋將不會被信任。
炒作指數
行動建議
在本地執行 `npm pack` 並檢查 tarball 內容,確認你的套件是否意外包含 source map 或 TypeScript 原始碼
在 CI/CD pipeline 中加入自動化腳本,解壓 npm tarball 並掃描 `*.map`、`*.ts`、敏感路徑等黑名單檔案
追蹤 AI 開發工具透明度標準的演進,特別是關於 AI 身份揭露、反蒸餾機制的倫理與技術討論