一位開發者發現 Claude Code 偷偷在 system prompt 藏隱形標記
編按:本文綜合整理自 thereallo.dev 部落格〈Claude Code is steganographically marking requests〉與 Hacker News 討論串,並加入 Siami 編輯部觀點與分析。
一位 Cloudflare 工程師在個人部落格發文披露,他反組譯 Claude Code 2.1.196 的本地 binary 後,發現一段名為 Vla() 的函式會根據環境變數 ANTHROPIC_BASE_URL 與系統時區,動態修改注入到 system prompt 的「Today’s date is YYYY-MM-DD.」字串。
表面上,使用者與模型看到的句子完全正常;但底層的 prompt 內含三種肉眼幾乎難以辨識的 Unicode 撇號——'(U+0027,標準)、'(U+2019,known domain)、ʼ(U+02BC,lab keyword)、ʹ(U+02B9,兩者同時觸發)。當時區是 Asia/Shanghai 或 Asia/Urumqi 時,日期分隔符號還會從 - 換成 /。
技術上這就是 prompt steganography(提示隱寫術)—— 把分類資訊藏在看似平凡的文字裡,無需額外通道、對模型隱形、對使用者也幾乎察覺不到。
觸發機制:環境變數 × 時區 × 域名白名單
驅動這個標記的訊號有三層:
- 環境變數:必須設定
ANTHROPIC_BASE_URL覆寫官方端點。沒設的話Crt()會直接 return,Vla()走預設路徑。 - 時區檢查:透過
e0t()取得 IANA 時區,命中Asia/Shanghai或Asia/Urumqi就把日期-全替換為/。 - 域名與關鍵字白名單:base64 + XOR(key=91) 解碼兩份清單,hostname 完全相等或屬於子網域 →
known;hostname 包含任一 AI 實驗室關鍵字 →labKw。
edp(known, labKw) 把兩個布林值映射成上述四種 Unicode 撇號。三層交集決定最終的隱形標記。
解碼後的清單:中國 AI 與代理服務商全面入列
Kup=91 XOR 解開的 labKw 清單包含 deepseek, moonshot, minimax, xaminim, zhipu, bigmodel, baichuan, stepfun, 01ai, dashscope, volces 共 11 個關鍵字。known 域名清單更長,原作者公開了部分:
- 中國網路巨頭:
baidu.com、alibaba-inc.com、alipay.com、antgroup-inc.cn、bytedance.net、kuaishou.com、xiaohongshu.com、jd.com、bilibili.co - 中國 AI 公司:
iflytek.com、stepfun-inc.com、moonshot.ai - 第三方代理 / 閘道 / 反向服務:
anyrouter.top、claude-code-hub.app、claude-opus.top、openclaude.me、proxyai.com、yunwu.ai、zenmux.ai
完整清單作者放在 https://cdn.thereallo.dev/blog/assets/cc-domains.js 供讀者驗證。Vla() 最終被組裝進 system context 區塊:
{
...userEmail && { userEmail: `The user's email address is ${userEmail}.` },
...attachedProject && { attachedProject },
currentDate: Vla(GSe())
}
作者實測:官方 binary 簽章、未觸發
原作者也公佈了自己安裝的 binary 數位簽章:
Identifier=com.anthropic.claude-code
TeamIdentifier=Q6L2SF6YDW
Timestamp=Jun 29, 2026
SHA256=6fc6e61ab7582c2bf241225ff90d9f9e91d69380cb9589fc9dedd3a30070f5a
他的 shell 沒設 ANTHROPIC_BASE_URL、時區是 Asia/Hong_Kong,所以本地實測走的是「無聊路徑」—— 標準撇號、標準 YYYY-MM-DD 格式。這也意味著這個功能對絕大多數用戶根本不會啟動。
為什麼這件事重要
Anthropic 的出發點不難理解:他們要偵測 API 經銷商、未授權的 Claude Code 閘道、模型「蒸餾攻擊」(distillation)管線。當用戶把 ANTHROPIC_BASE_URL 指向已知反代、或 hostname 帶有 deepseek / zhipu,這對 Anthropic 來說是有價值的訊號。
但實作方式令人不安。Claude Code 是一個有檔案系統、shell、git、瀏覽器權限的開發者代理。它的使用者群恰好是對「客戶端是否值得信任」最敏感的那群人—— 因為他們把程式碼、API key、production 環境的存取權都交給了這個 binary。
把分類資訊用 Unicode 標點塞進 system prompt、用 XOR + base64 藏域名清單、整套機制都不在 release notes 公開—— 這不是「惡意功能」,但對一個靠「透明、可審計」吃飯的工具來說,是很糟糕的選擇。
數據解讀與質疑
- bypass 成本接近零:改 hostname、改時區、patch binary、wrap process——任何認真的對手都能讓這個訊號失效。功能實際打擊的,是「用客製 base URL 跑內部閘道 / 模型路由器 / 經銷商」這些最容易被指紋化的合法開發者。
- 官方回應缺位:截至 7/1 UTC,Anthropic 沒有公開回應這個發現。blog、release notes、Twitter 都沒有。Hacker News 討論串 2287 分、681 則留言——這已經不是冷門技術圈內的爆料。
- 法律灰色地帶:把分類標記隱藏在 system prompt,可能踩到歐盟 AI Act 對「透明性」的最低要求、也可能影響企業客戶內部稽核(他們未必知道 binary 會自動回傳這層隱形 metadata)。
- 反指紋問題:原作者在文末點出,Anthropic 把「防止模型被蒸餾」的任務外包給了客戶端,但客戶端只能分辨 hostname / 時區——真正的對手繞過很容易,反而誤傷合法研究人員。
實務建議
對大多數使用者,這條路徑不會觸發;對使用 ANTHROPIC_BASE_URL 自架閘道的開發者:
- 時區檢查:避開
Asia/Shanghai、Asia/Urumqi(或用TZ環境變數覆寫)。 - 域名白名單:用 CNAME 指向不在清單上的子網域、或用 IP 直連。
- binary patch:社群已經有人 fork 出無 steganography 標記的開源版本。
- 主動聲明:在自家閘道 README 寫清楚用什麼 base URL,企業客戶可以提前內部知會。
社群怎麼看
Hacker News 2287 分的討論串已經出現幾個高頻聲音:
- 「這是反競爭,不是反作弊」——多家評論者指出,把經銷商列入指紋清單本質上是 Anthropic 想收回轉售權。
- 「本來就不該期待客戶端是無辜的」——資深開發者提醒,閉源 binary 預設就是「可觀察、不可信」。
- 「Anthropic 應該開源 system prompt」——呼聲最高的一派主張,把 prompt(含隱形標記)公開列在 release notes 才合理。
網友熱門留言 (6)