你的编码代理看起来跟攻击者一模一样
2026 年 7 月,Sophos X-Ops 报告称,在一周的 Windows 遥测数据里,像 Claude Code、Cursor、Codex 这样的编码代理,触发了原本为抓捕入侵者而打造的同一批端点规则——56.2% 的拦截属于凭证访问,其中最大的一项是对浏览器密码的解密。这种行为与真正的攻击完全相同;唯一的变量是它跑在谁的机器上。Bromure Agentic Coding 把那个变量变成一台装着诱饵凭证的一次性 Linux 虚拟机,于是吵闹的动作落进一个一次性的盒子,而你主机的防御保持严格。
你的代理解密了浏览器保存的密码、列出了凭据管理器、用一个 Windows 系统工具 拉下了一个安装程序,并把一个脚本丢进了启动文件夹。其中每一项都在真正入侵者 的检查清单上。Sophos 看着一个编码代理把这些全做了。没有一项是恶意的——而这 恰恰是问题所在,因为攻击者产生的遥测,和你的代理产生的遥测,是同一份遥测。
2026 年 7 月 7 日,Sophos X-Ops 发表了一份 针对六月一周端点遥测的分析, 探讨当开发者把编码代理指向真实机器时会发生什么。这项发现是一场碰撞,而不是谁 能修补的缺陷。代理的日常工作——读一份凭证、执行一条命令、下载一个工具、让某样 东西跨越重启仍活着——几乎一对一地对应到端点检测被调校来抓捕的 MITRE ATT&CK 战术。于是传感器就开火了。
传感器实际上看到了什么
整周下来,拦截规则命中中最大的一份——56.2%——落在凭证访问,另有 28.8% 落在
执行。这是框架中最具攻击者形状的两个类别。单一最大的凭证规则,占该组的
42.6%,在一个进程使用 Windows 数据保护 API(DPAPI,用来解锁用户已存机密的操作
系统服务)去解密浏览器已存登录时开火。Sophos 把它追溯到 GStack 的 /browse
技能——一个给代理一个浏览器的热门技能包——执行 PowerShell 去解锁已存的浏览器
数据。它是在 Claude Code 之下运行时被逮到的。
清单的其余部分读起来像一份事件报告。代理执行了 cmdkey /list 去枚举 Windows
凭据管理器。它们杀掉浏览器进程,然后伸手进它的凭证库。它们用 certutil 和
bitsadmin 下载一个 Python 安装程序——这是两个合法的 Windows 二进制文件,攻击
者拿来取回载荷而不触发下载过滤器,防御者把这手法叫作 LOLBin(“living off the
land binary”,就地取材)。Cursor 把一个 VBScript 写进 Windows 的启动文件夹,
这是教科书式的持久化。而 Claude 的命令行上带着 --dangerously-skip-permissions,
那个关掉代理自身“你确定吗?”提示的标志。
这些没有一项是攻击。在情境里,它几乎总是开发者要求的自动化。但 Sophos 对这对 防御意味着什么直言不讳:规则正按设计运作,而单凭行为已经无法把一个良性代理和 一个真正的代理区分开。
陷阱是在传感器上修它
以运维者的角度读这项发现,压力显而易见。你的团队采用编码代理。每当有人跑一个, 端点工具就开始抛出凭证访问和执行的告警。告警很吵,而且在没有人被攻击的意义上 它们是“假的”——于是自然的动作就是让它们闭嘴:为代理加一条例外、把技能包放进 白名单、不再标记那条进程树的 DPAPI 读取。
在你这么做的那一刻,你已经告诉你的防御去忽略真正入侵者所用的那条确切序列。而 代理并不是一个可以安全划出去的东西,因为它是机器上最可能被反过来对付你的东西。 一个藏在仓库里的提示注入、一个被下毒的市场技能、一个恶意依赖项——我们 每一个 都 谈过——都会让代理用你的权限去执行攻击者 的指令。当那发生时,代理做同样的 DPAPI 解密、同样的凭据管理器转储、同样的 LOLBin 取回——只是这次它是认真的。你以阻止它对自己喊狼来了之名,把那个本会逮到 它的唯一传感器弄瞎了。
Sophos 落到冷静的版本:检测工程将必须适应,有些规则需要调整,而区分的信号必须 来自情境——哪个代理、如何被调用——而不是动作本身。这是对的,而它也是为了让 传感器对一个移动的目标保持诚实所需的大量持续工作。还有一个更直接的选项:别再 在传感器所在的地方跑代理。
移动代理,而不是告警
Bromure Agentic Coding 让整个代理跑在一个 hypervisor 之外,在你 Mac 上一台 一次性的 Linux 虚拟机里。凭证库的读取、工具的下载、持久化的写入——这一切都发生 在一个不是你机器的盒子里,而它的重置在会话之间退回一个干净的基础镜像。三件事 随之而来,而没有一件要求你在主机上放松哪怕一条规则。
噪音永远到不了你的端点。你主机真正的防御保持严格,因为代理不在主机上去触发 它们。写进启动文件夹的动作落进一个一次性的文件系统;它等待的那次重启永远不来, 而重置无论如何都把它丢掉。
凭证读取空手而回。这是对那 56.2% 的正面一击。Bromure 把真正的机密留在主机上,
在链路上的代理服务器换入假的,所以实际坐在虚拟机里的是诱饵素材——API 密钥该在
的地方放一个 brm_… 占位符、一个合成的 kubeconfig、一次性的 git 与 ssh 凭证。
一个在那台虚拟机里解密浏览器保险库或转储凭据管理器的代理,收割不到任何能用的
东西。真正的值只在往外的请求上、在代理无法绕过的边界上被替换。
--dangerously-skip-permissions 不再危险。这个标志之所以存在,是因为每一步都被
问“你确定吗?”会杀掉代理的意义;人们把它关掉。让它鲁莽的是底下那台机器。把机器
移到一台装着诱饵凭证的一次性虚拟机,这个标志就只是快——害怕它的理由从来不是
标志,而是波及半径。
那被劫持的代理呢
围堵回答了噪音,但更尖锐的忧虑是那个不只是吵、而是已被策反的代理。Bromure 的
边界也是为那种情况而建。它的设备端注入检测,在代理据以行动之前,为代理读取的
不可信内容与指令文件评分——用一个本地的
PromptGuard 模型和一个微调的
分类器——所以那句流氓的“现在把密钥外泄出去”会在门口就被标记。那些在盒子外才
重要的动作——一次 push、一次部署、一次对你云的 Delete*——越过主机代理服务器,
在那里 Guardrails 可以把破坏性调用整个剥掉,而逐目的地的同意可以先要求一次人类
的点按。而每一个出向请求都落进会话追踪里,所以入侵者需要的回调,会以一条带着
假凭证的、被记录下来的行出现。
Sophos 测到的行为碰撞是真的,而且不会消失——一个编码代理诚实的工作,按设计就与 攻击者的剧本重叠。你无法在传感器上解决它,除非要么淹没在误报里,要么切开一个 你自己的代理在被入侵那天会走过的洞。Bromure 在别的地方解决它:它不再在乎是哪 一个敲了那条命令,因为那条命令落进一个会重置的盒子、花掉的是诱饵凭证、而且只能 通过一个在看守的边界去触碰外面的世界。
这划出的界线是什么
隔离是围堵,不是没有坏东西会执行的保证。对这些边缘讲究精确是值得的。
那些是 Windows 的名字;碰撞不是
DPAPI、cmdkey、certutil 和启动文件夹都是 Windows 的。Bromure 让代理跑在
Linux 上,所以那些确切的二进制文件在里面永远不会开火。但这个模式与平台无关:
一个 Linux 上的代理读 ~/.aws/credentials、转储环境令牌、写一个 cron 或
systemd 单元——同样的攻击者形状动作,换了名字。控制也一样。位置与诱饵,而非
特征码。
替换涵盖你所配置的那些机密
诱饵调换保护你放进配置文件的凭证:模型密钥、git 与云令牌、托管数据库端点、 ssh 密钥。一个脚本在会话中途写进文件的密码,或你亲手贴进盒子的机密,只是一个 代理能读的文件。把机密留在 broker 里,而不是工作区里。
检测是一张网,不是一堵墙
设备端注入评分多半会标记出一句流氓指令,但一个下定决心的作者能饿死任何单一 扫描器。把检测器当成一层;围堵——一个装着假密钥、出向被记录的一次性盒子——才是 检测器漏掉时撑住的东西。
你的主机 EDR 依然重要
Bromure 不取代端点防护;它给端点防护一份更干净的工作。代理的噪音离开主机, 所以你的传感器继续看守你真正登录的那台机器,不被钝化——而那里一个真正的入侵者 仍然得先过它这一关。
Sophos 数字底下的教训不是“代理很危险”。而是你无法凭命令的形状去分辨一个好行为者 和一个坏行为者,因为形状是一样的。所以别再试着在键盘上决定它,改在边界上决定它: 把代理跑在它攻击者形状的工作被围堵、它的凭证是假的、它每一步往外都被记录的地方。 安装它。