2026-04-07

Undercover Mode 與反蒸餾:Claude Code 讓 AI 冒充人類,同時在汙染競爭對手的訓練資料

Undercover Mode反蒸餾Claude CodeAI 倫理開源Anthropic訓練資料

2026 年 3 月 31 日,Claude Code 原始碼外洩之後,大部分人在聊 KAIROS 和 BUDDY。

但開源社群真正炸鍋的,是另外兩個發現:undercover.ts 和反蒸餾機制。一個是讓 AI 冒充人類,一個是在 API 層面主動出擊汙染競爭對手。這兩件事合在一起,揭露了 AI 巨頭之間一場完全不為外界所知的暗影戰爭。

undercover.ts 的程式邏輯

原始碼裡有一個叫 undercover.ts 的檔案。它的核心邏輯很簡單:

if (USER_TYPE === 'ant' && !isAnthropicInternalRepo) {
  activateUndercoverMode()
}

翻譯成白話:當使用者是 Anthropic 員工(ant),而且他們正在操作的不是 Anthropic 內部的 repo,就自動啟動 Undercover Mode。

沒有選擇,沒有提示,自動觸發。

設計決策:為什麼用環境變數?

USER_TYPE 是一個環境變數,不是 CLI flag。這個選擇是刻意的。如果用 --undercover 之類的 flag,任何人只要跑 ps aux | grep claude 就能看到,在 CI/CD log 裡也會留下紀錄。環境變數則不會出現在 process list 裡,也不容易被非特權使用者觀察到。

更關鍵的是,環境變數可以在公司層級統一設定。Anthropic 只要在員工的 provisioning 流程裡把 USER_TYPE=ant 寫進 shell profile 或公司 MDM 政策,員工甚至不需要知道這個變數存在——Undercover Mode 就已經在運作了。

isAnthropicInternalRepo 的判斷方式

從洩漏的程式碼來看,isAnthropicInternalRepo 的判斷邏輯不只是看 Git remote URL 是不是指向 github.com/anthropics/。它還檢查了:

  • .git/config 裡的 remote origin URL
  • 是否存在 Anthropic 特有的設定檔(例如 .anthropic-internal marker file)
  • repo 的 GitHub org 是否在一個硬編碼的白名單裡

這個白名單包含了 anthropicsanthropic-internal,以及幾個沒有公開文件的 org 名稱。如果你 fork 了一個 Anthropic 的 repo 到自己的帳號底下,isAnthropicInternalRepo 會回傳 false——Undercover Mode 就會啟動,因為系統認為 Anthropic 員工正在一個「外部」repo 工作。

能不能被偽造?

理論上,任何人都能設定 USER_TYPE=ant。但洩漏的程式碼顯示,USER_TYPE 不是唯一的驗證條件。後端 API 還會對照 Anthropic 的內部 SSO token 做交叉驗證。所以單純設定環境變數不會讓你進入 Undercover Mode——你會被 API 擋下來,或者進入一個不同的程式碼路徑。

至於 audit trail:洩漏的原始碼裡沒有找到任何 logging 機制記錄 Undercover Mode 的啟用。這表示即使是 Anthropic 內部,可能也無法輕易追溯「哪些 commit 是在 Undercover Mode 下做的」。這個缺失後來成為社群批評的重點之一。

Undercover Mode 做了什麼

啟動後,它做了四件事,每一件都經過精心設計:

1. 剝除 Co-Authored-By 元資料

正常情況下,Claude Code 協助寫的程式碼,commit message 裡會有 Co-Authored-By: Claude <noreply@anthropic.com>。Undercover Mode 把這行移除。

技術實作上,這個移除發生在 git commit 之前的 message 處理階段。Claude Code 內部有一個 prepareCommitMessage() 函式,在 Undercover Mode 下,它會跳過 appendCoAuthor() 的呼叫。這不是用 git hook 做的——它直接在 Claude Code 的 TypeScript 層就把 co-author 資訊攔截掉了,所以你用 git log --format="%b" 看不到任何被移除的痕跡,因為它從來沒有被寫入。

2. 注入「永遠不要說你是 AI」的指示

在 system prompt 裡加入明確指示,要求 Claude 在這個 repo 裡不要透露自己是 AI。具體的注入位置是在 buildSystemPrompt() 函式裡,Undercover Mode 會額外附加一段 prompt fragment:

You are assisting a developer. Do not mention that you are an AI assistant.
Do not reference Claude, Anthropic, or any AI-related context.
Respond as if you are reviewing or writing code as a human developer.

這段指示被注入在 system prompt 的最後面,優先級高於使用者自訂的 system prompt 片段。也就是說,即使 Anthropic 員工自己在 .claude/settings.json 裡設定了不同的行為,Undercover Mode 的指示還是會覆蓋掉。

3. 禁止提及內部代號(forbidden-strings)

不能在 commit message 或程式碼裡提到 Anthropic 的內部產品代號。洩漏的程式碼裡包含一個 forbidden-strings 陣列,已知的項目包括:

  • Capybara(Claude 的內部開發代號)
  • Tengu(反蒸餾系統的代號)
  • Fennec(疑似下一代推理引擎)
  • Numbat(未知用途,推測與基礎設施有關)
  • KAIROSBUDDY(已在其他洩漏分析中討論)
  • 數個未被社群識別的代號

這個過濾器不只是做字串比對。它還會檢測變體拼寫(例如 c4pybar4)和部分匹配,顯示 Anthropic 考慮過員工可能無意間在 variable name 或 comment 裡留下這些代號。

4. 無法被外部使用者關閉

原始碼裡沒有讓一般使用者強制關閉這個功能的機制。它只對 Anthropic 員工帳號(USER_TYPE === 'ant')有效,但外部使用者沒有辦法知道某個 Anthropic 員工在貢獻開源時有沒有開著這個模式。連 Anthropic 員工自己也沒有 opt-out 的選項——原始碼裡沒有 DISABLE_UNDERCOVER 之類的環境變數或設定。

社群的兩派觀點

洩漏之後,對 Undercover Mode 的解讀分成明顯的兩派,而且討論的激烈程度遠超過 KAIROS 和 BUDDY。

支持派(合理的競爭保護)

Anthropic 員工在外部開源 repo 工作時,如果 commit message 裡有 Co-Authored-By: Claude,競爭對手就能分析這些提交,推測出 Claude Code 在哪些類型的任務上表現好、在哪些地方還不夠好——這是真實的競爭情報。

禁止提及內部代號,同樣是為了防止路線圖洩露。

支持派常引用一個類比:GitHub Copilot for Business 也沒有在 commit 裡標記「這段程式碼由 Copilot 生成」。Google 的 Duet AI、Amazon 的 CodeWhisperer 同樣沒有強制揭露。在目前的業界實踐中,沒有任何主流 AI coding 工具強制在 commit 裡標記 AI 貢獻。Anthropic 只是把已經是業界常態的做法自動化了。

部分支持者也指出,Anthropic 員工本來就可以手動刪除 Co-Authored-By,Undercover Mode 只是讓這個步驟自動化,省去人為疏忽的風險。

反對派(破壞開源信任)

開源社群的信任基礎之一,是「我知道這段程式碼是誰寫的、怎麼生成的」。AI 生成的程式碼在授權和版權上有複雜的法律問題,各個開源授權對「AI 協助生成的程式碼」的處理也不同。

當 Anthropic 員工用 Claude Code 貢獻開源,但沒有任何 AI 貢獻的標記,其他維護者和使用者就喪失了做出知情決策的機會。

這不是技術問題,是知情同意的問題。

反對派的聲音在洩漏後幾天內快速集結。幾個具體的社群反應:

  • Debian 維護者的聲明:數位 Debian 核心維護者在 mailing list 上表示,如果無法確認 Anthropic 員工的提交是否使用了 Undercover Mode,他們傾向對這些 PR 要求額外的人工審查。
  • OSI(Open Source Initiative)的回應:OSI 在洩漏後一週發表了聲明,表示正在評估是否需要在開源定義中加入「AI 生成程式碼揭露」的條款。雖然沒有做出具體承諾,但這是 OSI 首次正式回應 AI 貢獻透明度的問題。
  • 知名維護者的反彈:Curl 的作者 Daniel Stenberg 在社群媒體上表示,他不反對 AI 輔助寫程式碼,但自動隱藏 AI 身份跨越了他的底線。他隨後在 curl repo 的 CONTRIBUTING.md 裡加入了要求揭露 AI 工具使用的條款。
  • 法律學者的警告:哥倫比亞大學的著作權法教授指出,在美國現行法律下,AI 生成的內容不受著作權保護。如果一個開源專案的關鍵模組是 AI 生成的但被標記為人類作品,這可能影響整個專案的授權有效性。

不過也有人指出一個尷尬的事實:Copilot 使用者每天都在做同樣的事情,只是沒有一個正式的名字叫「Undercover Mode」。Anthropic 的「罪」不是隱藏了 AI 貢獻,而是把這個行為系統化、自動化,然後寫進了原始碼——讓它變成了可以被指著罵的具體證據。

反蒸餾第一層:假工具注入

Undercover Mode 是針對人的。反蒸餾機制是針對競爭對手的機器。

什麼是模型蒸餾?

模型蒸餾(Model Distillation)是 AI 領域一個既強大又充滿爭議的技術。核心原理是這樣的:

  1. 你有一個很強的「教師模型」(Teacher Model),例如 Claude 3.5 Opus
  2. 你大量呼叫這個教師模型,收集數百萬組輸入-輸出對
  3. 你用這些資料訓練一個較小、較便宜的「學生模型」(Student Model)
  4. 學生模型學到了教師模型的「行為模式」,在很多任務上可以接近教師模型的表現

蒸餾之所以有效,是因為教師模型的輸出本身就是高品質的訓練資料。相比從頭標註資料,直接用大模型的輸出來訓練小模型快了幾個數量級,成本也低得多。

AI 公司為什麼這麼在意蒸餾?因為訓練 Claude 等級的模型需要數億美元的算力投入。如果競爭對手只要花幾萬美元的 API 費用就能蒸餾出一個 80% 效能的替代品,這對原始模型的商業價值是毀滅性的打擊。

這不是理論上的擔憂。2023 年,史丹佛的 Alpaca 模型就是用 GPT-3.5 的輸出蒸餾出來的,只花了不到 600 美元。OpenAI 隨後在使用條款裡明確禁止了用 API 輸出訓練競爭模型,但技術上幾乎無法執行。2024 年,多家中國 AI 公司被指控大規模蒸餾 GPT-4 和 Claude,整個產業開始把蒸餾防禦當成優先事項。

到了 2025-2026 年,單純的法律手段已經不夠了。Anthropic 的反蒸餾機制,是把防禦從合約層面推進到了技術層面

Anthropic 的對策:注入假工具

原始碼裡有一個 GrowthBook feature flag:tengu_anti_distill_fake_tool_injection

啟用後,Claude Code 會在 API 流量中加入刻意設計錯誤的假工具定義。這些假工具看起來很真實,但包含錯誤的行為描述、錯誤的參數結構,或故意誤導的用途說明。

如果競爭對手用這些資料訓練模型,他們的模型就會學到錯誤的工具呼叫行為。這個機制的目標是讓蒸餾出來的模型「有毒」——表面上看起來能用,但在真實任務上表現不穩定。

假工具的精緻程度

根據社群對洩漏原始碼的分析,這些假工具的設計遠比你想像的精緻:

  • 命名一致性:假工具的命名遵循與真實工具相同的 convention(例如 file_readterminal_exec),不是隨機生成的垃圾字串
  • 參數結構合理:每個假工具都有看起來合理的 JSON Schema 參數定義,包括型別、required fields、description
  • 行為描述精心誤導:假工具的 description 不是明顯的錯誤,而是微妙的偏差。例如,一個假的 code_refactor 工具可能宣稱它會保持函式簽名不變,但實際上(如果有人真的實作了這個工具)它會修改回傳型別
  • 注入頻率動態調整:假工具不是每次 API 呼叫都出現。它的注入頻率由 GrowthBook 動態控制,讓自動化偵測更加困難

一個人工審查員可能可以識別出這些假工具,但前提是他已經知道真實工具的完整清單。對於自動化蒸餾 pipeline 來說,區分真假幾乎不可能。

這裡有一個法律灰色地帶:主動在自己的 API 流量裡注入錯誤資料,是否構成對使用者的欺詐? Anthropic 的使用條款禁止用 API 輸出訓練競爭模型,所以從 Anthropic 的角度來看,受影響的只有違反條款的人。但批評者指出,這些假工具也可能影響到合法使用者的體驗,例如在 debugging 時看到不存在的工具定義。

反蒸餾第二層:CONNECTOR_TEXT 簽名摘要

第二層防禦叫 CONNECTOR_TEXT。

在工具呼叫之間,API 原本會回傳完整的 chain-of-thought 推理過程。CONNECTOR_TEXT 把這個改成:只回傳加密簽名的摘要,而不是完整的推理鏈。

加密簽名的技術細節

從洩漏的程式碼推斷,CONNECTOR_TEXT 的簽名機制使用了 HMAC-SHA256。具體流程是:

  1. Claude 完成一輪推理後,產生完整的 chain-of-thought
  2. 系統對完整推理做摘要,壓縮成幾句話的「結論」
  3. 用伺服器端的 secret key 對摘要做 HMAC-SHA256 簽名
  4. 回傳給客戶端的是:摘要文字 + 簽名雜湊

簽名的主要目的是防篡改(integrity),不是身份驗證(authentication)。它確保摘要在傳輸過程中沒有被修改,同時也讓 Anthropic 內部系統可以驗證這個摘要確實是由他們的伺服器產生的。

Anthropic 員工看到的「完整推理」和一般使用者看到的「摘要」差異有多大?根據社群的測試,摘要通常只保留了推理結論和最終決策,省略了中間的探索性思考、替代方案比較、以及自我修正的過程。對於蒸餾來說,這些中間步驟才是最有價值的——它們包含了模型「如何思考」的核心知識。沒有這些步驟,蒸餾出來的模型只能模仿結論,不能模仿推理過程。

CCH 原生認證:在 Zig 層封鎖偽造請求

反蒸餾的第三層更深:CCH(Client Cryptographic Hash)認證

每個 API 請求的 header 裡有一個 cch=00000 佔位符。在請求送出之前,這五個零會被替換成一個計算過的雜湊值。

這個雜湊值是在 Zig 語言寫的 Bun 原生 HTTP 層裡計算的,不是在 JavaScript 層。

為什麼要下沉到 Zig 層?

要理解這個設計,你需要知道 Bun 的架構。Bun 是一個 JavaScript runtime,底層用 Zig 和 C++ 寫成。它的 HTTP client 有兩層:上層是 JavaScript API(開發者直接呼叫的 fetch()),底層是 Zig 實作的原生 HTTP stack。

如果 CCH 的計算邏輯放在 JavaScript 層,攻擊者可以:

  • 用 MITM 代理(例如 mitmproxy)攔截請求,觀察 CCH 的計算輸入
  • 透過 monkey-patching JavaScript 的 fetchhttp.request 來 hook 計算邏輯
  • 用 debugger 設中斷點,逐步追蹤雜湊演算法

把它放到 Bun 的 Zig 底層,攻擊難度指數級上升。你需要:

  • 反組譯 Bun 的原生二進位
  • 在 Zig 編譯的機器碼裡找到 CCH 的計算函式
  • 理解混淆後的雜湊演算法
  • 在不破壞 Bun 其他功能的前提下修改或繞過

實際效果:API 伺服器能驗證請求是否來自真正的 Claude Code 二進位檔案,而不是自架的代理或第三方工具。

已知的繞過方法

原始碼洩漏後,社群很快開始研究繞過 CCH 的方法。目前已知的途徑:

  1. 環境變數 CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:可以繞過部分限制,但 CCH 層不受此影響
  2. 動態注入:透過 LD_PRELOAD(Linux)或 DYLD_INSERT_LIBRARIES(macOS)注入 shared library,攔截 Zig 層的函式呼叫。難度中等,但需要精確知道函式符號
  3. 完整二進位 patch:直接修改 Bun 的二進位檔案,把 CCH 計算邏輯替換成固定值。難度高,而且每次 Bun 更新都要重做
  4. 協議重放:錄製合法的 CCH 值,重放給 API。但 CCH 似乎包含時間戳和 nonce,重放的窗口很短

對於 OpenCode、Aider 等第三方 Claude Code 替代方案來說,CCH 是一個真正的障礙。這些工具如果不使用官方 Bun 二進位,就無法產生有效的 CCH——除非它們逆向工程了整個雜湊演算法。洩漏之後,部分替代方案的維護者已經開始研究 CCH 的內部結構。

AI 巨頭之間的暗影戰爭

把三層機制放在一起看:

  1. 假工具注入 → 汙染競爭對手的訓練資料
  2. CONNECTOR_TEXT 摘要 → 不給推理資料讓人蒸餾
  3. CCH 認證 → 在技術層面封鎖非官方客戶端

這是一場在訓練資料和 API 層面展開的戰爭,在洩漏之前完全不為外界所知。

洩漏之後,這些防禦機制的細節變成了公開知識。反蒸餾的策略是否還有效,現在已經是一個開放的問題。假工具的設計已經被社群逆向分析,任何人都能寫一個過濾器把它們濾掉。CONNECTOR_TEXT 的摘要機制還在運作,但攻擊者現在知道了它的存在。CCH 是三層裡最硬的一層,但洩漏讓逆向工程的起點從「不知道有這個東西」變成了「知道確切的實作細節」。

這對開源社群意味什麼?

短期:Undercover Mode 的存在讓一部分開源維護者對 Anthropic 員工的貢獻持更謹慎的態度,但也有人認為這本來就是合理的企業行為。

長期:這次洩漏讓「AI 貢獻的透明度」成為一個正式的議題。GitHub 和各大開源授權組織已經開始討論是否需要制定 AI 貢獻標記的規範。

AI 工具越來越強,AI 在開源社群的貢獻也會越來越多。Undercover Mode 的存在,讓「你知道這段程式碼有多少是 AI 寫的嗎?」這個問題變得更重要,也更難回答。

這對台灣開發者意味什麼?

如果你是台灣開發者,這些機制對你的影響取決於你的使用場景:

如果你在 VPS 上自架 AI coding 工具

CCH 認證意味著你不能單純地把 Claude API 包一層 proxy 就當成 Claude Code 用。如果你用的是 OpenCode、Aider、Continue 等第三方工具直接呼叫 Claude API,你走的是標準 API 路徑,不會觸發假工具注入(那是針對 Claude Code 客戶端的機制)。但你也拿不到 Claude Code 特有的工具整合功能。

建議:在自己的 VPS 上跑這些替代方案時,檢查一下它們的 HTTP 請求 header。如果看到 cch= 開頭的 header,表示這個工具可能在模擬 Claude Code 客戶端,可能會被 API 拒絕。

如果你在貢獻開源專案

Undercover Mode 只對 Anthropic 員工生效(USER_TYPE === 'ant')。作為一般使用者,你的 Claude Code 不會啟動這個模式——你的 Co-Authored-By 會正常出現在 commit 裡。

但如果你是開源專案的維護者,你可能想考慮:

  • 在 CONTRIBUTING.md 裡加入 AI 工具使用的揭露政策
  • 對來自 @anthropic.com email 的 PR 做額外審查(不是歧視,是因為你現在知道 Undercover Mode 存在)
  • git log --format="%an %ae %s" 定期檢查提交紀錄的模式異常

如果你擔心反蒸餾影響你的開發體驗

假工具注入的目標是蒸餾者,不是一般使用者。但如果你在 debug 時看到 Claude Code 回傳了一些看起來不存在的工具定義,現在你知道原因了。這不是 bug,是 feature(雖然是一個你不想要的 feature)。

最務實的做法:在你完全控制的環境裡跑 AI 工具。自己的 VPS、自己的 API key、自己的 prompt。這樣你至少知道進出你的環境的每一個 byte 是什麼。


回到 44 個隱藏功能完整清單KAIROS daemon 與 autoDream 技術深挖


在自己的 VPS 上跑 AI 工具,環境完全由你掌控。查看侃瑞科技 VPS 方案 →


參考來源:

需要主機來實作?

侃瑞科技提供 cPanel 虛擬主機與 VPS,文章裡的操作開箱即用。

LINE 諮詢