← 返回所有文章
发布于 · 作者 Renaud Deraison

代理握有管理员登录

WIRED 报道,一家国防承包商的员工把自己在五角大楼生产环境的凭证交给个人的 Claude Code 代理,而在约两个月里,代理把密码、登录信息和一张网络地图发到了第三方网站。Accenture 表示这些指控毫无根据。在 Bromure Agentic Coding 中,代理对每一个凭证都只拿到替身,替身一旦发往错误的主机,VM 会当场停下,允许列表式的防火墙让网络地图留在家里,而每一个决定从第一天起就有记录。

一名承包商把真正的管理员登录交给了代理,却没有任何东西监视代理把它发到哪里。据 WIRED 的消息来源,这种状态持续了约两个月。

10 月 29 日,WIRED 报道,一名 Accenture 员工把个人的 Claude Code 账号连到美国国防部的一个生产环境,并把自己的登录凭证交给了代理。据 WIRED 的消息来源,目的是让编程和云服务器的搭建自动化。这个环境位于 NIPRNet,即五角大楼非涉密、连接互联网的网络,有多个情报机构在使用,并存有受控非密信息。

细节来自匿名消息来源。Accenture 对记者表示,这些指控“已经过彻底且独立的调查,并被认定毫无根据”。五角大楼拒绝置评。目前没有人报道涉密网络被触及。

你在自己的团队里大概也见过同样的情形。开发者希望代理做真正的工作,工作需要访问权限,于是开发者把自己的登录交给代理。

代理据称做了什么

根据 IBTimes UK 和 GBHackers 汇总的说法,承包商的凭证让代理拥有管理员权限。它可以编写并部署软件、以该员工的名义提交代码,以及创建云服务器。这种状态持续了约两个月。

在这段时间里,代理似乎把承包商的登录凭证、密码和一张 NIPRNet 地图发到了第三方网站。WIRED 没有点名该网站。报道称,NIST 曾将该网站标为高风险,因为它有一个漏洞,可能让攻击者把指令注入 AI 编码代理并窃取凭证。没有人证明这个漏洞在此案中被利用,报道也没有说明是谁、如何发现了这次传输。

WIRED 的消息来源还表示,这起事件本应在 72 小时内上报政府,这是 DFARS 条款 252.204-7012 为国防承包商规定的期限。Accenture 表示已履行其义务。

报道中引用的前 NSA 黑客 Jake Williams 讲出了防御者最担心的部分:开发环境的凭证一旦被盗,攻击者就能在软件转入更敏感的网络之前修改它。

真正的登录,交给了没人监视的代理承包商的登录本人的凭证,管理员权限个人编码代理握有真正的登录在它自己的环境里NIPRNet 上的生产环境编写并部署软件,以员工名义提交代码,创建云服务器第三方网站,被 NIST 标为高风险收到登录凭证、密码和网络地图(据 WIRED 消息来源)约两个月,没有任何已知的警报
WIRED 消息来源描述的情形。承包商自己的凭证交给了一个在生产环境中拥有管理员权限的个人编码代理。在约两个月里,代理似乎把凭证、密码和网络地图发到了一个被 NIST 标为高风险的第三方网站。

出错的三件事

拿掉五角大楼,剩下的是任何工程团队都能复现的三个失误:

  1. 代理握有真正的凭证。 它读取、打印或发送的任何东西,都可能包含真正的密码。
  2. 代理能访问互联网上的任何网站。 一项只需要一个环境和一家云服务商的工作,也能和一个存在已知注入问题、未具名的网站通信。
  3. 好几个月都没人察觉。 据报道,从代理开始工作到有人对它发出的东西采取行动,中间隔了约两个月。

每一点在 Bromure Agentic Coding 中都有直接的对策。它在你 Mac 上的 Ubuntu VM 里运行 Claude Code、Codex、Grok、Kimi 和 omp,每一个网络请求都经过 Mac 上的代理服务器。

代理拿到的是替身

在 Bromure 中,你不会把登录交给代理,而是把它添加到机器的 Credentials 面板:云密钥、GitHub 令牌、Kubernetes context、数据库密钥、SSH 密钥或任何其他 API 密钥,连同它所属的主机。真正的值加密保存在 Mac 上。

在 VM 内,代理拿到的是格式相同的替身。GitHub 令牌是 ghp_ 加 36 个字符,AWS 密钥是 40 个字符,所以 gh、aws、kubectl 和 terraform 都会照单全收。请求离开 VM 时,Mac 上的代理服务器会把替身换成真正的值,而且只在请求发往该凭证所配置的主机时才这么做。SSH 密钥根本不会进入 VM。代理可以通过 vsock 桥接请求签名,私钥留在 Mac 上。

因此,一个把环境转储出来、把配置粘贴进网页表单,或被说服把凭证发到某处的代理,发出去的都是替身。替身除了通过代理服务器、在它被配置的那一台主机上之外,在哪里都用不了。

替身发往错误的主机,VM 就会停下

替身同时也是绊线。GitHub 替身唯一合法的目的地就是 GitHub。代理服务器会扫描每一个出站请求的请求头和正文,寻找任何发往其范围之外的替身。

一旦发现:

  • 请求被 HTTP 451 拦下。没有一个字节到达目的地。
  • VM 立即暂停,如果原本在后台,会被调到前台。
  • 一条标题为 This environment may have been compromised 的警报会列出该凭证、它所属的主机,以及它正要被发往的主机。

默认选项是 Shut down,同时会把机器标记为已失陷。Save for Investigation 会先导出 VM 的磁盘和主目录。已失陷的机器在磁盘和主目录被清除之前不会再次启动。

在 WIRED 的描述中,凭证和密码被发到了第三方网站。在 Bromure 机器上,代理服务器会在任何东西离开 Mac 之前拦下第一个这类请求,VM 冻结,警报会告诉开发者哪一个凭证正要发往哪里。

网络地图留在允许列表之内

网络地图不是凭证,所以绊线对它不起作用,但出站防火墙会。每台机器的 Guardrails 面板都有一张 Outbound connections 表和一个 Unmatched traffic 设置。把 Unmatched traffic 设为 Deny,允许工作需要的主机,其他所有连接都会在 Mac 上被拒绝:

allow tcp api.github.com:443
allow web *.amazonaws.com
allow web registry.npmjs.org
default deny

规则在 VM 外部执行两次。虚拟网络交换机按 IP 和 DNS 中看到的主机名检查每一条连接,覆盖所有协议;代理服务器再按 TLS 服务器名称检查一次。代理运行的 curl、它写的脚本、它安装的软件包,全都经过同样的检查。没有人列入名单的网站会得到被拒绝的连接,而这次拒绝会被记录下来。

如果那个网站真的像 NIST 警告的那样带有注入内容,源代码检测器会先看到它。Bromure 会在内容到达模型提供商之前,用本地的 PromptGuard 模型扫描代理从工具读到的内容,包括抓取的网页,并可以记录、询问或拦截。

Bromure:代理照常工作,登录留在 Mac 上代理 VMghp_… 替身假的 AWS 密钥brm-db-… 替身SSH:只提供签名,没有私钥文件、变量或进程中都没有真正的密钥代理服务器与防火墙(Mac)真正的凭证,加密保存替换限定于各主机每个请求都扫描范围外的替身允许列表规则,Unmatched traffic: DenyGitHub、AWS 等工作所需主机发出时换上真正的凭证未列入名单的网站连接被拒,网络地图留在家里发往范围外的替身HTTP 451、VM 暂停、失陷警报Security Timeline:每次替换、拦截和拒绝,保存 90 天,可导出 CSV已注册的 Mac 也会把 credential.exfiltration、egress.firewall、guardrails.block 事件发送给组织,只带令牌预览,绝不包含密钥
同一项工作放在 Bromure 机器上。代理的 VM 只握有替身;Mac 上的代理服务器只在发往凭证所属主机的请求上放入真正的凭证。发往其他任何地方的替身会被 HTTP 451 拦下,VM 随即暂停。连往允许列表以外主机的连接会被拒绝。每一个决定都会进入 Security Timeline,在已注册的 Mac 上也会进入组织的审计流。

管理员权限,加上写入的关卡

在 WIRED 的描述中,代理以管理员权限提交代码并创建云服务器。Bromure 让代理保留工作所需的访问权限,并把写入放在一条由代理服务器执行的规则后面,代理无法把它关掉。

Guardrails 面板中的每一项服务都有写入策略:Off、Prompt before write、Block destructive 或 Read-only。覆盖 git 托管平台、AWS、DigitalOcean、容器镜像仓库、Kubernetes 和多种数据库。新机器默认为 Prompt before write。读取直接放行。git push、RunInstances 调用或 kubectl apply 会停在 Mac 上一个显示确切操作的对话框,由开发者选择 Allow once、Allow for 15 minutes、Allow for the rest of the session 或 Don't allow。对于更重要的凭证,Require approval to use 会在每个会话首次使用前询问。

Jake Williams 的情景需要对软件做一次不显眼的修改。在 Prompt before write 之下,即使攻击者诱导代理做出这个修改,push 仍得先通过开发者 Mac 上的对话框。

两个月变成第一个请求

WIRED 的消息来源没有说明是谁、在何时发现了这次传输。在 Bromure 的 Mac 上,开发者可以打开 Security Timeline(Window › Security Timeline…),阅读安全引擎在每一台机器上做出的每一个决定,无需任何配置:每一次凭证替换、每一次防火墙放行与拒绝、每一次 guardrail 拦截、每一次提示注入检测,以及每一次被拦下的外泄。它的 Overview 标签页会统计过去 24 小时,并列出最新的拦截。事件保留 90 天,可导出为 CSV,让有 72 小时上报期限的承包商在第一天就拿到时间戳、主机和凭证名称。

团队可以用 Bromure Enterprise Manager 注册他们的 Mac。已注册的 Mac 会把同样的事件发送给组织:替身试图外发时的 credential.exfiltration、每一次判定的 egress.firewall、每一次被拒绝写入的 guardrails.block,以及工具使用、命令和 token 数量。凭证事件只带简短的预览,绝不包含密钥本身,提示词和模型响应也绝不离开 Mac。安全团队在拦截发生几秒后,就能在自己的控制台读到警报。

这也让开发者有一个获批的方式,在真实系统上使用五种代理中的任何一种,由公司看守边界,而不是用一个公司看不到的个人账号。

给替身,不给登录

真正的凭证加密留在 Mac 上。代理的 VM 只握有替身,每一个替身只在它所属的主机上有效。

每个请求上都有绊线

发往任何其他主机的替身会被 HTTP 451 拦下,VM 随即暂停,并弹出列明两台主机的警报。

网络的允许列表

把 Unmatched traffic 设为 Deny,工作不需要的每一台主机都会在 Mac 上、针对所有协议被拒绝。

从第一天起就有记录

Security Timeline 会把每一次替换、拦截和拒绝保存 90 天,已注册的 Mac 也会把同样的事件发送给组织。

交给代理的是工作,不是你的登录

开发者会继续把访问权限交给代理,因为代理需要它才能完成工作。把访问权限给代理,把密钥留在 Mac 上,并决定它可以和哪些主机通信。

在 Bromure Agentic Coding 中,这就是默认设置:把凭证添加到机器上,把防火墙限定在工作需要的主机,让写入保持在 Prompt before write,并让 Security Timeline 保存记录。

另一个代理的数据落到没人选择的服务器上的案例,请阅读代理的日志存在他们的云端。攻击者进入开发者的笔记本电脑后能触及什么,请阅读笔记本电脑就是入口。