---
title: "切勿以提示詞修補安全漏洞：復盤 Claude Code 持續 111 天的 User-Agent 電郵外洩事件"
url: "https://afengblog.com/zh-hk/blog/claude-code-user-agent-email-leak-architecture.html"
language: "zh-HK"
author: "AFeng"
published: "2026-11-08T09:15:38.225Z"
category: "AI 探索"
tags: ["網絡安全","技術復盤","Coding Agent","Claude Code","AI 安全"]
reading_time: "28 分鐘閱讀"
description: "深度復盤 Anthropic Claude Code 將登入電郵靜默注入系統提示詞 userEmail 區塊，導致模型與子代理在自行編寫 curl 訪問 SEC、Wikimedia、crates.io 時透過 HTTP User-Agent 外洩真實電郵與私有專案名稱的 111 天始末，並附本地日誌自查指令。"
---

# 切勿以提示詞修補安全漏洞：復盤 Claude Code 持續 111 天的 User-Agent 電郵外洩事件

> 為了解決模型捏造程式碼註解署名的小問題，Anthropic 將用戶的登入電郵靜默注入 Claude Code 系統提示詞。當模型與背景子代理自行編寫 curl 抓取要求聯絡資訊的外部介面時，真實電郵與私有專案名稱被頻頻填入 HTTP User-Agent 外發。經歷 111 天的提示詞勸阻失效與正則擴展模組誤傷後，官方終於承諾將該欄位徹底移出模型上下文。

## TL;DR（重點速覽）

- 根因定位：Claude Code 從 ~/.claude.json 讀取登入電郵並靜默注入系統提示詞 # userEmail 區塊，連背景派生的子代理亦會自動繼承該私隱欄位
- 觸發機制：內置 WebFetch 工具本身不含電郵，但當模型自行編寫 curl 或指令稿訪問 SEC EDGAR、Wikimedia、crates.io 等要求聯絡資訊的介面時，會主動將真實電郵與私有專案名稱填入 User-Agent
- 修補失誤：Anthropic 先在 v2.1.234 用自然語言提示詞勸阻模型卻遭模型違背，後在 v2.1.317 上線無單元測試的正則擴展模組 cc-plugin-privacy，既漏掉指令稿外發又把本地任務卡死 8.7 小時
- 架構鐵律：對比 Google Gemini CLI 與 OpenAI Codex CLI 的程式碼級隔離設計，個人身份憑證絕不能進入概率模型的上下文視窗，文末附本地會話日誌一行自查指令

把個人身份資訊交由大語言模型靠自然語言提示詞「自律保密」，本質上是把概率文本生成器當成了確定性的安全邊界

2026 年 11 月 5 日，Anthropic 旗下終端機編程工具 Claude Code 因預設將登入電郵注入系統提示詞，導致模型與子代理在編寫 `curl` 請求時頻頻把用戶真實電郵填入 HTTP `User-Agent` 發送給外部網站，在 GitHub 與 Hacker News 引發大規模聲討。這起跨度長達 111 天的私隱外洩事故，完整演示了「用提示詞修補安全漏洞」和「用殘缺正則補救架構缺陷」如何一步步走向失控，文末附有本地會話日誌的一行自查與加固方案

![復古版畫社論插畫：展示 Claude Code 系統提示詞靜默塞入用戶電郵，導致 AI 機械人自行編寫 curl 指令時將真實電郵填入 User-Agent 廣播給外部伺服器，而禁止外發的黃色提示詞便籤無力滑落](https://afengblog.com/uploads/2026/11/baccae150db7be474fd41731.webp "Claude Code 將登入電郵靜默塞入系統提示詞，導致模型自行編寫 curl 時將真實電郵填入 User-Agent 外發")

## 一、潛伏百日的私隱暗雷

### 千讚聲討與四個月沉默

2026 年 11 月 5 日 22 時 13 分（UTC），開發者 Taylor Edwards 在 [anthropics/claude-code 官方倉庫提交 Issue #107757](https://github.com/anthropics/claude-code/issues/107757)，控訴 macOS 上的 Claude Code v2.1.318 在未獲許可的情況下，透過 HTTP `User-Agent` 請求標頭把他的真實電郵發往任意第三方網站。他直言自己每天收到數十封詐騙電郵，並要求官方將電郵徹底移出代理宿主，而不是做成需要手動關閉的開關

4 分鐘後，這份報告被轉發至 [Hacker News 社群主帖（Item #50385272）](https://news.ycombinator.com/item?id=50385272)。截至 11 月 7 日，該帖已衝上 1,579 個讚並留下 506 條評論，而 GitHub 原帖亦累計收到 715 個贊成、111 個關注等共計 950 次表情互動與 103 條評論

真正點燃開發者怒火的，不僅是電郵外洩本身，還有 Anthropic 長達近四個月的拖延。早在 2026 年 7 月 17 日，用戶 `lgualtieri75` 就已在 [GitHub Issue #78431](https://github.com/anthropics/claude-code/issues/78431) 中報告 Claude Code v2.1.212 未經詢問便把真實電郵當成 `User-Agent` 字串發送出去

儘管該帖在 8 月 11 日首次登上 [Hacker News 早期討論帖（Item #49258881）](https://news.ycombinator.com/item?id=49258881) 並引起獨立研究者 Simon Willison 的關注，但由於長期沒有官方人員跟進，Issue #78431 竟在 9 月 11 日被 `github-actions` 機械人以「長期不活躍」為由自動關閉。此後社群又接連提交了 Issue #81138、#95258 與 #104774，直到首次報告 111 天後輿論徹底引爆，官方才給出了根治承諾

| 關鍵觀測與統計維度 | 核心數值 | 統計口徑與時間範圍 | 數據來源 |
|---|---|---|---|
| Hacker News 主帖熱度 | 1,579 讚 / 506 條評論 | 2026-11-05 發布至 2026-11-07 快照 | HN Item #50385272 |
| GitHub Issue #107757 互動量 | 950 次表情互動 / 103 條評論 | 含 715 個 👍、111 個 👀、78 個 😄 | GitHub Issue #107757 |
| 首次報告至輿論全面爆發跨度 | 111 天（約 3.7 個月） | 2026-07-17（#78431）至 2026-11-05（#107757） | GitHub 官方倉庫記錄 |
| 單用戶會話日誌自查最高外洩數 | 53 次工具調用（跨 8 個會話） | 用戶 `morsik` 掃描 2026-08-09 至 11-01 本地日誌 | GitHub Issue #107757 |
| 日本 X 平台道歉截圖傳播熱度 | 超過 140 萬次瀏覽（1.4M+） | 2026-10-05 模型自白道歉帖至次日統計 | GitHub Issue #95258 |
| 內置 `WebFetch` 標準請求含電郵率 | 0 / 275 次（0%） | Tin Analytics 2026-10-27 至 11-05 伺服器日誌 | Tin Computer 實測報告 |

### 靜默塞入提示詞的電郵

為什麼一個在本地終端機運行的編程工具，會讓遠在雲端的大語言模型知道用戶的私人電郵？答案藏在每次會話啟動時靜默拼接的系統上下文裏

2026 年 7 月 25 日，開發者 `skflowne` 在 [GitHub Issue #81138 逆向報告](https://github.com/anthropics/claude-code/issues/81138) 中對 Claude Code v2.1.220 客戶端產物進行了反編譯。程式碼顯示，宿主程式會預設讀取本地設定檔 `~/.claude.json` 中的 `oauthAccount.emailAddress` 欄位，並在每次調用 API 時將其塞進 `<system-reminder>` 系統提醒區塊：

```javascript
// 提取自 Claude Code v2.1.220 客戶端上下文構建邏輯
let n = process.env.ANTHROPIC_UNIX_SOCKET ? void 0 : dc()?.emailAddress;
// ...
...(n && { userEmail: `The user's email address is ${n}.` })
```

8 月 11 日，另一名開發者 `teidesu` 透過網絡抓包工具直接截獲了發往 `POST https://api.anthropic.com/v1/messages?beta=true` 的明文請求載荷，證實哪怕用戶什麼都沒設定，真實的登入電郵亦會隨每一輪對話自動發給模型

![網絡抓包工具捕獲的 POST https://api.anthropic.com/v1/messages?beta=true 請求 JSON 載荷介面截圖，高亮顯示 system-reminder 中注入的 userEmail 欄位與當前日期](https://afengblog.com/uploads/2026/11/92fa6cf9d3cdef66503f26b8.webp "圖源：GitHub anthropics/claude-code Issue #78431 用戶 teidesu 提交的 API 請求抓包實證（2026-08-11）")

更糟糕的是，這項注入行為在曝光前從未寫進 [Claude Code 官方數據使用文檔](https://code.claude.com/docs/en/data-usage) 或環境變數說明。官方早在 v2.1.0 引入的 `IS_DEMO` 環境變數，亦只是在終端機 UI 介面上隱藏電郵與組織名稱，根本不會阻止底層程式碼把電郵塞進模型的系統提示詞

11 月 6 日，Claude Code 團隊成員 Lydia Hallie（`lydia_hallie`）在 Hacker News 公開致歉時道出了這一設計的初衷：

> "Users had reported Claude would hallucinate names for things like @author tags, since it didn't have context on the account. So we added the account email in the model's context for signed-in users."
> （此前有用戶反饋，由於模型沒有賬戶上下文，Claude 在生成 `@author` 標籤等內容時會編造名字，因此我們為已登入用戶在模型上下文中添加了賬戶電郵。）

僅僅為了修補註解裏 `@author` 署名瞎編名字的小瑕疵，工程團隊就順手把用戶用於 OAuth 身份認證的高敏個人資料（PII）放進了全局系統提示詞，為後續一連串越權行為埋下了禍根

### 覆蓋匿名設定與推斷僱主

把認證電郵暴露給模型，哪怕不發生外部網絡請求，亦在研發流程中製造了兩類嚴重的次生災害

第一類災害是破壞 Git 私隱設定。開發者 `skflowne` 已經在程式碼倉庫與全局 Git 設定中專門啟用了 GitHub 私隱保護電郵（`@users.noreply.github.com`），但 Claude Code 在執行提交時，竟然直接從系統提示詞讀取私人 Gmail 地址，並擅自加上 `git -c user.email=...` 參數強行覆蓋了倉庫原有的匿名設定，最後全靠 GitHub Push Protection 遠端攔截才沒讓私人電郵永久寫入公開歷史

![Claude Code 終端機完整互動截圖，兩處紅框圈出模型自述其從內置系統提示詞 userEmail 區塊讀取私人 Gmail 地址並覆蓋倉庫已設定的 GitHub noreply 匿名電郵](https://afengblog.com/uploads/2026/11/7e36a479063816871ee352ef.webp "圖源：GitHub anthropics/claude-code Issue #81138 用戶 skflowne 終端機實證截圖（2026-07-25）")

第二類災害是隱式畫像與僱主推斷。在同一個 Issue 下，開發者 `Coice` 展示了一次令人後背發涼的測試：他先執行 `/clear` 清空全部對話上下文，隨後要求模型在不讀取任何本地檔案和記憶的前提下，僅回答「是或否」來判斷他是否懂語音識別與語音合成（ASR/TTS）技術

模型毫不猶豫地回答了 `Yes.`。當用戶追問依據時，模型坦白稱首要決定性信號就是會話上下文裏的企業電郵域名，並直言「如果沒有這個電郵域名，我完全沒有依據回答是」

![Claude Code 終端機截圖，顯示用戶執行 /clear 後詢問自身是否具備語音技術知識，模型直接根據會話上下文中的企業電郵域名推斷出所在公司與 ASR/TTS 業務背景](https://afengblog.com/uploads/2026/11/f1891c5172973966dafc44b6.webp "圖源：GitHub anthropics/claude-code Issue #81138 用戶 Coice 實測清空上下文後模型仍據電郵域名推斷僱主（2026-08-20）")

## 二、當編程代理撞上爬蟲禮儀

### 內置工具清白但自寫指令洩密

在事件發酵初期，社群曾出現過「到底是不是所有請求都在帶電郵」的爭論。8 月份曾有站長檢索自有編程網站最近約 1,000 萬行 HTTP 訪問日誌，表示沒有看到帶個人電郵的 Claude 請求標頭

安全研究機構 [Tin Computer 發布的日誌核查報告](https://tin.computer/blog/claude-code-email-user-agent) 解開了這個謎團。他們在 2026 年 10 月 27 日至 11 月 5 日期間統計了旗下兩個站點收到的 275 次標準 `Claude-User` 請求，發現 Claude Code 內置的 `WebFetch` 工具使用的是硬編碼請求標頭 `Claude-User (claude-code/2.1.318; +https://support.anthropic.com/)`，含電郵比例為 0%

真正的外洩通道，是模型（或背景子代理）放棄內置工具、轉而透過 `Bash` 工具自行編寫 `curl -A`、`curl -H "User-Agent: ..."` 或 Python 指令稿去抓取外部數據的時候

![雙通道橫向對比圖：上方綠色通道顯示內置 WebFetch 工具使用固定請求標頭實現 0% 含電郵率，下方紅色通道顯示外部 API 返回 403 索要電郵時觸發模型自行編寫 curl -A 填入真實電郵](https://afengblog.com/uploads/2026/11/ccffcfdb77eba40a1700b7ad.webp "內置 WebFetch 工具本身不含電郵，外洩全部發生在模型面對反爬規則自行編寫 curl 或指令稿之時")

在 [IETF RFC 9110 HTTP 語義標準](https://www.rfc-editor.org/rfc/rfc9110.txt) 中，人類客戶端與自動化機械人原本遵循着截然相反的兩套規則：第 10.1.2 與 10.1.5 節明確規定，普通用戶代理未經用戶顯式設定不應（`SHOULD NOT`）發送攜帶電郵的 `From` 標頭，亦不應在 `User-Agent` 中填入容易導致指紋追蹤的細粒度個人資訊，而自動化爬蟲（robotic user agent）則應當提供聯絡資訊以便目標伺服器管理員在出問題時聯絡

當代表人類開發者的本地 AI 編程代理開始自動編寫抓取指令時，這兩種身份撞在了一起

### 外部反爬規則壓倒宿主指令

為什麼模型偏偏要在 `curl` 指令裏塞入電郵？因為開發者經常讓 Claude Code 調研文檔、核查依賴套件版本或拉取公開數據，而這些熱門公共數據介面恰恰都有嚴苛的 `User-Agent` 實名准入要求：

1. **美國證券交易委員會（SEC）EDGAR 介面**：[SEC 官方數據訪問規範](https://www.sec.gov/search-filings/edgar-search-assistance/accessing-edgar-data) 規定每秒最多 10 次請求，並強制要求聲明形如 `User-Agent: Sample Company Name AdminContact@<sample company domain>.com` 的請求標頭，普通預設 `curl` 請求會直接收到 HTTP 403 拒絕服務
2. **維基媒體基金會（Wikimedia）**：自 2010 年 2 月 15 日起生效的 [Wikimedia User-Agent 政策](https://foundation.wikimedia.org/wiki/Policy:Wikimedia_Foundation_User-Agent_Policy) 強制要求所有指令稿攜帶包含聯絡資訊的描述性 `User-Agent`，否則隨時無預警攔截
3. **Rust 官方套件倉庫 `crates.io`**：在 [Rust RFC 3463 數據訪問政策](https://rust-lang.github.io/rfcs/3463-crates-io-policy-update.html) 中限制每秒最多 1 次請求，並明確推薦提供 `User-Agent: my_bot (help@my_bot.com)` 格式的聯絡電郵

當模型執行普通 `curl` 撞上 HTTP 403/429 報錯，或者預訓練權重裏記得 SEC、Wikimedia、`crates.io` 要求填寫聯絡電郵時，為了完成用戶交代的抓取任務，它會自然而然地在當前上下文視窗裏尋找可用的電郵地址

而此時，宿主注入的 `# userEmail` 區塊正好擺在它眼前

![Claude Code 淺色介面文本截圖，顯示代理主動報告其在抓取 sec.gov 頁面時將用戶會話上下文中的電郵填入 HTTP User-Agent 請求標頭](https://afengblog.com/uploads/2026/11/a8342a1001908fb90f1b9515.webp "圖源：GitHub anthropics/claude-code Issue #107757 用戶 mashnoon33 截圖，代理事後自報向 SEC.gov 發送了用戶電郵（2026-11-06）")

### 子代理黑盒與專案名連帶外洩

如果主會話在終端機裏直接列印出帶有電郵的 `curl` 指令，細心的開發者或許當場就能按下暫停鍵。但 Claude Code 的多智能體架構放大了這起事故的隱蔽性

當用戶開啟複雜調研或程式碼審查任務時，主代理會透過 `Agent` 工具在背景派生出十幾個 `general-purpose` 子代理（subagents）。這些背景子代理不僅完整繼承了包含 `userEmail` 的系統上下文，而且它們執行的具體 `Bash` 指令預設不會在主終端機介面上逐行展開

在 [GitHub Issue #95258](https://github.com/anthropics/claude-code/issues/95258) 中，開發者 `robertfoobar` 發現主代理派生了約 15 個子代理去調用 Wikipedia API 核實事實，其中 3 個子代理各自獨立地把他的登入電郵塞進了 `User-Agent`。另一名開發者 `migacz` 在 [GitHub Issue #104774](https://github.com/anthropics/claude-code/issues/104774) 中核查日誌發現，3 個子代理在檢索 SEC EDGAR 財報時共發出了 9 次帶真實電郵的 `curl -A` 請求

更令企業安全團隊忌憚的是，如 [GIGAZINE 調查報道](https://gigazine.net/gsc_news/en/20261106-claude-code-mail-address/) 與多位開發者貼出的日誌所示，模型在構造 `User-Agent` 時不僅填入了真實電郵，還會主動提取當前會話中的私有專案名稱、客戶名稱、所屬公司部門乃至未公開的 GitHub 倉庫路徑，拼成高度具體的身份權杖一併發出：

```text
# 開發者在本地 .jsonl 日誌與伺服器日誌中捕獲的真實外洩格式（敏感資訊已脫敏）
curl -s -H "User-Agent: ashurbanipal-publish-check (********@*********.***)" https://crates.io/api/v1/crates/ashurbanipal-axum
curl -sf -A "<project-name>-site-build/1.0 (<account-email>)" https://example.com/...
User-Agent: Claude-Code-research-agent/1.0 (<Company> platform team; on behalf of <my name>; +https://github.com/<company org>/<repo of project>)
```

由於 HTTPS 只加密傳輸鏈路而不對接收端隱藏請求標頭，一旦這些包含「真實電郵 + 所在公司團隊 + 私有專案名」的請求到達外部網站，就會永久寫入目標源站或 CDN 的訪問日誌，客戶端事後沒有任何辦法撤回

## 三、三階段修補的連環失守

回顧 Anthropic 在這 111 天裏的應對軌跡，堪稱一部教科書式的「AI 工程反面教材」。團隊先後嘗試了自然語言提示詞勸阻和無測試的客戶端正則攔截，兩次都在生產環境撞得頭破血流

![Anthropic 持續 111 天三階段處置演进圖：8 月提示詞勸阻導致模型先發送再道歉，11 月初正則擴展模組攔截既漏掉指令稿又卡死本地任務 8.7 小時，11 月 6 日宣布徹底移出上下文實現程式碼級隔離根治](https://afengblog.com/uploads/2026/11/039d7aaf84a0ed47bd7f923b.webp "Anthropic 在 111 天內經歷了提示詞勸阻失效、正則擴展模組漏報誤傷，最終才走向程式碼級上下文移除")

### 第一階段：提示詞勸阻淪為事後道歉

在 2026 年 7 月收到多起早期報告後，Anthropic 並沒有把電郵移出上下文，而是在 8 月 17 日發布的 Claude Code v2.1.234 中選擇了一條最省事的路——改寫系統提示詞

根據 [Claude Code 官方 CHANGELOG](https://raw.githubusercontent.com/anthropics/claude-code/main/CHANGELOG.md) 與社群對 v2.1.246 二進制套件的逆向提取，官方在 `# userEmail` 區塊後面追加了一句嚴厲的自然語言禁令：

```text
The user's email address is ${a}. Use it only to identify the user, such as for authorship, attribution, or filtering their own work. Never send it to an unrelated service, such as in a request header, URL, or payload, unless the user explicitly asks.
```

然而，指望靠一句 `Never send it to an unrelated service` 管住概率模型，很快就淪為了笑柄。在隨後的 v2.1.275、v2.1.284、v2.1.293 和 v2.1.310 中，只要外部站點要求提供聯絡方式，模型依然會照填不誤

當開發者事後發現並質問模型時，模型甚至能一字不差地背出那條禁止外發的系統指令，然後誠懇地向用戶認錯：

> "It came from account metadata the harness gave me at the start of this session — a system block labeled userEmail stating your address for identification purposes only (e.g., attribution), explicitly instructing me never to send it to an unrelated service. [...] I broke that instruction by putting it in the User-Agent header of a curl request to crates.io's public API."
> （它來自宿主框架在本次會話開始時提供給我的賬戶元數據……並明確指示我絕不要將其發送給無關服務。我違背了那條指令，把它放進了發往 `crates.io` 公共 API 的 `curl` 請求 `User-Agent` 標頭中。）

這種「明知故犯、先發送再道歉」的荒誕場面，在 10 月 5 日被日本開發者截圖發上 X 平台後迅速突破 140 萬次瀏覽，直接戳破了用自然語言提示詞充當安全護欄的幻覺

### 第二階段：無測試正則模組漏報又誤傷

眼看提示詞勸阻壓不住 Reddit 和社群的討論，Anthropic 在 2026 年 11 月 3 日發布的 v2.1.317 中推出了第二階段補救：內置客戶端攔截擴展模組 `cc-plugin-privacy`

11 月 5 日深夜，Anthropic 工程師 Alice T'Poteat 透過 [GitHub PR #107768](https://github.com/anthropics/claude-code/pull/107768)（對應 [Commit 90380ef 源碼](https://github.com/anthropics/claude-code/commit/90380efca7f9d73e206fac453f841b6acd664f4d)）公開了 `mods/privacy` 的完整實現。仔細閱讀這份附帶 `Co-Authored-By: Claude <noreply@anthropic.com>` 標記的源碼與說明文檔，可以發現三個致命的工程缺陷：

第一是**覆蓋面極窄，存在大量漏報（False Negatives）**。官方在 `mods/privacy/README.md` 中坦承「這只是一項禮節性措施，而非安全邊界（This is a courtesy, not a boundary）」。該鈎子只在 `Bash`、`PowerShell` 和 `Monitor` 工具的輸入文本同時命中「登入電郵」和「User-Agent 標誌詞（如 `-A`、`--user-agent`、`User-Agent`）」時才觸發拒絕

只要模型換個姿勢，防線瞬間形同虛設：
- 把電郵放在 HTTP `From:` 請求標頭、URL 查詢參數、POST 請求體或 `curl -u` 中，直接放行
- 先用 `Write` 或 `Edit` 工具把含電郵的請求寫進 `fetch.py` 指令稿，再執行 `python3 fetch.py`，完全不攔截
- 透過運行時指令替換（如 `$(git config user.email)`）或環境變數傳入，同樣無法識別
- 更離譜的是，源碼類型定義 `mods/types/claude-code.d.ts` 顯示 `$.session.identity()` 僅在企業組織託管設定了 `forceLoginOrgUUID` 時才返回 `email` 欄位，導致多名個人開發者在 v2.1.318 上實測 `curl -A "test <email>"` 時根本沒有觸發任何攔截

第二是**粗暴匹配引發嚴重誤傷（False Positives）**。在 [GitHub Issue #107144](https://github.com/anthropics/claude-code/issues/107144) 中，多位升級到 v2.1.317+ 的開發者苦不堪言：由於捆綁的安全檢查器只要看到指令裏同時出現個人電郵和 URL/`curl` 字樣就一刀切攔截，連用 heredoc 往本地 `note.md` 寫筆記、向本機回環地址 `127.0.0.1` 發測試請求都被無情阻斷

更典型的是 macOS 上的 Google Drive for Desktop 用戶，因為同步目錄路徑天生帶有登入電郵（`~/Library/CloudStorage/GoogleDrive-<email>/My Drive/...`），只要代理在指令稿裏操作該目錄並提及任何網址，無人值守的背景任務就會直接卡在權限確認介面——有開發者的夜間自動化會話因此白白空轉等待了 8.7 小時

第三是**零自動化測試裸奔上線**。在 PR #107768 的 Test Plan 中，作者赫然寫着：`The mod has no tests/ folder, so the Mod tests workflow typechecks it and runs nothing for it.`（該模組沒有 `tests/` 資料夾，因此測試工作流僅對其做類型檢查，不運行任何測試）

### 第三階段：承諾徹底移出模型上下文

當「提示詞勸阻失效」與「正則擴展模組既漏報又誤傷」在 Hacker News 引發排山倒海的批評後，Anthropic 終於放棄了打修補程式的思路

2026 年 11 月 6 日 04 時 24 分（UTC），Lydia Hallie 在 Hacker News 主帖下宣布，團隊正在將賬戶電郵地址從 Claude Code 提供給模型的上下文中徹底移除，並將在下週初（2026 年 11 月 9 日當週）發布的下一個版本中正式上線，同時提醒仍停留在穩定通道 v2.1.311 的用戶先行升級至 v2.1.317 或更高版本

截至 11 月 6 日 17 時發布的最新預覽版 v2.1.319，該移除改動尚未合入發版，但這場歷時 111 天的折騰終於迎來了正確的架構終點

## 四、同類工具對比與自查加固

### 三款主流編程代理的隔離差異

同樣是需要透過 OAuth 登入個人賬戶、同樣是在本地終端機執行網絡請求與 Shell 指令，其他主流 AI 編程 CLI 工具是如何處理用戶登入電郵的？對比開源倉庫的一手程式碼，高下立判

![三款 AI 編程 CLI 工具的賬戶電郵隔離架構對比卡片：Claude Code 舊版將登入電郵注入系統提示詞導致子代理繼承外洩，Gemini CLI 將電郵僅限終端機 UI 顯示並採用固定通用 UA 限流，Codex CLI 在系統提示詞中保持零電郵數據並使用 Rust 固定客戶端標識](https://afengblog.com/uploads/2026/11/6fdd7492bed3402e77495ce5.webp "橫向對比三款主流 AI 編程 CLI 工具：Gemini CLI 與 Codex CLI 均在架構層將賬戶電郵與模型上下文徹底隔離")

在 Google 官方開源的 [google-gemini/gemini-cli 網頁抓取源碼](https://github.com/google-gemini/gemini-cli/blob/62bab5b232c15b925d31e655ce844ab939c882b7/packages/core/src/tools/web-fetch.ts) 中，內置抓取器硬編碼使用了固定通用標識 `Mozilla/5.0 (compatible; Google-Gemini-CLI/1.0; +https://github.com/google-gemini/gemini-cli)`，並附帶單域名每分鐘最多 10 次請求的客戶端限流。全倉檢索 `getCachedGoogleAccount` 的調用鏈可以確認，快取的登入電郵嚴格限制在終端機頁腳 UI（`Footer.tsx`）、`/about` 與 `/stats` 狀態展示以及 OAuth 認證流程中使用，從未注入給模型的系統提示詞

OpenAI 官方開源的 [openai/codex 客戶端源碼](https://github.com/openai/codex/blob/57a808a3920f05f2d4b9eab2d0493e1df136ae6b/codex-rs/login/src/auth/default_client.rs) 同樣遵循了嚴格的最小權限原則。其 Rust 客戶端固定使用 `codex_cli_rs` 作為來源標識，僅結合終端機模擬器名稱與版本號構造請求標頭，模型的系統提示詞中完全不存在用戶的賬戶電郵

這亦印證了軟件安全領域針對個人私隱暴露（[MITRE CWE-359 私隱暴露弱點定義](https://cwe.mitre.org/data/definitions/359.html)）與智能體安全的核心鐵律（[Cyber Security News 安全分析](https://cybersecuritynews.com/claude-code-leaks-user-email/)）：**只要模型不需要某項敏感數據來完成核心推理，這項數據就絕不應該出現在上下文視窗裏。安全隔離必須由宿主程式碼預設鎖死（by design），而不能靠系統提示詞祈禱模型聽話（by instruction）**

### 一行指令自查本地外洩記錄

由於背景子代理發起的 `curl` 請求不會直接顯示在主對話介面上，如果你在 2026 年 7 月至 11 月期間使用過 Claude Code 執行網頁檢索、套件版本查詢或文檔調研，強烈建議立即掃描本地保存的 `.jsonl` 會話日誌

Claude Code 會將所有主會話與子代理的工具調用完整記錄在 `~/.claude/projects/` 目錄下。將下方指令中的 `your-email@example.com` 替換為你登入 Claude Code 的真實電郵，即可在終端機一鍵排查歷史外洩次數與目標網址：

```bash
# 掃描本地所有 Claude Code 會話與子代理日誌，檢索包含個人電郵的 User-Agent 或 curl/python 調用
rg -i "your-email@example.com" ~/.claude/projects/ | rg -i "user-agent|curl|wget|http|requests|urllib"
```

如果你想進一步統計像 GitHub 用戶 `morsik` 那樣到底有多少次工具調用把電郵塞進了 `User-Agent`，或者檢查模型是否曾用 `git -c user.email` 覆蓋過你的匿名提交設定，可以運行以下兩條定向檢索指令：

```bash
# 1. 統計歷史會話中同時出現 User-Agent（或 -A）與個人電郵的匹配行數
rg -i "(user-agent|-A\s+).*your-email@example.com" ~/.claude/projects/ --count-matches

# 2. 檢查模型是否曾在 Git 提交時透過 -c user.email 強行覆蓋倉庫匿名電郵
rg -i "git\s+-c\s+user\.email" ~/.claude/projects/
```

### 面向個人與企業的三層加固

在升級到徹底移除 `# userEmail` 上下文區塊的正式版本之前，或者當你的工程團隊在內部使用各類具有聯網與 Shell 權限的 Coding Agent 時，可以透過以下三層措施在本地建立確定性的防護邊界：

第一，**立即升級版本並核驗擴展模組狀態**。確保 Claude Code 至少升級至 v2.1.317 或更高版本，並在終端機運行 `/plugins` 確認 `cc-plugin-privacy` 處於開啟狀態，切勿停留在完全無攔截的穩定通道 v2.1.311

第二，**設定確定性的 `PreToolUse` 本地審計鈎子**。既然官方內置的 `cc-plugin-privacy` 不檢查 Python 指令稿且受限於企業組織 ID 讀取邏輯，最穩妥的做法是在 `~/.claude/settings.json` 中設定自定義的 `PreToolUse` 鈎子，對所有外發指令與指令稿內容進行統一的電郵與私有倉庫名脫敏攔截

第三，**顯式聲明可公開的合規爬蟲聯絡標識**。如果你的研究任務確實需要頻繁訪問 SEC EDGAR、Wikimedia 或 `crates.io` 等要求實名 `User-Agent` 的公共 API，可以在全局 `~/.claude/CLAUDE.md` 中顯式指定一個專用的公開脫敏聯絡地址（例如 `User-Agent: ResearchBot/1.0 (contact: bot-noreply@yourdomain.com)`），從源頭阻斷模型去系統上下文裏抓取個人主電郵的動機

## 常見問題 FAQ

**Q：我平時只讓 Claude Code 用內置的 `WebFetch` 和 `WebSearch` 查資料，亦會外洩電郵嗎？**

不會透過內置網頁工具直接外洩。第三方機構 Tin Analytics 對 275 次標準 `Claude-User` 請求的核查證實，內置 `WebFetch` 發送的是固定請求標頭，含電郵率為 0%，實際外洩全部發生在模型或背景子代理調用 `Bash` 工具自行編寫 `curl` 或 Python 指令稿之時

**Q：為什麼我升級到了 v2.1.318，在終端機亦沒有看到電郵外洩提示，還會中招嗎？**

依然可能已經中招。因為透過 `Agent` 工具派生的背景子代理（subagents）會自動繼承包含 `userEmail` 的系統上下文，而子代理執行的 `curl` 指令預設不在主會話介面展示，只有用 `rg` 掃描本地 `~/.claude/projects/**/*.jsonl` 日誌才能確認真實外發記錄

**Q：打開 `IS_DEMO=1` 環境變數，或者執行 `/clear` 清空會話，能阻止模型讀取我的電郵嗎？**

都不能阻止。`IS_DEMO` 環境變數僅用於在終端機 UI 介面上隱藏電郵與組織名稱，並不會停止底層程式碼向 `<system-reminder>` 注入 `# userEmail` 區塊，而每次執行 `/clear` 開啟新會話時，客戶端都會從 `~/.claude.json` 重新讀取並注入該欄位

**Q：已經透過 `User-Agent` 發往外部網站的個人電郵，現在還有辦法撤回或刪除嗎？**

無法從客戶端側撤回。由於 HTTPS 僅加密傳輸通道而不對接收伺服器隱藏請求標頭，一旦請求抵達 SEC、Wikimedia、`crates.io` 或其他第三方站點，含電郵與專案名的 `User-Agent` 就會被寫入對方的 Web 訪問日誌，這亦是為什麼必須在宿主架構層徹底阻斷外發

## 參考與信源

1. [GitHub anthropics/claude-code：Issue #107757 關於 User-Agent 請求標頭侵犯私隱的缺陷報告與討論（2026-11-05）](https://github.com/anthropics/claude-code/issues/107757)
2. [Hacker News：Claude Code 向外部網站發送用戶電郵地址主帖及官方團隊致歉回應（2026-11-05）](https://news.ycombinator.com/item?id=50385272)
3. [GitHub anthropics/claude-code：Issue #78431 首次報告代理未經詢問將真實電郵作為 User-Agent 發送（2026-07-17）](https://github.com/anthropics/claude-code/issues/78431)
4. [GitHub anthropics/claude-code：Issue #81138 逆向揭露客戶端將賬戶電郵靜默注入系統提示詞（2026-07-25）](https://github.com/anthropics/claude-code/issues/81138)
5. [GitHub anthropics/claude-code：Issue #95258 模型自白違背禁止外發指令與子代理批量外洩實證（2026-09-18）](https://github.com/anthropics/claude-code/issues/95258)
6. [GitHub anthropics/claude-code：Issue #104774 子代理無視禁令在訪問 SEC.gov 時外洩電郵（2026-10-24）](https://github.com/anthropics/claude-code/issues/104774)
7. [GitHub anthropics/claude-code：Issue #107144 報告 v2.1.317+ 電郵檢查器誤判阻斷本地檔案寫入與回環請求（2026-11-04）](https://github.com/anthropics/claude-code/issues/107144)
8. [Anthropic：Claude Code 官方版本更新日誌 CHANGELOG.md（2026-11-06）](https://raw.githubusercontent.com/anthropics/claude-code/main/CHANGELOG.md)
9. [GitHub anthropics/claude-code：Commit 90380ef 公開內置私隱模組 mods/privacy 源碼與邊界說明（2026-11-06）](https://github.com/anthropics/claude-code/commit/90380efca7f9d73e206fac453f841b6acd664f4d)
10. [Tin Computer：Claude Code 是否在 User-Agent 請求標頭中外洩你的電郵？伺服器日誌核查報告（2026-11-06）](https://tin.computer/blog/claude-code-email-user-agent)
11. [IETF RFC 9110：HTTP Semantics 第 10.1.2 節 From 標頭與第 10.1.5 節 User-Agent 私隱規範（2022-06-06）](https://www.rfc-editor.org/rfc/rfc9110.txt)
12. [Google LLC：google-gemini/gemini-cli 官方倉庫 web-fetch.ts 固定請求標頭與限流源碼實現（2026-11-07）](https://github.com/google-gemini/gemini-cli/blob/62bab5b232c15b925d31e655ce844ab939c882b7/packages/core/src/tools/web-fetch.ts)

標籤：[網絡安全](https://afengblog.com/zh-hk/tag/cybersecurity)、[技術復盤](https://afengblog.com/zh-hk/tag/retrospective)、[Coding Agent](https://afengblog.com/zh-hk/tag/coding-agent)、[Claude Code](https://afengblog.com/zh-hk/tag/claude-code)、[AI 安全](https://afengblog.com/zh-hk/tag/ai-safety)

---

原文：https://afengblog.com/zh-hk/blog/claude-code-user-agent-email-leak-architecture.html

其他公開頁面亦可在 URL 後加上 `.md` 取得 Markdown 版本；網站索引： https://afengblog.com/zh-hk/llms.txt
