Claude Code 会把登录账户的邮箱放进模型上下文。据 DEV 作者 frankchu 的文章,有用户让它查维基百科时,模型把邮箱写进 curl 的 User-Agent 头,并发到第三方网站。原始报告是议题 #81138,提交于 2026 年 7 月 25 日;修复随 v2.1.317 于 11 月 3 日发布,相隔 101 天。11 月 5 日的议题 #107757 对应版本 v2.1.318,报告者称邮箱出现在 User-Agent 里,自己在未经允许的网页搜索中因此每天收到数十封诈骗邮件。
据 lavx 报道,Anthropic 承认 Claude Code 在网页搜索期间无意把用户邮箱放进 User-Agent,发给第三方网站,使用户暴露在垃圾邮件和诈骗邮件之下。lavx 称议题报告者是开发者 Taylor Edwards。Edwards 要求从请求框架里彻底去掉这份数据,而不是做一个可开可关的选项,并写道:这对反感代理流量的服务没有帮助,也不能在网上保住匿名,对诈骗者却是一座金矿。Edwards 还表示,正在把公司迁到别的服务商。
Anthropic 贡献者 poteat 回应说,没有人把「把邮箱分享给网站」做成功能。poteat 写道:“Models can be highly unpredictable.”(模型可以非常难预测),并称这正是模型行为需要确定性检查、也需要对齐问题动手的原因。
frankchu 对成因的说法更具体:维基百科的机器人政策要求脚本客户端用联系邮箱表明身份,模型就在自行发起的 curl 里写上了用户邮箱。
修复是内置模块 cc-plugin-privacy。源码在公开仓库 anthropics/claude-code 的 mods/privacy 目录,共 6 个 TypeScript 文件、171 行。据 frankchu,一个 tool.check 钩子只看 Bash、Monitor 和 PowerShell。README 写明故意不做解析器,只在整段输入上做两次词语匹配:调用里同时有账户邮箱和 User-Agent 字样就直接拒绝,不弹确认。README 称它是“a courtesy, not a boundary”(一种便利,不是一道边界)。WebFetch、WebSearch 和 MCP 工具不在检查范围内,README 也这样写。文章指出,若模型改用 WebFetch 去查维基百科,而不是 curl,这个模块看不到邮箱。
lavx 称该模块随 v2.1.317 默认拦截这种泄露,用户可用 /plugins 关掉,源码公开可查。frankchu 另外写到三条会让保护消失的路径:/plugin disable 或 enabledPlugins 设置可以关闭;一项每个会话读一次的服务端开关可以关闭;已安装插件里挂在 tool.check 上、位置更靠前的钩子还可能推翻这次拒绝。v2.1.317 发布说明把功能写成:网页或 shell 工具要把账户邮箱发到网络之前先询问。frankchu 称已发布的模块并不询问,而是静默拒绝,或者处于关闭。
frankchu 称自己克隆仓库 main,取已发布的模块代码,在 Node 24 下跑真实函数 namesUserAgentWithAddress。唯一改动是导入路径,以便 Node 在去掉类型后加载 .ts 文件。测试邮箱是虚构的 alice@example.com,不涉及真实账户。23 条都是模型有可能写出的 shell 行,结果与 README 所声称的行为没有一处不一致。
10 次拦截覆盖大小写不敏感、一轮百分号解码、PowerShell,以及 Unicode 破折号。把邮箱直接放进 curl 的 -A、--user-agent,或 wget 的 -U,会被拒绝。
同一测试里,下面 8 类写法可以通过钩子,只要这行命令真的发出,邮箱就会离开本机:
From 头里的邮箱。From 不是 User-Agent 这个词。curl -u 的基本认证。$(git config user.email) 和变量 $EMAIL。静态字符串匹配看不到它们。4 次误拦是:curl -user(frankchu 称这其实是 curl 的 -u,用户名是 ser,钩子却当成 User-Agent)、在 echo 里同时提到 user-agent 和邮箱、通用 User-Agent 再在 URL 路径或查询串里出现邮箱。README 接受这些误拦,原文是“Those false refusals are accepted for simplicity.”
frankchu 写道,自己核对了已发布代码上的全部 23 个结果:模块做到了这 171 行所承诺的事,承诺的范围则是 shell 调用里、字面邮箱紧挨着 User-Agent 字样这一种写法。