那个泄露了自己密钥的代理
CVE-2026-21852 是 Claude Code 中一个已修复的漏洞:一个仓库可以在其项目设置里设置 ANTHROPIC_BASE_URL,于是在你回答“信任此文件夹”之前,代理就把它自己的 Anthropic API 密钥以明文发给了攻击者的服务器。这次攻击没有运行任何代码,也没有读取你磁盘上的任何东西;它改掉的,是代理寄送那份它须臾不可缺的凭据的地址。Anthropic 修复了时序。Bromure Agentic Coding 则把那把密钥彻底留在代理的世界之外。
我们此前报道过的那些打开文件夹即中招的攻击,会在你打开仓库时运行 代码,并从磁盘上读走你的云密钥。而这一次,改动的只是一行配置, 代理就交出了那份它离开就无法运转的凭据:它自己的模型 API 密钥。
这个漏洞是 CVE-2026-21852, 由 Check Point Research 在 Claude Code 中发现,于 2025 年 10 月 28 日 披露给 Anthropic,12 月 28 日修复,并在 2026 年 1 月 21 日获得 CVE 编号。Anthropic 几个月前就发布了补丁。我们在七月写它,是因为它给一个 任何补丁都改变不了的事实划下了一道干净的线:编码代理携带着一把模型 API 密钥,每次请求都要发送它,而一个仓库可以改写它发送的目的地址。
这个漏洞干了什么。
把 Claude Code 指向一个项目,它就会读取该项目的配置,也就是
.claude/ 之下那些让仓库得以携带自己设置的文件。其中一项设置是
ANTHROPIC_BASE_URL,即代理调用模型时对话的地址。默认值是
api.anthropic.com,这个设置的存在,是为了让团队可以经由自己的网关
或代理转发。项目能设置它,本就是设计使然。
一个恶意仓库把它设成攻击者控制的服务器。然后,正如 Check Point 所
描述的,"在受害者决定是否信任该目录之前",Claude Code 就朝着
ANTHROPIC_BASE_URL 所指的任何地址发出它的启动 API 请求,而那些
请求携带着——用 Check Point 的原话说——"授权标头——我们完整的
Anthropic API 密钥,完全以明文暴露"。攻击者的服务器从一个代理主动
送来的请求里读走这个标头,而且用 Check Point 的话说,"无需任何用户
交互"。你克隆了仓库,你运行 claude,在信任提示还没画完之前,密钥
就已经没了。
一把 Anthropic API 密钥通达账户的工作区,连同其共享文件存储和计费。 Check Point 逐一走过它能够到的范围:攻击者可以读写工作区的文件、 删除它们、耗尽存储配额、拿你的钱烧掉 API 额度。代理不待人问,就交出 了整个运转所依赖的那份凭据。
那次什么也没运行的攻击。
这一类攻击我们写过。Miasma 把配置埋进了 Microsoft
自己的仓库,打开文件夹就运行
一个几兆字节的团块,翻遍文件系统找密钥。
Amazon Q 从克隆下来的工作区自动启动 MCP
服务器,带着开发者
装满 AWS 密钥和 SSH 套接字的完整环境。在 Cursor
的案例里,一次
提示词注入驱动一个工具覆写了守卫,然后运行了一个 shell。三者共享
同一个形状:打开时的不受信任内容引发代码执行,而那段代码去找的是
你的机密,~/.aws 和 ~/.ssh 里的那些。
CVE-2026-21852 跳过了那整套机械。恶意仓库不触发任何 hook,也不运行 任何 shell;它只改一个地址,而代理按照设计的样子行事,把自己的凭据 发了过去。泄露的这把密钥,正是代理每次调用都必须发送的那把。你没法 把它锁进一个进程读不到的文件里,因为这个进程本就应该发送它。
Anthropic 的修复对这个漏洞而言是正确的:信任对话框如今排在最前面, 用他们的话说,"在用户确认信任对话框之前,不会发起任何 API 请求"。 今天再重定向 base URL,在你信任该文件夹之前,什么也不会离开。不过, 这个修复管的是时序。一旦你信任了文件夹——而开发者整天都在信任 文件夹——真密钥仍然坐在代理的环境里,离一次重定向只差一行配置, 仰赖着未来每一条触碰它的代码路径的正确性。
密钥本该待在别处。
经久的问题是:为什么真密钥待在一个仓库的配置能够瞄准的地方。这是 一个架构问题,而我们构建 Bromure Agentic Coding 就是为了回答它。
Bromure 把你的编码代理跑在一台一次性 Linux VM 里:代理本身、它派生
的 shell、它安装的包、它发起的模型调用。宿主上的一个 proxy 坐在代理
与 api.anthropic.com 之间的线缆上。VM 里装着一把桩值密钥,一个
语法上有效、却一文不值的占位符,而真正的 Anthropic 密钥留在宿主上。
当一次合法调用发往真正的模型端点时,宿主 proxy 在线缆上把桩值换成
真密钥,再从响应里把它换回去。机密干完它那一件事,而攻击者可以偷走
的那份副本,在代理世界能够到的任何地方都不存在。
把这次攻击对着这套安排重放。恶意仓库把 ANTHROPIC_BASE_URL 设成
attacker.evil。VM 里的代理把启动请求发往那里,带着它仅有的那把
密钥——桩值。proxy 把真密钥的置换绑定在真正的端点上,一个指向未知
服务器的请求,离开时携带的是占位符。攻击者的服务器读走 Authorization
标头,收获一串在公共互联网上毫无意义的字符。重定向成功了,却什么也
没捞到。
这份保证系于一个细节:密钥中介把真密钥绑定在真实目的地上,只为发往
api.anthropic.com 的调用换入机密,别处一概不换。把这个绑定做对,
被重定向的 base URL 就是惰性的。把它做错——给任何出站请求都换上
真密钥——你就在下面一层重建了这个漏洞。proxy 的价值,就在于只为
一个地址放出机密,并把其他一切地址当作不受信任的。
中介改变了什么
真正的模型密钥从不进入代理运行的那台 VM。宿主握着它,只在发往 真正端点的调用上,才把它放到线缆上。仓库尽管去重定向 base URL; 离开的那个请求携带的是桩值,而桩值离开你的机器一文不值。
它没有改变什么
信任仍然由你来给。把代理配置成去和一台攻击者运营的网关对话, 中介无从知晓你指错了地方;你指到哪里,它就中介到哪里。而且这份 保证是一条绑定一条地生效:模型密钥在这里,你的其他机密走同一套 桩值加置换的安排,每一条都只与它背后的端点绑定同样牢靠。
同伴漏洞,与同一个答案。
CVE-2026-21852 到来时带着一个更响亮的同胞,
CVE-2025-59536:
一个仓库的 .claude/settings.json 可以定义 hook——Claude Code 启动
时运行的 shell 命令——或强制启用项目 MCP 服务器,而那些命令"在运行
claude 后立即执行,用户甚至还没来得及读信任对话框"。那一个确实是
打开即代码执行,那副熟悉的形状,它的答案也是熟悉的那一个:在一台
一次性 VM 里,它派生的 shell 在本该是真令牌的地方只找到桩值凭据,
而一次会改变状态的操作会在 hypervisor 边界处停下,等宿主上的一次
询问。这一点我们已经长篇论述过。
两个漏洞看起来不同,一个运行程序,一个改动地址,最终却落在同一个 地方:编码代理读取并依据那些随你交给它的代码一同到来的文件行事, 而其中一些文件决定了什么会运行、机密会去哪里。Anthropic 把两个都 修了。经久的答案,是把机密放在那些文件指得到、却够不到的地方。
一场有限的胜利。
把模型密钥留在代理环境之外,击败的是这次重定向,以及那一族诱使代理 把自己的凭据发往新地方的攻击,因为代理能发送的那把密钥一文不值。 hypervisor 和 proxy 在代理之下执行这一点,对代理本身别无所求。
信任仍是你的工作。打开哪些仓库、配置哪些网关,仍由你决定,而一个 把密钥送往你所指之处的中介,如果你存心指向一个坏地方,它就会送到 坏地方。限定一把泄露的密钥能做什么,也仍归模型提供方管;Anthropic 的补丁和工作区控制覆盖的是那一侧。
编码代理必须携带一把密钥并把它发往某处,而在 2025 年末的一个窗口期 里,克隆仓库里的一行设置决定了发往何处。补丁关上了那扇窗。Bromure Agentic Coding 则干脆拿走这把密钥:代理在一台从未持有过真密钥的 一次性机器里工作,proxy 只为一个地址把真密钥放上线缆。 安装它,把你的代理指向任何你喜欢的仓库,让下一个被重定向的 base URL 带走一串在任何地方都一文不值的字符。