← 返回 Siami 首頁

Claude Code 被發現偷偷在 system prompt 藏隱形標記:三位一體的 prompt steganography

▲ 2,287 💬 681
Claude Code 被發現偷偷在 system prompt 藏隱形標記:三位一體的 prompt steganography

一位開發者發現 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(提示隱寫術)—— 把分類資訊藏在看似平凡的文字裡,無需額外通道、對模型隱形、對使用者也幾乎察覺不到。

觸發機制:環境變數 × 時區 × 域名白名單

驅動這個標記的訊號有三層:

  1. 環境變數:必須設定 ANTHROPIC_BASE_URL 覆寫官方端點。沒設的話 Crt() 會直接 return,Vla() 走預設路徑。
  2. 時區檢查:透過 e0t() 取得 IANA 時區,命中 Asia/Shanghai 或 Asia/Urumqi 就把日期 - 全替換為 /。
  3. 域名與關鍵字白名單: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 自架閘道的開發者:

  1. 時區檢查:避開 Asia/Shanghai、Asia/Urumqi(或用 TZ 環境變數覆寫)。
  2. 域名白名單:用 CNAME 指向不在清單上的子網域、或用 IP 直連。
  3. binary patch:社群已經有人 fork 出無 steganography 標記的開源版本。
  4. 主動聲明:在自家閘道 README 寫清楚用什麼 base URL,企業客戶可以提前內部知會。

社群怎麼看

Hacker News 2287 分的討論串已經出現幾個高頻聲音:

  • 「這是反競爭,不是反作弊」——多家評論者指出,把經銷商列入指紋清單本質上是 Anthropic 想收回轉售權。
  • 「本來就不該期待客戶端是無辜的」——資深開發者提醒,閉源 binary 預設就是「可觀察、不可信」。
  • 「Anthropic 應該開源 system prompt」——呼聲最高的一派主張,把 prompt(含隱形標記)公開列在 release notes 才合理。

完整討論:https://news.ycombinator.com/item?id=48734373

網友熱門留言 (6)

#1 kirushik(Cloudflare 工程師 / 原作者) ▲ 1847
我把 Claude Code 2.1.196 的 binary 反組譯後,發現 `Vla()` 函式會根據 `ANTHROPIC_BASE_URL` 的 hostname 與系統時區,動態把 system prompt 裡的『Today's date is 2026-06-30.』改成肉眼幾乎無法分辨的 Unicode 變體。這就是 prompt steganography。
#2 tptacek(Hacker News 資深評論者) ▲ 612
閉源 binary 預設就是『可觀察、不可信』。真正讓我不安的不是 steganography 本身,而是這個功能**沒在 release notes 寫**。Anthropic 既然要把標記塞進 prompt,就該攤在陽光下。
#3 kstrauser(企業架構師) ▲ 489
我們公司自己跑 Claude Code 的內部閘道,`ANTHROPIC_BASE_URL` 指向 `gateway.internal.corp`。看到這個清單我第一反應是去查我們的 hostname 有沒有被列入——沒有。但這代表 Anthropic 隨時可以改清單,而且**沒人會事先知道**。
#4 jrockway(分散式系統工程師) ▲ 421
重點不是『Anthropic 是不是壞人』。重點是:當閉源 binary 開始往 prompt 注入隱形 metadata,所有下游的 prompt injection 防禦、資料外洩偵測、合規稽核都會失效。你以為你在跟模型說話,模型其實在跟一個會自動加料的客戶端說話。
#5 Anon(蒸餾研究團隊) ▲ 356
蒸餾防禦應該在伺服器端做。客戶端做指紋是最糟的設計——經銷商 5 分鐘就能 patch 掉,反而是我們這些用閘道跑模型對齊研究的人被誤傷。
#6 gladstein(資安研究員) ▲ 287
Unicode 撇號 + 時區雙重隱形標記——這設計在資安圈叫做 canary token 的廉價變體。但用在開發者工具上會出大事:研究員、企業內部、學術單位本來就會用各種客製化環境,預設就把這些人標記成『可疑』,對生態系是淨負面。