那条命令叫aipoison
Socket 发现了一批共 18 个 npm 软件包,冒充 Alibaba 的私有 @ali scope。所有 tarball 里都没有恶意软件。这只 RAT 在安装时从攻击者至今仍控制的 GitHub 仓库里的一个 JSON 文件把自己组装起来,它的持久化计划包括篡改 AI 编码工具 .skills 目录里的 Python,所用命令名为 aipoison、aipoison_inject 和 aipoison_deploy。读代码不可能发现这些。Bromure Agentic Coding 判断的是一直可见的东西:没有信誉的软件包会在主机代理停下来等你同意,组装载荷的三次抓取撞上一条只跟你批准的目的地通话的线路,而 RAT 写入的每个文件都落在一台只活一个任务的 VM 里。
最终载荷的某处有一条名为 aipoison 的命令。它的工作是伸手进你的
AI 编码工具的 skills 目录,篡改一个 Python 文件,让你下次开工时,
攻击者也一起开工。
2026 年 8 月 3 日,The Hacker News
报道了 Socket 七月底发布的研究:
一批约十八个 npm 软件包,四月底就位,在注册表上待了三个月才被人
发现。它们冒充 Alibaba 私有的 @ali scope 软件包,以不带 scope 的
方式发布相同名称(aone-cloud-cli、def-open-client、
open-worker-cli、uniapi-bridge),于是目标组织里的开发者或构建
流程解析到公开的冒牌货,依赖树上就被嫁接了一只远程访问木马。
Socket 研究员 Karlo Zanki 把动机解读为工业间谍活动。
软件包里没有任何东西是恶意的
打开其中任何一个 tarball,你都找不到可上报的东西。没有
postinstall 钩子——那是所有人第一个 grep 的目标。诱饵软件包依赖
smart-config-manager,后者依赖 cloud-config-fetcher 和
local-config-parser。一个配置管理器、一个抓取器、一个解析器:
无聊的工具库,每个一分钟就能读完。
恶意藏在组合里,藏在一个攻击者从未随包发布的文件里。导入时,抓取器
从攻击者控制、而且至今仍控制的 GitHub 仓库下载
defaults/preferences.json,写到磁盘成为 .cloud-preferences.json。
解析器在 Node 的 vm 里对该文件的“转换规则”求值,攻击就住在那里。
其中一条规则是已成民间传说的沙箱逃逸:
var F = items.constructor.constructor; // recover Function
var p = F('return process')(); // recover process
从 process 出发,它沿着一条后备阶梯往下走(getBuiltinModule、
mainModule.require、mainModule.constructor._load),直到其中一个
在它落地的 Node 版本上交出 require。接着它从 Alibaba Cloud 的
存储 bucket 抓取 setting.js,对主机做指纹识别并安装载荷:在
Windows 上,杀掉 Alibaba 自家的安全应用 Alilang,把它的
app.asar 换成木马化的副本;在 Linux 上,往 /tmp 丢一个二进制
文件,脱离终端运行,再删掉文件;在 macOS 上,注入 ~/.zshrc 并
注册一个每十分钟触发的 LaunchAgent。
GBHackers 把这个设计写进了标题:攻击者把 RAT 拆散到多个软件包里, 以躲过孤立的代码审查。 攻击者打造这场行动,就是为了在被人阅读后活下来。单独审查任何一个 软件包,它过关。审查整棵树,它照样过关,因为敌意的部分是服务器上的 一个 JSON 文件,在你审完之后才被抓取,而且攻击者可以在你的审计和 你的安装之间随时改写。
持久化计划里有你的智能体
Socket 取回的最终载荷名为 aone-cli。它做这类东西都做的事:
shell 命令、文件上传下载、主机侦察、屏幕截图、一条加密的反向
TCP 代理,还有一条借 DingTalk 横向移动的 dws_lateral 命令。它的
C2 流量戴着伪造的 Origin 和 Referer 头,声称来自 Alibaba 内部
文档域名。
有一组命令让这变成编码智能体的故事。在常见动词之外,这只 RAT 还
带着 aipoison、aipoison_inject 和 aipoison_deploy。它们篡改
特定开发工具 .skills 目录里的 Python 脚本,在注入片段上标记
# __INJECT_MARKER__,让一段从 C2 拉下来的脚本稍后从工具内部、
以你的身份运行。被点名的目标之一是
Qoder,
Alibaba 自家的智能体 IDE,去年八月发布后几个月内就突破了五百万
用户。
有人坐下来,端详现代开发者的机器,选中了智能体的 skills 文件夹作为
持久的立足点:一个在每次会话开始时以你的权限运行、却几乎没有人
diff 过的脚本目录。这一招我们见过,当时一只蠕虫把自己复制进
.claude,让下一次智能体启动时
重新感染机器。它已经从蠕虫的即兴小技,升级成间谍工具箱里的具名
命令。
攻击者藏不住的部分
读代码永远找不到这些。但这场攻击仍有前提条件,而且全都看得见: 一个没有历史、没有信誉的软件包;行动之前的三条对外连接(GitHub 上 的规则文件、云存储的阶段、C2);还有一台明天仍会在的机器。
Bromure Agentic Coding 在每一项上放了一个决定,而且是在你的 Mac 上、在智能体运行的盒子之外做出的, 里面的任何东西都无从争辩。
安装在注册表前暂停。 每次软件包抓取都会穿过主机侧代理,在任何
一个字节进入 VM 之前,代理就把你工作区的供应链策略应用到响应上。
开启软件包过滤后,代理会对每个制品查询信誉提供方。两个可选的提供方
之一就是 Socket——本文所谈研究的作者。当所有启用的来源都无法为
某个软件包背书时,代理会扣住下载并询问你。冒充私有 scope、上个季度
才发布、下载量寥寥、到处都没有信誉的冒牌货,就停在那里。强制执行
有意放在主机上:VM 里的 .npmrc 只能收紧策略、不能放松,所以哪怕
被攻陷的东西正是负责把关的东西,
规则依然成立。
线路拒绝组装。 这个设计在出口同意面前碎裂,因为 tarball 里没有
任何敌意的东西,网络本身就是攻击。主机代理把三次抓取(攻击者的
GitHub raw 文件、提供 setting.js 的存储 bucket、C2 主机)逐一
比对你为这个配置文件批准的目的地。你安装所用的注册表在清单上。
陌生人的 raw 内容路径,和一个以你从没听过的 CLI 命名的 bucket,
不在。代理对 items.constructor.constructor 没有意见,也不需要
有。它读取目的地,找不到任何批准项,然后掐断连接。你的安装完成,
你的构建照跑,而 RAT 永远组装不起来,因为它的零件永远到不了同一个
房间。
持久化拿到的是一台寿命只有一个任务的机器。 假设整条链还是跑完
了,因为你批准的目的地比你想的更宽,各阶段都落了地。~/.zshrc
里的那一行、十分钟一次的 LaunchAgent、木马化的 app.asar、被篡改
的 .skills Python:这一切都写进一台一次性的 Linux VM,与 macOS
隔着一层 hypervisor,装着这个任务的工作区,工作合并后你就把 VM
扔掉。aipoison 赌的是它篡改的工具和它攻陷的主机是同一台长寿
机器。在配置文件里,这个赌注输了。最先跑的侦察带回来的是代理层的
诱饵:你真正的凭证住在主机
上,只在批准的目的地才于线路上注入,所以它们从来不在 VM 里
,无从收集。
审查一个制品,只能告诉你这个制品的事
研究人员每周都在不同的库里重新教这一课。昨天,一个信任标志失守, 因为检查和加载发生在不同的时刻。六月, 一个仓库保持干净,因为反向 shell 住在一条 DNS 记录里 。如今十八个软件包读起来 都干净,因为恶意的部分是一个攻击者仍握在手里的 JSON 文件。
智能体让这一切更尖锐,因为它们快。被要求接入内部 API 的智能体会 添加依赖、执行安装、进入任务的下一步,快到你切换窗口的工夫都不够。 这个速度正是你买它的全部理由。把判断放在速度追不上的地方:在注册表 抓取处和线路上,让你的 Mac 依照你设定过一次的策略,为智能体的每个 软件包、每条连接做决定。
继续让智能体安装东西,因为杠杆就在那里。安装 Bromure Agentic Coding,开启供应链各层防护,并给配置文件一份对 这份工作合理的目的地清单。下一场攻击行动会把载荷藏到别的地方—— 这是这一行唯一稳妥的预测——但它仍然得跨过一条先问你的线路才能 拿到手。