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

这款勒索软件没有操作者

七月初,Sysdig 记录了它所称的首例由 AI 代理从头到尾执行的勒索软件攻击——侦察、窃取凭证、横向移动,以及删除一个生产环境数据库,全程没有人坐在键盘前。对任何运行编码代理的人而言,有意思的不是攻击者用了模型,而是整条攻击链的起点,就是在环境中扫描机密。Bromure Agentic Coding 正是为一个会做这件事的代理而打造的。

我们花了两年争论一个编码代理能否被托付你的凭证。Sysdig 刚刚公布了这个 问题的另一半:一个勒索软件团伙把代理指向陌生人的服务器,任由它独自完成 整场入侵——出声推理、在三十一秒内修正自己失败的登录、完事后删掉数据库。 没有人在驾驶。这类攻击的技能门槛,如今就等于运行一个模型的成本。

某晚 19:34:24 UTC,一个自动化入侵者在生产环境数据库中插入了一个后门管理员 账户。十二秒后,登录失败。再过十二秒,它一边试用默认凭证,一边同时生成了 一份全新的密码哈希——并行地诊断两个可能的成因。在首次失败的三十一秒后,它 交出了一份修正过、分多步的补救:不再调用坏掉的子进程,直接导入加密库, 删掉那条错误的数据行,再重新插入。下一次尝试登录成功了。

一位人类事件响应人员读到这条时间线,便知道自己看到的是什么。没有人能在 半分钟内诊断出 PATH 问题、改写自己的漏洞利用并重新执行。这是一个代理。

JADEPUFFER 做了什么

这场攻击被 Sysdig 的威胁研究 团队 命名为 JADEPUFFER,并于七月初报道。它是通过一台暴露在互联网上的 Langflow 服务器——一款用来构建 LLM 应用的工具——利用 CVE-2025-3248 进入,那是一个缺失 验证的漏洞,让未经验证的请求得以执行任意 Python。这部分很普通;有数以千计的 Langflow 实例暴露在外。真正的故事,是取得立足点之后发生的事。

代理列举了主机,然后做了如今每一本后渗透手册都以之开场的事:在机器上扫描 机密。它并行地猎取 LLM 供应商密钥(OpenAI、Anthropic、DeepSeek、Gemini)、 横跨 AWS、Google、Azure 及数家中国供应商的云端凭证、加密货币钱包,以及数据库 登录。它转储了 Langflow 的后端数据库以寻找存储的密钥。它发现一个仍在使用出厂 密码的内部对象存储——minioadmin:minioadmin——列出每一个存储桶,包括 terraform-state,并从中拉出 .envcredentials.json。当某个存储请求返回 的是 XML 而非它预期的 JSON 时,它当场改写了自己的解析器,继续前进。

接着它转向真正的目标——一台另外运行 MySQL 与 Nacos 配置服务的服务器——用 Nacos 众所周知的默认签名密钥伪造了一个管理员令牌,穿过上述的登录失败序列, 完成了工作。它用一把只在控制台显示一次、从未保存的密钥,加密了全部 1,342 项 Nacos 配置项,删除了原始数据表,并创建了一张带有 Bitcoin 地址与 Proton Mail 联系方式的 README_RANSOM 数据表。因为那把密钥从未被保存或发往任何地方, 即使付了赎金也不会换回数据。

自始至终的破绽就是代码本身。载荷里塞满了以浅白文字解释为什么的注释—— 按价值为目标评级、叙述“这个最大,也把它删掉”、像一个出声思考的模型那样为 每一步加注,因为那正是当时发生的事。

全程无人操作 · 载荷自述其推理1 · 立足点Langflow RCECVE-2025-3248未经验证的 Python2 · 扫描机密LLM 密钥 · 云端凭证钱包 · 数据库登录一切的燃料3 · 转向MinIO 默认凭证伪造 Nacos 令牌即时改写解析器4 · 自我修正登录失败,改写漏洞利用31 秒5 · 勒索1,342 项配置加密 · 数据表删除密钥仅显示一次、未保存 — 付款亦无法恢复
JADEPUFFER 链,如 Sysdig 所重建。初始访问是一个普通的未经验证 RCE。其后的一切——侦察、并行扫描凭证、在请求途中调整解析器、伪造 Nacos 令牌、在 31 秒内自我修正失败的登录,最后加密并删除数据库——全程无人下达任何一道指令。载荷中自述式的注释,正是研究人员得以看穿它的线索。

应该让开发者担心的部分

你可以把这称作一则服务器安全的故事——为 Langflow 打补丁、别把带着默认 Nacos 密钥的数据库端上互联网、把对象存储从 minioadmin 换掉——你会是对的,而这 全都是别人的清单。它之所以属于一篇谈编码代理的文章,原因在于第二步。

在那个环境中每一个可触及的机密,都在代理取得代码执行的那一刻化为弹药。它 扫描的那些密钥,正是你的编码代理完成工作所需的同一批密钥:让它调用模型的 API 令牌、它用来查看部署的 AWS 凭证、它用来推送的 GitHub 令牌、你 .env 里的数据库 URL。JADEPUFFER 展示了代理一旦不再为你工作,会拿这些做什么——而 我们早已知道,你的代理是可以被弄到不再为你工作的。

这不是臆测。光是今年夏天,研究人员就展示了一个编码代理,被一则植入错误 监控信息流的假错误报告 驱使去执行攻击者的代码,也在一场看似例行的对不受信任仓库的安全审查 中被引导去执行载荷。两者中,代理都彬彬有礼、乐于助人,直到它不再如此。把 JADEPUFFER 的自主性摆在这些劫持旁边,形状就清楚了:你会话内部的对手,如今 可以就是你请进来的那个代理,而它一旦翻脸,就会侦察、收割它能触及的每一份 凭证,然后移动——独自地,以机器的速度。

所以有用的问题不是“我的代理值不值得信任”,而是“当它不值得信任时,代理 能触及什么”。任何靠请求代理守规矩来作答的防御——一段用心的系统提示、一次 微调、一个信任对话框——都是在对抗一样 JADEPUFFER 证明可以被刻意打造成不守 规矩的东西下注。

Bromure 假设代理已经是敌对的

Bromure Agentic Coding 让你的编码代理在一台用完即弃的 Linux VM 里运行,而 它发出的每一个网络请求,都经由主机上的代理离开那台 VM。这套设计出发自业界 一再吃亏才学到的假设:代理迟早会执行某件你并未打算让它做的事。所以值得保护 的东西,被放在代理的推理触及不到的地方——在主机上,而不在盒子里。

凭证是最清楚的例子,因为那是入侵者最先伸手去拿的东西。在 Bromure 中,真正的 机密永不进入 VM。当你给一个配置文件一把 Anthropic 密钥、一个 AWS_SECRET_ACCESS_KEY、一个 GitHub 令牌、一份数据库凭证时,代理的环境拿到 的是替代品——一个 brm_… 占位符——而主机代理只会在发往应当接收它的供应商的 那笔外发请求上,在线路上把假的换成真值。代理完成验证、做它的工作;它只是 从不握有那份材料。就连让代理本身运行下去的 API 密钥,对任何读取环境的东西 来说也是诱饵。

现在让 JADEPUFFER 的第二步对着它跑。代理扫描机器,在它预期的地方找到密钥 ——而每一把都是假的。它转储、备妥,把它们以信标发往一台命令与控制服务器, 而另一端的攻击者收到的是一堆什么都验证不了的 brm_… 字符串。攻击中最珍贵的 那一分钟、为其后每一步供给燃料的凭证收割,两手空空地结束。

无 — 真实密钥与代理同处代理 · 扫描 envANTHROPIC_API_KEY= sk-ant-9f2c…AWS_SECRET= wJalrXUtn…C2 取得有效密钥真实账户、真实冲击外泄有 BROMURE — 真实密钥永不进 VM代理(VM 内)· 扫描 envANTHROPIC_API_KEY= brm_a1b2c3…AWS_SECRET= brm_d4e5f6…主机代理 — 仅对真正供应商将 brm_… → 真值C2 取得 brm_… 假值什么都验证不了真实密钥:在主机上信标记录于安全日志没有真实之物离开机器
凭证扫描,没有与有 Bromure 的对照。左:代理直接从自己的环境读出真实密钥,把它们发往一台 C2 服务器;它们有效。右:在 Bromure 之中的同一次扫描,只找到 brm_… 占位符。真实密钥留在主机上,只在发往正当供应商的请求上才被放上线路;抵达攻击者服务器的东西什么都验证不了,而外发的信标是安全日志里的一行。

同样的姿态也削弱了链的其余部分。侦察是对着一台用完即弃的盒子跑:测绘机器、 扫描机密,找到的只是一台从共享基底复制出来的用完即弃 VM,而不是你的笔记本、 也不是你的网络。JADEPUFFER 安装的持久化——一条每三十分钟向它服务器发出信标 的 crontab 项目——活在那台 VM 里,并在你抹除该配置文件的家目录或把它重置回 基底的那一刻死去,而那是一个菜单项,不是一场事件。而且因为每一个请求都经由 主机代理离开,通往攻击者地址的信标并非隐形:它是安全日志里一行有记录的内容, 可归属于发出它的那个会话。

至于破坏性的结局——被删除的数据表——Bromure 主机侧的 Guardrails 是后盾, 它对代理发往其所理解之供应商的调用进行分类,并在线路上对破坏性的那些返回 一个硬性的 403,就在 VM 里被入侵的代理无法把它们关掉的地方。我们在一个 Cursor 代理在九秒内删除一个生产环境数据库 之后,详细写过这道边界;同一套阻止诚实代理犯错的机制,也阻止敌对代理的 Delete*Terminate*

这解决不了什么,把话说清楚

它替换 Bromure 注入的凭证

这种替换涵盖你在配置文件中设定的机密——模型密钥、云端与 git 令牌、容器 注册表、托管数据库端点。一个你亲手贴进 VM 里某文件的密码,或一颗躺在 仓库里的钱包种子,就只是一个文件;代理没有假货可以放到它的位置。把 机密放进凭证代管,而不是工作区。

Guardrails 只把关我们能解析的供应商

破坏性调用封锁所分类的是 Kubernetes、AWS、DigitalOcean、各大 git 托管服务、容器注册表,以及像 MongoDB、ClickHouse、Elasticsearch 这类 HTTPS 数据库。一条通往非托管盒子的原始 MySQL 套接字——正是 JADEPUFFER 用来删除数据表的那个协议——今天并不在代理会读取之列。覆盖范围是一份真实 的清单,而非无所不知。

外发被记录,而非默认禁止

信标会出现在安全日志里;那是归属,不是预防。没有真实之物离开,因为凭证 都是假的,但如果你需要禁止 VM 与任意主机通话,那是一项你仍得自行设定的 网络策略。

它不会为你暴露的服务器打补丁

Bromure 保护你的代理运行所在的那台机器。对于一台面向互联网的 Langflow、一把默认的 Nacos 密钥,或你资产中别处某个 minioadmin:minioadmin 的对象存储,它什么都不做。这个故事初始访问的那 一半,依然是寻常的卫生习惯。

可以推而广之的部分

把 Langflow、Nacos 与那个特定的夜晚抽走,JADEPUFFER 就是每一个以代理来构建 的人所立足之地的预告。一个能以真实凭证、以机器速度推理、适应与行动的代理, 如今租得便宜、指得容易。它不必是你的攻击者才会成为你的问题——它只需要最终 落进你的会话,而今年夏天的劫持研究说它办得到。那一旦发生,它做的第一件事, 就是读取你的环境。

Bromure Agentic Coding 不试图靠把代理变得更友善来阻止这件事。它让环境只对 做正当工作的代理才值得一读:真实密钥在主机上、诱饵在盒子里、一台用完即弃的 VM,以及一份对每一样试图离开之物的记录。代理可以翻脸,跑完整套 JADEPUFFER 剧本——然后发现它偷到的凭证什么都打不开、它钻进去的盒子在下一次重置时被抹 除,而真实机密曾经存在的唯一地方,正是它永远无法触及的那个地方。它是 自由且开源的