Rust生态刚刚经历了一场规模罕见的供应链攻击。两个被广泛使用的开源包——arrayrefappend-only-vec——在开发者编译项目的瞬间,悄悄植入了恶意软件。

这两个包合计下载量高达2.44亿次,按下载量计算,这是Rust crate生态有史以来最严重的妥协事件之一。

打开网易新闻 查看精彩图片

一个拼写相似的陷阱包

安全研究机构Aikido Security最先发现了一个可疑的新包,名叫proc-macro1。这个包在构建过程中会静默下载并执行远程文件。

名字本身就是一个精心设计的陷阱——它故意拼写为proc-macro2的仿冒版本。proc-macro2是Rust生态中依赖度最高的crate之一,而这个仿冒包直接复制了正版包的描述和文档,让开发者很难一眼识破。

更关键的是,在同一个小时内,arrayref和append-only-vec这两个由同一位开发者维护的包,突然把proc-macro1添加为依赖项。一个孤立的仿冒包事件,瞬间升级为完整的供应链攻击。

源码没动,恶意藏在构建脚本里

攻击最隐蔽的地方在于:两个被劫持包的可见源码完全没有被修改,看起来完全正常。如果开发者做人工代码审查,根本不会发现异常。

真正的危险藏在proc-macro1的build.rs脚本里。这是Cargo在每次构建时自动编译并运行的文件——意味着开发者甚至不需要调用被劫持包的任何函数,只要项目依赖了它们,就会中招。

这种手法利用的是构建配置的信任机制,和开源生态中开发者工具被攻破的风险如出一辙。

恶意载荷:偷浏览器密码的窃密木马

一旦触发,这个构建脚本会从远程服务器下载一个针对Linux、Windows或macOS平台的二进制文件。远程服务器只用一个裸IP地址标识,目标地址还用base64编码片段做了混淆,专门用来绕过基于字符串的安全扫描。

在Unix和macOS系统上,恶意软件会把载荷写入磁盘、标记为可执行,然后作为后台进程启动——即使构建结束,它也会继续运行。

对回收的二进制文件分析显示,这是一个信息窃取木马,能够从Chromium内核的浏览器(包括Chrome、Brave和Edge)中窃取已保存的凭据,还能读取浏览器扩展存储中的数据——这个位置经常被加密货币钱包扩展使用。

此外,恶意软件还在macOS上通过LaunchAgent建立了持久化机制,每次登录都会自动重启,并保持与命令控制服务器的连接,可以执行远程shell命令。

Rust安全响应团队在收到研究人员的报告后,已确认了恶意构建脚本的存在。

这次攻击再次提醒开发者:开源依赖的安全审查,不能只看源码本身。构建脚本、依赖关系变更、包名仿冒,都是攻击者可以利用的入口。