Rust 项目安全响应工作组在 2026 年 8 月 20 日从 crates.io 紧急删除三个广泛使用的 Rust crate(代码包)恶意版本:arrayref 0.3.10、internment 0.8.7、append-only-vec 0.1.9。维护者账户被入侵后,攻击者注入了一个对 proc-macro2 拼写错误仿冒(typosquat)的依赖项 proc-macro1,其构建脚本会在 cargo build、cargo check、CI 流水线与 rust-analyzer 静态分析期间自动下载并执行远程载荷,整个流程无需开发者主动调用任何 API,三个 crate 累计下载超过 2.45 亿次。
事件概述
三个被入侵的 crate 来自同一个 crates.io 账户(droundy,David Roundy),它们在表面上是合法且广泛使用的代码包:arrayref 用于数组切片引用、internment 用于字符串与数据内部化、append-only-vec 提供并发追加向量。arrayref 自身有 53 万 / 90 天下载量,blake3、Rust GUI 框架 egui/eframe/iced、Ethereum 与 Solana 区块链组件都依赖它。
2026 年 8 月 20 日 UTC 时间 01:17,攻击者注册了一个仿冒知名 Rust 开发者 David Tolnay 的 GitHub 账户,紧接着注册了一个类似的 crates.io 账户。01:55 发布 proc-macro1 1.0.106,初始版本是 proc-macro2 的真实副本以建立信任。07:11 发布恶意版本 1.0.107。07:15 通过合法的 droundy 账户发布 arrayref 0.3.10,并在同一分钟内下架 0.3.5 至 0.3.9 五个旧版本,迫使 cargo 把 0.3.10 视为唯一可选版本。07:54 研究员向 Rust Security Response WG 上报,08:03 删除 proc-macro1,08:41 删除 arrayref 0.3.10。整个恶意版本在线窗口在 86 至 107 分钟之间。
技术细节
本次攻击的核心创新在于:恶意代码被放在注入依赖的构建脚本(build.rs)中,只要 cargo 解析到这个依赖并触发编译,第二阶段载荷就会自动执行,开发者不需要在代码里 import 任何被入侵的 crate。这是与以往 npm/PyPI 供应链攻击(依赖运行时 import 才触发)完全不同的攻击范式。
proc-macro1 1.0.107 的库源码是 proc-macro2 的真实复制品,作者字段伪装为 David Tolnay rchaitm@gmail.com,仓库地址指向 https://github.com/dtolnay/proc-macro1。唯一新增的攻击代码位于 build.rs,并新增了三个真实 proc-macro2 不需要的 build-dependencies:ureq、rustls、base64。
攻击链分阶段进行:
- 第一阶段:合法 crate 注入,被入侵的 arrayref/internment/append-only-vec 都在 manifest 中新增一行对 proc-macro1 的依赖;
- 第二阶段:proc-macro1 build.rs dropper,从 base64 片段动态拼接 C2 URL 与载荷 URL:
https://23.254.165.112:9089/与https://23.254.165.112:443; - TLS 验证绕过,安装自定义证书验证器,其三个验证方法无条件返回 success,禁用全部 TLS 校验;
- 操作系统分支,Linux x86-64、Windows x86-64、macOS x86-64、macOS ARM64 四种载荷按主机架构选择,Unix/macOS 写入 /tmp/rust-setup 后台执行,Windows 写入 %TEMP%\rust-setup.ps1 通过 wscript.exe 与 VBS 启动器脱离 cargo 任务对象;
- 持久化,Windows 通过注册表 Run 键、macOS 通过 LaunchAgent、Linux 通过 systemd 服务;
- 凭据窃取,针对 Google Chrome、Brave、Edge 浏览器 SQLite 登录数据库窃取口令;
- 横向准备,采集主机信息与本地凭据列表,准备给第二阶段 C2 返回。
影响评估
三个 crate 的累计下载量达到 2.45 亿次,依赖它们的知名项目覆盖加密学库(blake3)、Rust GUI 主流框架(egui/eframe/iced)、Ethereum 与 Solana 区块链节点。JFrog Security Research、StepSecurity、Wiz、SafeDep、Aikido 五家厂商独立完成了技术分析,并共享了 IoC。
Wiz 团队指出,本轮攻击的基础设施与近期朝鲜国家级供应链攻击(Mastra、axios)存在重叠,意味着这是一支技术成熟的 APT 力量而非散兵游勇。攻击者选择 Rust 生态而非 npm/PyPI,反映出两个判断:一是 Rust 开发者群体处理加密货币与高性能计算是高价值目标,二是构建期执行(build.rs)作为一种新的攻击面比 runtime import 更难被传统 EDR/SCA 工具覆盖。
暴露窗口仅 86 至 107 分钟,但开发者实际安装行为有两个不利因素:其一,arrayref 0.3.5 至 0.3.9 被同时 yank 掉,cargo 默认会把 0.3.10 视为唯一可选版本;其二,cargo 自动解析机制会让直接依赖 arrayref 的项目甚至不会察觉新增的 proc-macro1,因为它作为传递依赖被引入。RustSec 公告目前记录为 RUSTSEC-2026-0260 等三条,尚无 CVE 编号。
修复建议
Rust 项目安全响应工作组与 JFrog、StepSecurity 给出的紧急处置清单如下:
- 检查 Cargo.lock,是否包含
arrayref@0.3.10、internment@0.8.7、append-only-vec@0.1.9或任何proc-macro1条目; - 扫描残留文件,
/tmp/rust-setup、%TEMP%\rust-setup.ps1、LaunchAgent plist、systemd unit 文件、注册表 Run 键; - 审查网络流量,8 月 20 日 07:15 至 09:25 UTC 之间的
23.254.165[.]112端口 9089 与 443 出向连接; - 轮换所有可访问凭据,CI token、签名密钥、SSH key、云厂商 access key、浏览器保存的密码;
- 隔离或重建环境,任何在窗口内运行过 cargo build 的构建机、CI runner、开发者工作站都应视为失陷,从干净备份重建;
- 固定安全版本,arrayref 暂时 pin 到 0.3.4 及更早,internment 暂时 pin 到 0.8.6 及更早,append-only-vec 暂时 pin 到 0.1.8 及更早;
- 启用 cargo 供应链防御,在 CI 中配置
cargo-deny、cargo-audit、cargo-vet,对 build.rs 触发网络下载的依赖设置高风险标记。
对于未受影响的健康项目,建议在 8 月 21 日后冻结 arrayref/internment/append-only-vec 的版本,等待 Rust Security Response WG 与维护者 David Roundy 进一步沟通账号入侵路径后再放开。在更宏观层面,企业应将 Rust 工具链与 npm/PyPI 等同视为关键供应链节点,对 build.rs 执行、依赖解析、yank 行为建立监控告警。