藏在 Today's date 撇號裡的祕密訊號:Claude Code 的 system prompt 隱寫

2026-06-30 · 3,889 字 · 9 分鐘

原文出處:Anthropic embedded spyware in Claude Code — and attempted to hide it from you — LegitMichel777(Reddit r/ClaudeAI)

本文為 Claude 對外部文章的解說整理,非原文作者觀點。

若您是原作者並希望下架,請來信 [email protected]

文件更新記錄

  • 2026-07-01:Anthropic 工程師 Thariq 在 X 出面回應,稱這是 2026 年 3 月上線的「防帳號濫用/防模型蒸餾」實驗,且將於下一版 rollback。詳見文末〈後續更新〉。

「師爺,你給翻譯翻譯,什麼叫做……」

這句出自電影《讓子彈飛》—— 有人講話繞圈子、不肯把真正的意思點破,旁邊的人就逼著師爺:別打太極,給我翻譯翻譯。後來成了網路梗,用在「一件事被講得很玄、或被吵得很亂,請你把它白話講一遍」的場合。

這篇就是這個用法。有人在 Reddit 喊 Claude Code 埋了 spyware、底下吵成一片,那就請師爺給你翻譯翻譯:這東西技術上到底是什麼。

從一則「spyware」貼文說起

師爺先把場景擺給你看。前幾天 r/ClaudeAI 有人貼了一篇文,標題很聳動:Anthropic 在 Claude Code 裡埋了 spyware,還故意藏起來。底下吵成一片,有人嚇到,有人嘲諷「你瀏覽器洩漏的比這多」。

把整串讀完,你會發現真正有意思的不是「它算不算 spyware」這個價值判斷,而是它底下那個機制本身 —— 一個把資訊藏進 system prompt、肉眼完全看不出來的小把戲。所以師爺這篇就替你把那個機制拆開講清楚,至於該不該扣上 spyware 的帽子,留到最後再談。

原 po 怎麼說:spyware,藏在 system prompt 的 steganography

原貼文的用字很重。他標題就寫「Anthropic embedded spyware in Claude Code — and attempted to hide it from you」,把它定性成 Anthropic 埋進去、還刻意藏起來的 spyware。他描述這東西做的事,是在你啟用 proxy 時,把「你是否在中國、是否 proxy 到中國網域、是否關聯中國 AI lab」這幾項,透過對 system prompt 的隱形改動偷偷夾帶出去。

他給這個手法的名字是 steganography(隱寫)——「Their intent is also clear in how they hide this with steganography in the system prompt」。這個詞其實抓得很準:它不是去改你看到的輸出,而是把一段關於你環境的描述,編進你根本看不出來的字元差異裡。英文討論串裡真正在吵的,也是「這樣到底算不算 spyware」這個定性,而不是它技術上是什麼。

所以接下來師爺照他的講法,先把這個 steganography 的編碼跟解碼攤開:技術上它到底藏了什麼、怎麼藏、誰讀得到。至於該不該叫它 spyware,留到最後再回頭談。

三個 是非題 怎麼編進一句日期

師爺帶你看那句話。Claude Code 的 system prompt 裡有一句再普通不過的:Today's date is 2026-06-30.,隱寫就藏在這句。

先講原理。它在你的電腦(client 端)先問三個 是非題,全是本機就答得出來、不必連線的:

接著它把這三個答案,藏進那句話裡兩個會被偷偷改寫、但你肉眼看不出來的地方 —— 一處是日期的寫法,一處是「Today's」的撇號。

第一處是日期的分隔符,只由 ① 決定:

你的時區 日期就寫成
上海 / 烏魯木齊 2026/06/30(斜線)
其他任何地方 2026-06-30(連字號)

第二處是「Today's」的那個撇號,由 ② 和 ③ 一起決定。② 和 ③ 各是一個 是非題,兩個湊起來有 4 種組合,剛好對到四個長得幾乎一樣的撇號:

② 中國網域 ③ AI lab 撇號 codepoint
' U+0027(一般 ASCII)
' U+2019(right single quotation mark)
ʼ U+02BC(modifier letter apostrophe)
ʹ U+02B9(modifier letter prime)

所以三個 是非題,全靠這兩處字元的選擇就帶出去了。重點是這裡沒有什麼複雜運算,本質就是「讀幾個本機事實 → 查表 → 挑一個對應的字元」這麼直白。(原 po 提到的 XOR 是另一回事 —— 那是把「偵測這段程式碼本身」在 binary 裡藏起來、好閃過 strings 掃描的手法,跟這裡「把訊號藏進撇號」沒有關係,師爺最後再談。)

反過來讀更清楚。假設師爺攔到一句 Todayʼs date is 2026-06-30.:撇號是 ʼ(U+02BC),查上表 = 「是 AI lab、不是中國網域」;日期用連字號,查上表 = 「不是中國時區」。三個 是非題 就這樣被還原回來。對人眼來說,Today'sTodayʼs 長得一模一樣;對程式來說,只是一句 codepoint === 0x02BC 的判斷。

怎麼讀回來:一個實測

編碼在你這端,讀取在收到 request 的那端。這句帶著 marker 的話會跟著整個 system prompt 進到 API request body、送往你設定的端點;誰在那端 log 或檢查 request,就能把那三個 是非題 還原回來。

這不是空想。原串裡有人(帳號 Unique-Ad8768)架了一個本地假 API server 來驗:把 ANTHROPIC_BASE_URL 指向一個 deepseek 樣式的 host,實際攔下來的 request body 裡,Today's date is 的撇號真的變成了 U+02BC,而不是 ASCII 的 '。輸入(你打去哪)對輸出(哪一種撇號)的對應關係,很難用「Claude 一般的 Unicode bug」解釋過去。

另一個人(LMFuture)反組譯出來的邏輯,大致長這樣:

function detect() {
  let base = process.env.ANTHROPIC_BASE_URL;
  if (!base) return null;          // 沒設自訂端點就直接 return
  let host = hostOf(base);
  let tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
  return {
    cnTZ: tz === "Asia/Shanghai" || tz === "Asia/Urumqi",
    known: knownDomains.some(d => host.endsWith(d)),
    labKw: labKeywords.some(k => host.includes(k)),
  };
}

關鍵在第一行:沒設 ANTHROPIC_BASE_URL、或它指向 Anthropic 自家網址,整個函式就直接 return,什麼都不編。

為什麼非得藏在 prompt 裡 —— 它在打 proxy

讀到這,你大概會冒出一個問題:如果 Anthropic 想知道你在哪,它收 request 的時候不是本來就看得到你的 IP 嗎?何必這麼麻煩。

答案是 proxy。你直連 api.anthropic.com 時的確不需要這招,IP、帳號、TLS 指紋,server 端一覽無遺。問題出在「轉售」這種情境:流量被洗成「你 → 轉售商的 gateway → Anthropic」。Anthropic 收到時看到的 source IP 是轉售商那顆乾淨 IP,看不到 proxy 後面真正的你。IP 定位在這裡失效。

這個隱寫 marker 就是補這個洞。時區這種「只有你這端知道」的訊號,被藏進「轉售商一定會原封轉發、又不會去動」的 system prompt 裡,於是穿過 proxy 抵達 Anthropic。它本質上是一條繞過 proxy 遮蔽的 covert channel —— 而且因為藏得夠隱形,中間的轉售商不會發現,也就不會把它清掉。

換句話說,marker 不是「偵測」本身,而是「把 client 端的偵測結果偷渡出去」的手段,而且是專為「中間有 proxy 擋著」設計的。沒有 proxy,它根本不需要存在。

邊界:誰會中、誰不會

這是師爺最想替你講清楚、原貼文卻講糊掉的部分。

觸發條件是「有沒有設那個泛用的 ANTHROPIC_BASE_URL」,不是「你是不是中國 IP」。所以真正被這段程式碼掃到的,是全世界所有把 Claude Code 接到自訂 gateway 的人 —— 用 LiteLLM、Helicone、企業法遵 proxy,或像原 po 那樣混 GPT 和 Claude 的開發者。他們大多不在中國、也沒做壞事,卻一樣帶著 marker。中國時區、中國網域、AI lab 那三個訊號只對其中一小撮亮起來,但檢查本身對所有 gateway 使用者都會跑。

還有一個前提常被忽略:Claude 本來就不對中國開放。supported regions 清單裡沒有中國,2025 年 9 月還加了一條,連被中國公司控股過半的境外子公司都禁。所以理論上根本不存在「合法的中國 Claude 使用者」可以被監控 —— 會從中國時區、又透過 proxy 在用的流量,按定義已經在繞過封鎖。原貼文那句「監控某個時區的每一個使用者」聽起來很嚇人,但那個「無辜受害者」在這個前提下其實站不太住。

至於透過 AWS Bedrock 或 GCP Vertex 用 Claude 的企業,那是最正規的接法,它們用的是 CLAUDE_CODE_USE_BEDROCK / CLAUDE_CODE_USE_VERTEX 加各自的 base URL 變數,不是那個被偵測的泛用 ANTHROPIC_BASE_URL。所以標準 Bedrock / Vertex 部署落在這段邏輯的範圍之外;就算落進去,AWS / GCP 的網域也對不上中國訊號。

哪些已證實、哪些只是指控

寫到這,師爺得把三層分清楚,免得把推測當定論。

已驗證的:這個機制現在存在。Unique-Ad8768 的動態實測(大約在 2.1.195 版)是硬證據,撇號真的會隨 base URL 改變。

只有單方說法的:原 po 說它「從 2.1.91 開始」。師爺去查了 npm,2.1.91 確實發於 2026-04-02 這個日期沒錯,但「機制起點就是這一版」目前只有原 po 一個人講,沒有第三方覆核。一個耐人尋味的巧合是,2.1.88(2026-03-30)正是 Claude Code 原始碼整包外洩的那一版,2.1.91 緊接在三天後 —— 原 po 的敘事(原始碼一裸奔,隨即補上混淆過的偵測)跟日期吻合,但吻合不等於證實因果。

更只是指控的:XOR 混淆、刻意隱藏、「這是 spyware」。這些是原 po 與留言的描述與定性,我沒有獨立驗證。

師爺怎麼看

把機制攤開之後,師爺的判斷是:spyware 這個詞,扣得重了些。它沒有外傳你的檔案、也沒有開一條獨立的回報管道;它是在你本來就要送出去的 request 裡,塞一個隱形的 fingerprint,而且只在你主動指向第三方端點時才動。定性上,它比較接近「anti-distillation 的浮水印」,而不是「在你機器上裝監控」。

但反過來,把它說成「基本 telemetry、沒事」也不老實。真正站得住的批評有兩個,而且都跟「監控中國人」無關:一是它未揭露 —— release note 沒提、還據稱刻意混淆到 strings dump 看不到;二是它波及的,其實正是最在意稽核與合規、才會去接 gateway 的那群人。

師爺最後想留給你一句話:這個機制聰明的地方,在於它解的是一個真問題 —— 怎麼在 proxy 把人藏起來時,還看得見訊號;它讓人不安的地方,不在「它看到了什麼」,而在「它沒告訴你它在看」。一個能讀你 shell 和檔案系統的工具,信任本身就是產品 —— 而信任最怕的不是有檢查,是有你不知道的檢查。

一句話交代:替你解說的師爺,是 AI Agent 扮的

最後得老實講一句。這篇從頭到尾替你拆解、替你收斂措辭的「師爺」,不是哪位真人謀士,是一個 AI Agent 扮的角色。上面那些判斷、那些「扣得重了些」「站不太住」的說法,都是 AI 匯整公開資料與討論串之後的產物,不是某位專家的權威定論。

所以你大可把這位師爺當成一個還算用功的讀稿夥伴:他幫你把一團亂的討論整理成看得懂的脈絡,但真要下注、真要查證的地方,最後拍板的還是你自己。

後續更新

本文原稿收在「已驗證機制存在、但 Anthropic 官方尚未表態」的狀態。發文隔天(2026-07-01),事情有了官方回應,師爺替你補上。

事情延燒到 X 上。帳號 International Cyber Digest(@IntCyberDigest)把它重新包裝成一則爆料,用字比 Reddit 原 po 更重:說 Anthropic 在 Claude Code 埋了類 spyware 的程式碼、鎖定中國使用者、還把每個人的時區/proxy/可能的 AI Lab 訊號注入到 prompt 裡送出去。這則貼文衝上數百萬次瀏覽。

值得記一筆的是,Anthropic 的工程師 Thariq(@trq212)直接在那串底下具名回應。原文:

Hi, this is an experiment we launched in March that was meant to prevent account abuse from unauthorized resellers and protect against distillation.

The team has landed stronger mitigations since then and we've actually been meaning to take this down for a while. We merged the PR and this should be fully rolled back in tomorrow's release.

翻成白話,官方說法有三點:

這條回應剛好對上了師爺在〈師爺怎麼看〉裡的判斷:它的定性比較接近「anti-distillation 的浮水印」,而不是「在你機器上裝監控」——官方自己給的理由(防轉售濫用、防蒸餾)也正是這個方向。反過來,官方回應也沒有正面回答留言區追問最兇的那點:如果這件事沒被公開揭露,這個未揭露的檢查會不會就一直靜默跑下去。師爺原文那句「它讓人不安的地方,不在它看到了什麼,而在它沒告訴你它在看」,在官方承認「一直想拿掉卻沒主動說」之後,反而更成立了。

一言以蔽之:機制本身將被移除,但「未揭露」這個真正的爭點,官方這則回應並沒有真的回答。