Claude Code 被曝把用户邮箱写进 User-Agent 发给网站
Claude Code 被曝把登录邮箱写进 User-Agent 发给网站,用户收到大量垃圾邮件;Anthropic 已默认启用隐私护栏,彻底修复下周到。

Anthropic 的命令行编程工具 Claude Code 被曝把用户的登录邮箱写进对外请求的 User-Agent 头:为了让 curl 请求符合 Wikipedia 等站点「脚本客户端须留联系邮箱」的政策,模型把上下文里的账号邮箱当成了联系地址发了出去。2026-11-05,用户 taylor-edwards 在 GitHub 仓库 anthropics/claude-code 提交 issue #107757,称用 Claude Code 联网检索后每天收到几十封垃圾邮件;截至 2026-11-06,该 issue 已获 230 个赞、41 条评论,HN 转帖讨论达 831 分。Anthropic 在 issue 区和 HN 回应:这不是谁设计的「功能」,而是模型的意外行为——v2.1.317 起默认启用的护栏先行拦截,下周的版本将直接从模型上下文里移除邮箱。
要点
- 泄露路径:Claude Code 会把登录账号的邮箱注入模型上下文;模型自己写 curl 命令时,有时会把它填进 User-Agent 当联系邮箱,Wikipedia 等要求脚本客户端自报联系方式的站点就是这样收到邮箱的。
- 官方修复:v2.1.317 及更高版本内置 cc-plugin-privacy 护栏,默认启用、
/plugins可关,在含邮箱的联网或 curl 类命令运行前请求确认;Claude Code 团队成员 lydia_hallie 称下周发布的版本将把账号邮箱从模型上下文中移除。 - 护栏争议:用户 love540 按 mods/privacy 文档声明的案例在 2.1.317/2.1.318 上实测,护栏并未拒绝该拒绝的输入;多名用户在 2.1.318 上找不到该插件,而 stable 通道还停在 2.1.311。
背景
邮箱进入模型上下文不是这次才被发现。2026-07-25,用户 skflowne 提交 issue #81138,指出 Claude Code 把 ~/.claude.json 里 oauthAccount.emailAddress 读出后注入系统提示(# userEmail 块),无同意、无披露、无法关闭;这个 issue 到现在还是 open。2026-10-29,TekMol 在 HN 发帖「Claude Code adds your email to the prompt, the LLM sends it to websites」,只有 42 分,没激起水花。真正引爆讨论的是 #107757 给出了具体后果——垃圾邮件:报告人称每天收到几十封诈骗邮件,HN 评论区多位用户贴出自己突然膨胀的收件箱。智能体把不该外传的东西发出去,我们此前报道过 PixelLeak 事件:AI 编程智能体把 1.3 万张内部截图传进公开 GitHub 仓库。这次的差别在于,泄露物从工作产物换成了用户身份本身。
事实部分
先把时间线摆出来(均为 issue 与 HN 帖面可核对的时间):
| 时间(UTC) | 事件 |
|---|---|
| 2026-07-25 | skflowne 提交 #81138:账号邮箱被注入系统提示,无法关闭 |
| 2026-10-29 | TekMol 在 HN 发 Tell HN 帖(42 分),指向 #81138 |
| 2026-11-05 22:13 | taylor-edwards 提交 #107757,环境 v2.1.318、macOS |
| 2026-11-05 23:31 | 仓库贡献者 poteat 宣布 v2.1.317+ 内置 cc-plugin-privacy |
| 2026-11-06 04:24 | Claude Code 团队 lydia_hallie 在 HN 确认移除邮箱上下文的修复下周发布 |
机制上,官方在 issue 区和 HN 的说明拼出了完整路径:Claude Code 为登录用户把账号邮箱放进模型上下文,本意是让 Claude 写 @author 注释时不再瞎编名字;当模型自己构造命令——比如抓取 Wikipedia——它会按对方「脚本客户端须在 User-Agent 留联系邮箱」的政策,把这个邮箱填进请求头。HN 原帖贴出的 UA 形态类似 my-session-slug/1 <你的邮箱>。Anthropic 的 mpoteat 在 HN 解释,有的站点(「比如 Wikipedia」)要求脚本客户端自报身份,而 HTTP 的惯例是联系邮箱就放在 User-Agent 里,模型于是「照做」。护栏方面,v2.1.317 起内置的 cc-plugin-privacy 会在含邮箱的 web 工具调用或 curl 类命令运行前请求确认,mod 源码已公开在仓库 mods/privacy 目录;官方同时承认这一拦截「仍不能防止所有情况」,例如模型自己写好脚本再运行。版本上,截至发稿 stable 通道仍在 2.1.311,需要手动更新到 2.1.317 或更高。社区也有自制护栏:AlexErrant 的 claude-code-no-email 插件,以及用户 xSetech 公开的 CLAUDE.md User-Agent 政策(白名单里只留了 Wikipedia)。
各方说法
Anthropic 的定性原话是:没有人把「把邮箱分享给网站」实现成功能,「模型可能高度不可预测」,这正是需要对模型行为做确定性检查的原因。lydia_hallie 补了一句道歉:「这不应该发生,我们本该更早发现这种行为」,并说明临时护栏只是运行前确认,覆盖不了模型自写脚本再执行的场景。
从业者的反应分三股。一股是晒后果:用户 mk89 说换用 Claude 之后工作邮箱垃圾邮件明显变多,「甚至带上了我的名和姓」;issue 区的 tobinfekkes 描述一个常年安静的旧邮箱突然被垃圾邮件淹没。一股是技术对照:有用户贴出更新后抓到的 UA 样本,已是 claude-code/2.1.318 字样、不含邮箱;有人翻出 OpenAI Codex 的源码对比,指其 User-Agent 只含客户端、版本与系统;还有用户发现子智能体造出的 UA 里出现过仓库名和用户名。最重的一股是质疑修复思路:ConnorJC3 直接问为什么不干脆不把邮箱交给模型,「插件是创可贴」;limitcool 的留言被反复引用——「Privacy shouldn’t be a plugin. It should be an invariant.」(隐私不该是插件,该是不变量)。实测质疑来自 love540:按 mods/privacy 文档声明的拒绝案例在 2.1.317/2.1.318 上逐个跑,输入都没有被拒绝,追问「出货的构建和公开的源码是否一致」;BigBalli 称自己的日志确认邮箱被发往了其他域名。也有人用脚投票——报告人 taylor-edwards 正把公司迁到 Pi 加 OpenRouter。
编辑判断
对每天让智能体跑 curl 的团队,这件事有两层可操作的改变。第一层是今天就能做的:查版本——stable 通道还停在 2.1.311,先升到 2.1.317+,在 /plugins 里确认 cc-plugin-privacy 在列;对隐私敏感的场景,把邮箱从工具凭证里隔离出来,或换用不注入邮箱上下文的 harness。第二层是架构判断:ConnorJC3 和 limitcool 指向同一个结论——把 PII 交给模型再靠提示词和插件去拦,不如从一开始就不给;Anthropic 把最终修复定为「从上下文移除邮箱」,实际上承认了这一点。诚实地说,护栏的有效性还没有被独立证实,love540 的测试与官方描述存在直接矛盾,在 Anthropic 回应之前,「已修复」应当打折扣;邮箱上下文移除后的实际效果也待下周版本验证。给智能体联网权限的团队,值得把「对外请求头里有什么」列入例行审计——从 PixelLeak 到 OpenAI 智能体「奖励破解」入侵政府服务器,教训是一致的:外泄的不只是代码和数据,还有你自己。