2.45亿次下载的Rust包arrayref被投毒

· 2026-08-21 18:57 · 3 阅读

微步情报局 2026-08-21 18:57 北京

2.45亿次下载的Rust包arrayref被投毒一、事件摘要2026 年 8 月 20 日,Rust Se

一、事件摘要

微步情报局检测到在北京时间8月20日15:11到17:25之间,知名rust基础包arrayref被供应链攻击,该包历史累计下载量为2.45亿次,是很多rust底层库的间接依赖包。攻击者疑似控制了arrayref包的维护者账号droundy的权限,利用该账号权限在rust的源码包社区crate.io投毒了arrayref,internment和append-only-vec。下游开发者项目只要引用了该投毒版本的基础包源码,就会在编译阶段导致开发者主机失陷。

image.png

被投毒的恶意版本在crates.io的总体公开暴露时间约为 2026 年 8 月 20 日 07:11—09:25 UTC(北京时间 15:11—17:25)。但已进入本地 Cargo 缓存、CI 缓存或 vendor 目录的恶意包仍可能在窗口结束后被构建并触发。主要风险包括构建主机受控、持久化、远程命令执行,以及构建环境可访问的代码仓库令牌、包发布凭据、云平台凭据、签名材料和 CI/CD Secrets 泄露

二、事件详情

2026 年 8 月 20 日,攻击者首先通过仿冒账号发布proc-macro1。该包名称和内容刻意模仿合法且广泛使用的 proc-macro2,但二者不存在正常继承或替代关系。经过分析发现,攻击者于 01:55 UTC 发布不含恶意构建脚本的 proc-macro1@1.0.106 作为前期伪装,随后于 07:11:15 UTC 发布携带恶意 build.rs 的 proc-macro1@1.0.107

约四分钟后,即07:15:00UTC,维护者droundy名下的arrayref@0.3.10被发布。该版本在原有功能代码之外新增了对proc-macro1 ^1.0.107 的依赖。随后,同一维护者账号又于07:34:07 UTC和07:37:49 UTC分别发布internment@0.8.7append-only-vec@0.1.9,并采用相同方式将恶意依赖引入下游构建链。(截至目前,恶意版本的包被移除。)

image.png

在发布 arrayref@0.3.10 后,攻击者还连续撤回了多个近期正常版本。Cargo 不会主动替换已由 Cargo.lock 固定的正常版本,但会对被撤回的依赖发出更新提示;如果开发人员或自动化流程执行 cargo update、重新生成锁文件,或者在没有锁文件的环境中进行全新构建,依赖解析可能转向当时仍可用的恶意版本。该行为利用了维护人员对依赖更新告警的正常响应,提高了恶意版本进入下游项目的概率。

本次攻击的核心执行入口位于 proc-macro1@1.0.107 的 build.rs。Cargo 在编译包含构建脚本的依赖时会自动编译并运行该脚本,因此下游应用无须导入或调用 proc-macro1 中的任何功能。恶意脚本会识别构建主机的操作系统和处理器架构,解码经过 Base64 拆分的下载地址,关闭 TLS 证书校验,并从 23.254.165.112:9089 下载平台对应的二阶段程序。

在 Linux 和 macOS 环境中,下载内容被写入 /tmp/rust-setup,赋予执行权限后以独立进程启动;在 Windows 环境中,脚本会在用户临时目录创建 rust-setup.ps1 和 rust-setup-launch.vbs,再通过 wscript.exe 隐藏启动 PowerShell。恶意进程在启动后脱离 Cargo 构建任务,使构建脚本能够正常退出,项目编译仍可能显示成功,从而降低攻击被开发人员或流水线直接发现的概率。载荷启动时会接收 23.254.165.112:443 作为 C2 地址。根据样本分析,相关载荷具备收集主机信息、枚举 Chromium 浏览器登录来源和扩展、建立用户级持久化,以及接收下载执行脚本或系统命令等能力。

Rust 官方随后删除了 arrayref@0.3.10internment@0.8.7 和 append-only-vec@0.1.9,并恢复此前被恶意撤回的正常版本。其中,三个恶意版本分别在线约 86、90 和 107 分钟,最晚于 09:25:24 UTC 被删除。官方还删除了 proc-macro1proc-macro-enaovinearonearonenao 和 tinymember,并建议对这些攻击者控制或关联包的所有版本进行排查。

需要注意,07:11—09:25 UTC(北京时间 15:11—17:25)是恶意包可从 crates.io 获取的主要暴露窗口,并不等同于恶意代码只能在该时间段执行。已经进入本地 Cargo 缓存、CI 缓存、基础镜像或 vendor 目录的恶意包,仍可能在后续构建中触发。因此,Cargo.lock 命中只能证明恶意版本曾进入依赖解析结果,Cargo 缓存命中表明相关包曾被下载;只有结合构建日志、进程遥测、恶意网络连接、落地文件或持久化痕迹,才能进一步判断二阶段载荷是否实际执行。

三、IOC

IP:23.254.165.112

Hash:

25ad700976873c76af785cb99b33c48db7df8b81f21d1e9e06b3676b9a9373ae
61198155da51b838772eecf5bfaac6cbc4dcc388dccc56658fc28a8e831b34d4
408ef22050ffc5a67e005802809026b29f297a8019f8fda91a2afa8e877ba434
492f2ab86f8d8911adc79c10ec1541704f5311d207d9d799b0d2a57fcc6a4391
c9561a3b00a0fa38b7772675d987f84bd429c55cd024fc08a98245c2d1632848
74d3447e7cf99c99ea01a16332ec27432dfb0f491e10e67cd118065a60483306

四、影响范围

本次事件影响范围覆盖所有直接或间接依赖受影响 crate,并在开发机、CI/CD Runner、发布服务器或其他构建环境中执行 Cargo 构建的项目。已确认被投毒的版本包括:

  • arrayref@0.3.10

  • internment@0.8.7

  • append-only-vec@0.1.9

上述版本均会引入恶意依赖 proc-macro1@1.0.107。此外,proc-macro-en@1.0.10 被公开研究认为包含相同的恶意 build.rs。Rust 官方还要求排查 proc-macro1proc-macro-enaovinearonearonenao 和 tinymember 的所有版本。

恶意包在 crates.io 的主要公开暴露窗口为 2026 年 8 月 20 日 07:11—09:25 UTC,即北京时间 15:11—17:25。该时间只代表恶意包可从公开注册表获取的主要窗口,不代表攻击只能在此期间发生。若恶意包已进入开发机 Cargo 缓存、CI 缓存、vendor 目录、基础镜像或内部制品仓库,后续构建仍可能执行其中的恶意 build.rs

五、排查方法

1. 排查锁文件和依赖清单

在代码仓库、构建工作目录、SBOM 和历史构建归档中检查恶意版本:

rg -n -U --glob 'Cargo.lock' \   'name = "arrayref"\r?\nversion = "0\.3\.10"|name = "internment"\r?\nversion = "0\.8\.7"|name = "append-only-vec"\r?\nversion = "0\.1\.9"|name = "(proc-macro1|proc-macro-en|aovine|arone|aronenao|tinymember)"' \ /path/to/repos

重点检查:

arrayref@0.3.10 internment@0.8.7 append-only-vec@0.1.9 proc-macro1@1.0.107 proc-macro-en@1.0.10

2. 排查 Cargo 缓存和 vendor

按照 Rust 官方建议检查本地缓存:

find ~/.cargo/registry/cache -type f \( \ -name 'arrayref-0.3.10.crate' -o \ -name 'internment-0.8.7.crate' -o \ -name 'append-only-vec-0.1.9.crate' -o \ -name 'proc-macro1-*.crate' -o \ -name 'proc-macro-en-*.crate' -o \ -name 'aovine-*.crate' -o \ -name 'arone-*.crate' -o \ -name 'aronenao-*.crate' -o \ -name 'tinymember-*.crate' \ \) -print

同样检查:

  • CI/CD 缓存;

  • 自托管 Runner 用户目录;

  • vendor/ 目录;

  • 容器镜像和构建基础镜像;

  • 内部 Cargo 镜像或制品仓库。

3. 排查构建执行记录

检查北京时间 2026 年 8 月 20 日 15:11 之后的开发机和 CI/CD 构建记录。

重点检索:

Compiling proc-macro1 v1.0.107 Compiling arrayref v0.3.10 Compiling internment v0.8.7 Compiling append-only-vec v0.1.9 cargo update cargo build cargo check cargo test

同时检查是否存在:

target/*/build/proc-macro1-*/ build-script-build

如果构建日志显示 proc-macro1@1.0.107 已进入编译流程,应进一步检查对应时间段的进程和网络日志。

4. 排查网络连接

在代理、防火墙、DNS、NetFlow、EDR 和 CI Runner 出网日志中检查:

23.254.165.112:9089 23.254.165.112:443

其中:

  • 23.254.165.112:9089 为高置信度载荷下载地址;

  • 23.254.165.112:443 为高置信度 C2 地址;

5. 排查主机文件和进程

Linux/macOS:

/tmp/rust-setup

Windows:

%TEMP%\rust-setup.ps1 %TEMP%\rust-setup-launch.vbs

六、处置建议

  1. 对命中受影响版本的开发机、CI/CD Runner、发布服务器和构建容器,应首先停止相关构建和发布任务,并根据证据等级采取隔离措施。若已发现连接 23.254.165.112:9089、恶意落地文件或持久化痕迹,应立即按主机失陷事件处置。在清理缓存、临时文件或重建主机前,应先保全构建日志、网络日志、进程遥测、Cargo 缓存及相关文件样本。

  2. 在内部 Cargo 代理、制品仓库、缓存服务和依赖准入策略中,阻断以下恶意版本:

    arrayref@0.3.10 internment@0.8.7 append-only-vec@0.1.9

    同时,将 proc-macro1proc-macro-enaovinearonearonenao 和 tinymember 的所有版本列为不可信包并进行人工核查。

  3. 将受影响项目固定到已知安全版本:

    arrayref = 0.3.9 internment = 0.8.6 append-only-vec = 0.1.8
  4. 取证完成后,清理开发机、CI/CD Runner、容器镜像、内部制品仓库、Cargo 缓存和 vendor 目录中残留的恶意包。重点检查并清除与以下 Hash 对应的文件:

    25ad700976873c76af785cb99b33c48db7df8b81f21d1e9e06b3676b9a9373ae 61198155da51b838772eecf5bfaac6cbc4dcc388dccc56658fc28a8e831b34d4 cb7778eb6dda91028abf087eb7c3553f981a67e756769507d348e8c201805568

七、参考链接

跳转微信打开