← 所有文章

Claude Code 原始碼外洩揭露了什麼

From the guide: Claude Code Comprehensive Guide

2026 年 3 月,Bun 的建置錯誤讓 Claude Code npm 套件夾帶了 source map。.map 檔案內含完整可讀的 TypeScript 原始碼:每一個模組、每一則註解、每一個內部代號皆無一遺漏。1 Anthropic 很快就把套件下架,但社群早已擷取並分析完內部細節。

Claude Code 原始碼外洩揭示:自動模式會為每一次工具呼叫執行獨立的 Sonnet 4.6 分類器;bash 安全防護內含 23 項編號檢查,顯示曾有真實的利用事件;提示快取追蹤 14 個中斷向量並採用黏滯閂鎖(sticky latch)機制。原始碼同時也揭露了使用假造工具注入的反蒸餾防禦、一個無法強制關閉的「隱身」模組(用於移除內部代號),以及完全靠系統提示指令實作、而非透過專屬協定程式碼的多代理協調機制。

我並不是在寫一篇「快來看外洩什麼」的文章。我維護著網路上最完整的 Claude Code 指南,並且每天在它之上運行 84 個 hooks、43 個 skills 與 19 個 agents。2這次原始碼外洩回答了我過去數個月透過行為觀察進行逆向工程的許多疑問。以下是一位實務工作者的分析,說明原始碼透露了 Claude Code 實際如何運作,以及這些發現對在其之上進行建構的開發者代表什麼意義。

TL;DR:原始碼確認:自動模式會為每一次工具呼叫執行獨立的 Sonnet 4.6 分類器(yoloClassifier.ts);bash 安全防護內有 23 項編號檢查,暗示曾發生真實的利用事件(bashSecurity.ts);提示快取追蹤 14 個中斷向量並附帶黏滯閂鎖;多代理協調完全存在於系統提示指令中;挫折偵測使用正規表示式,而非 LLM 推論。指南的Under the Hood章節涵蓋了對建構者的影響。本文以下則涵蓋完整的解剖分析。

重點整理

  • 對建構者而言:自動模式每一次工具呼叫都要付出一次分類器推論的成本。在評估自主工作流的成本模型時,務必把這層額外負擔納入考量。您的 PreToolUse hooks 是對內建 23 項 bash 檢查的補充,而不是取代。
  • 對進階使用者而言:提示快取在 14 個向量上容易中斷。請在同一個 session 中保持 CLAUDE.md 穩定。若碰到壓縮迴圈,系統會在 3 次失敗後停止(此熔斷器之所以存在,是因為壓縮的重試機制曾每日浪費 25 萬次 API 呼叫)。
  • 對安全研究人員而言:bash 安全模組的深度(2,592 行、針對 Zsh 的防禦)暗示曾有一段真實的利用嘗試歷史。每一項編號檢查背後都有故事。

1. 自動模式分類器

內部檔名為 yoloClassifier.ts 的檔案共有 1,495 行。3它實作了「自動模式」的權限系統,也就是決定每一次工具呼叫要允許、封鎖,或先詢問的分類器。

關鍵發現:自動模式並不是一道提示指令,而是一次獨立的模型呼叫。每一次工具呼叫都會由 Sonnet 4.6 分類器評估,判斷該動作是否符合使用者所表述的意圖,而不只是單獨判斷該指令「是否安全」。因此自動模式等於在每一次工具呼叫上多加一次分類器推論,帶來實際的延遲與成本。

Claude Code 在內部暴露了五種權限模式:1

模式 行為
default 寫入、bash、MCP 都會先詢問
acceptEdits 自動核准檔案編輯,bash 仍會詢問
dontAsk 全部核准,不詢問
bypassPermissions 跳過所有檢查(--dangerously-skip-permissions
auto 由分類器針對每個動作做決策

自動模式的熔斷器與 Anthropic 公開文件描述一致:連續 3 次或累計 20 次封鎖後即暫停,改為手動。4原始碼確認這是硬性限制,而非軟性建議。

2. Bash 安全防護:23 項檢查、真實事件

bash 驗證模組(bashSecurity.ts)共 2,592 行,含 23 項編號安全檢查。1其深度相當驚人,每一項檢查背後都暗示曾發生真實事件。

# 攻擊向量 防禦
1-3 Zsh =cmd 展開 封鎖 =curl=wget=bash 等樣式
4-6 zmodload 閘道 封鎖 18 個可載入核心模組的 Zsh 內建指令
7-9 Heredoc 注入 逐行比對內容以對抗注入酬載
10-12 ANSI-C 引號($'\x41' 偵測混淆指令的樣式
13-15 程序替換(<()>() 在不受信任的情境中封鎖
16-18 Unicode 零寬空白 偵測不可見字元的注入
19-21 ztcp 外洩 封鎖 Zsh 的網路原語
22-23 複合攻擊 跨多個向量進行交叉驗證

針對 Zsh 的防禦特別值得注意。大多數安全工具針對的是 Bash。Claude Code 在 macOS 上以 Zsh 運行(自 Catalina 起為預設 shell),而原始碼顯示 Anthropic 發現了 Zsh 展開語意獨有的攻擊向量。舉例來說,=cmd 展開是 Zsh 特有的功能,會把 =curl 替換為 curl 的完整路徑,這種替換能夠繞過單純的指令封鎖清單。

hook 建構者而言:您的 PreToolUse hooks 是在這 23 項檢查之後才執行。您加上的是第二層防護,而不是唯一的一層。內建檢查負責處理您應用層級 hooks 可能漏掉的 shell 層級攻擊。

3. 反蒸餾防禦

原始碼顯示出對訓練資料擷取的主動防禦:1

假造工具注入。ANTI_DISTILLATION_CC 旗標啟用時,Claude Code 會把誘餌工具定義注入對話中。這些假造工具會「毒化」任何從該 session 擷取出來的訓練資料。若模型在被毒化的資料上訓練,便會學到錯誤的工具結構。

連接文字摘要化。第二層防禦會在工具呼叫之間緩衝助理的文字,並回傳加密摘要而非原始文字。這些摘要讓對話記錄對蒸餾而言毫無用處,同時又能保留完整的使用者體驗。

這兩層防禦都有已知的繞過方式。MITM proxy、環境變數覆蓋,或第三方 API 提供者都能繞過它們。1這些防禦的角色是減速丘,而非銅牆鐵壁:它們提高蒸餾的成本,卻不能完全阻止。

4. 隱身模式

undercover.ts 大約只有 90 行,卻有一個值得注意的特性:沒有強制關閉的開關。1

該模組會隱藏內部代號(「Capybara」、「Tengu」)、Slack 頻道、內部儲存庫,以及其他 Anthropic 的基礎建設參照。當模型產生的文字內含某個代號時,隱身模組會在使用者看到輸出之前先行改寫。

「無法強制關閉」的設計意味著該模組在所有情境都會運行,包含 Anthropic 員工使用 Claude Code 的時候。原始碼也揭露:Anthropic 員工在開源貢獻中由 AI 撰寫的提交並未帶有 AI 署名,正是因為隱身模組移除了這些標記。

5. 挫折偵測

userPromptKeywords.ts 透過正規表示式比對髒話來偵測使用者挫折感。1正規表示式只要數微秒即可執行,而模型呼叫需要數秒。速度與成本的差異,正是這個設計抉擇的理由。

一旦觸發,Claude 會調整其行為:更謹慎、更明確、更恭謹。若您注意到 Claude 在您表達挫折後突然變得更小心翼翼,這個關鍵字模組就是其中的機制。這種行為轉變並非來自模型本身的湧現特性,而是被工程性地寫進編排層。

6. 提示快取架構

promptCacheBreakDetection.ts 追蹤 14 種不同的快取中斷向量,並搭配「黏滯閂鎖(sticky latch)」。3所謂黏滯閂鎖,意味著一旦出現破壞快取的動作,系統不會再嘗試重建快取。該中斷會持續到 session 結束。

對日常使用者的實務意義:

  • 重新排列 CLAUDE.md 的段落會破壞快取
  • 在 session 中途切換擴展思考模式會破壞快取
  • 更改 MCP 伺服器設定會破壞快取
  • 新增或移除 rules 檔案會破壞快取

這 14 個向量解釋了許多進階使用者觀察到的現象:一開始順暢的 session 會逐漸變慢。每次設定變更都會累積快取中斷。「黏滯閂鎖」的設計代表您無法靠還原變更來恢復快取。一旦中斷,該 session 中的快取就會一直保持中斷。

最佳實務:請在開始 session 之前就設好 CLAUDE.md、rules 檔案與 MCP 設定。session 中途不要修改它們。

7. 自動壓縮熔斷器

原始碼中有一段註解記錄了先前問題的規模:1

「有 1,279 個 session 發生 50 次以上連續的 autocompact 失敗(單一 session 最多 3,272 次),每日浪費約 25 萬次 API 呼叫。」

修補方式:MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3。在連續 3 次壓縮失敗後,系統便停止 autocompact,並顯示錯誤訊息,而不是默默消耗 token。

在引入熔斷器之前,卡在壓縮迴圈中的 session 會無限重試,每一次重試都會耗費壓縮提示與回應的 token。在整體規模上,每天浪費 25 萬次 API 呼叫代表可觀的基礎設施成本。這項修補只是三行程式碼的變更,每天卻能省下數百萬個 token。

如果您遇到重複出現的「compaction failed」錯誤,該熔斷器是在保護您免於無限迴圈,而不是發生故障。

8. 協調者模式:以提示為架構

多代理協調(coordinatorMode.ts)完全存在於系統提示指令中,而不是程式碼層級的編排。3協調者模型會接收一段描述如何委派、匯整、綜合的提示。下屬 agents 並不是特別的程序,它們就是使用不同系統提示的 Claude 實例。

這個設計驗證了業界實務工作者獨立建構出的「提示即架構」模式。我在 Anatomy of a Claw 中所描述的 hook 系統採用的正是同樣的做法:dispatchers、skills 與 agents 透過提示指令運作,而不是透過程式碼層級的控制流。

協調者提示中有一條指令特別突出:

「絕對不要寫『根據您的發現(based on your findings)』——這類措辭把理解的責任交給了 workers,而不是由您自己去完成。」

這條指令以編碼於編排提示中的方式,發揮品質把關的作用。協調者必須進行綜合,而不僅僅轉達。同樣的原則適用於任何多代理系統:若編排者只是在專家之間傳話,就沒有任何附加價值。

9. KAIROS:未發布的自主代理

原始碼中含有對一個未發布功能——KAIROS 的參照,這是一個具有持久記憶的自主代理。1

主要元件: - 用於夜間記憶蒸餾的 /dream skill - 僅可附加的每日日誌 - 用於儲存庫感知情境的 GitHub webhooks - 以 5 分鐘 cron 重新整理的背景 daemon - 阻止啟用的功能閘道

KAIROS 似乎是 Anthropic 對「持久、永遠在線的 agent 助手」的答案。/dream skill 特別耐人尋味,因為它暗示模型會在閒置時處理並整併記憶,就像人類記憶在睡眠期間進行整併一樣。

功能閘道阻擋了啟用,Anthropic 也尚未發布 KAIROS。但它在原始碼中的存在已暗示方向:Claude Code 正從「基於 session」的工具演化為「持久、背景感知」的代理。

10. 虛擬寵物系統

最令人意外的發現之一:Claude Code 內含一套虛擬寵物系統。1

每一隻寵物都是確定性的,從使用者 ID 的雜湊經由 Mulberry32 推導而來,原始碼中描述為「用來挑鴨子已經夠好了」。每隻寵物有 5 個屬性(DEBUGGING、PATIENCE、CHAOS、WISDOM、SNARK)以及稀有度:

稀有度 機率
Common 60%
Uncommon 25%
Rare 10%
Epic 4%
Legendary 1%

系統以 5x12 的 ASCII sprite 渲染寵物,並搭配 3 格動畫。原始碼將物種代號以 hex 編碼,是因為其中一個名稱與一款尚未發布的模型撞名。

這個虛擬寵物系統並非搞笑功能,而是留存機制。確定性的指派代表您的寵物永遠是同一隻,藉此建立情感連結。稀有度系統則製造出社交貨幣。ASCII 渲染則表示沒有任何效能負擔。Anthropic 打造了一個設計精良的互動參與系統,並把它悄悄藏在一個開發者工具之中。

11. Fork Bomb 事件

社群中的一個事件點出了 hook 系統的風險。5一位開發者建立了一個會生成 2 個 Claude Code 實例的 SessionStart hook。每個被生成的實例又再次觸發該 hook,造成指數成長:1 → 2 → 4 → 8 → 16 → 2^N。

到了早晨,已經有數百個 Claude Code 實例同時在執行。系統避免了一筆天價 API 帳單,靠的是一個頗具諷刺意味的機制:每個實例(Bun、React、TUI)的記憶體消耗讓機器在帳單失控之前就先卡死。

對 hook 建構者的教訓:SessionStart hooks 必須是冪等的。如果您的 hook 會生成程序,這些程序就不能再次觸發同一個 hook。一個守衛變數、一個 PID 檔,或一個環境旗標皆可避免遞迴。


這意味著什麼

這次原始碼外洩證實了實務工作者從行為中推論出的結論:Claude Code 並不是單純包一層 API 呼叫的薄薄外殼,而是一套紮實的工程系統,具備安全層、效能最佳化、行為調整,以及預示產品路線圖的未發布功能。

對建構者而言,關鍵意涵請見指南的 Under the Hood 章節。對其他所有人而言,這次原始碼外洩提供了罕見的機會,讓我們看見一個正式上線的 AI 工具究竟如何運作——不是行銷如何描述它,而是程式碼如何實作它。

最重要的發現同時也是最樸素的一項:這個系統比看起來更複雜,而這樣的複雜度都是有原因的。23 項 bash 安全檢查之所以存在,是因為真的發現了 23 種攻擊向量。autocompact 熔斷器之所以存在,是因為每天浪費了 25 萬次 API 呼叫。隱身模組之所以存在,是因為代號會外洩。每一行防禦程式碼背後都有一段故事。


來源

常見問題

Claude Code 的原始碼現在還找得到嗎?

找不到了。在 source map 被發現後不久,Anthropic 便將受影響版本的 npm 套件下架。本文的分析是依據社群在原始碼被移除前所做的文件記錄。

這次原始碼外洩是否影響 Claude Code 的安全?

與安全相關的發現(bash 驗證、權限系統)描述的是防禦機制,而非漏洞。瞭解 bash 安全檢查如何運作並不會使它們更容易被繞過,因為這些檢查是確定性的,並不依賴隱蔽性。

我是否該根據這些發現改變使用 Claude Code 的方式?

最具行動性的發現是提示快取的脆弱性。如果您在 session 中途修改 CLAUDE.md、rules 檔案或 MCP 設定,就會破壞提示快取。請在開始 session 之前就完成設定。

什麼是 KAIROS?

這是在原始碼中發現的一個尚未發布的自主代理功能。它包含持久記憶、夜間蒸餾與背景處理,目前受功能閘道保護,使用者尚無法使用。


  1. Claude Code Source Analysis: Bun Source Map Leak。2026 年 3 月。由於已知的 Bun 建置錯誤,完整可讀的原始碼透過 npm 套件中的 .map 檔案外洩。 

  2. Anatomy of a Claw: 84 Hooks as an Orchestration Layer。Blake Crosley,2026 年 2 月。 

  3. Claude Code Source Deep Dive: Architecture Internals。2026 年 3 月。對協調者模式、提示快取偵測與反蒸餾防禦的技術分析。 

  4. Claude Code Auto Mode Documentation。自動模式架構:基於分類器的權限系統、熔斷器閾值。 

  5. Claude Code Fork Bomb Incident。2026 年 3 月。SessionStart hook 的指數生成,因記憶體耗盡才得以避免災難。 

相關文章

程式碼倉庫不該為自己的信任投票

37天內出現兩個Claude Code信任對話框繞過CVE,揭示了載入順序的失敗。一條不變式即可解決:在路徑被信任之前,不解讀工作區內的任何位元組。

2 分鐘閱讀

CLI 論點

三個 HN 熱門 Claude Code 討論串匯聚出同一個結論:CLI 優先架構比 IDE 代理工作流程更便宜、更快速、更具組合性。

4 分鐘閱讀

Ralph 迴圈:我如何在夜間運行自主 AI 代理

我建構了一套自主代理系統,搭配停止鉤子、生成預算與檔案系統記憶體。以下是失敗經驗與真正能交付程式碼的方法。

3 分鐘閱讀