Rust 供应链攻击:arrayref 0.3.10 与 proc-macro1 拼写劫持

Lobsters Hottest 新闻

摘要

一次供应链攻击妥协了 Rust 的 crate arrayref,添加了恶意依赖,该依赖在构建时执行代码,影响了众多下游项目。

<p><a href="https://lobste.rs/s/dns8du/rust_supply_chain_attack_arrayref_0_3_10">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/08/20 10:41

# Rust 供应链攻击:arrayref 0.3.10 与 proc-macro1 拼写错误仿冒包在构建时执行远程载荷 - StepSecurity 来源:https://www.stepsecurity.io/blog/arrayref-rust-crate-supply-chain-attack ## 概述:受影响的软件包,正在调查中 Rust crate `arrayref` 的 0.3.10 版本已被入侵。该版本于 2026年8月20日 07:15 UTC 发布,悄无声息地添加了对 `proc-macro1` 1.0.107 的依赖。后者是广泛使用的 `proc-macro2` 的拼写错误仿冒包,其构建脚本会从 `https://23.254.165.112:9089/` 下载一个二进制文件,并在任何构建该 crate 的机器上执行它。由于恶意代码位于 `build.rs` 中,仅编译项目就足以运行载荷;无需调用该 crate 的任何功能。我们正与 Rust 安全社区共同积极调查此事件。crates.io 已删除这两个恶意版本,但在暴露窗口期内刷新过锁文件的任何用户都应视为已被入侵。感染指标和补救步骤如下。 ## 事件经过 - 01:17: 一个名为 `dtolney` 的 GitHub 账户被创建,冒充真实 `proc-macro2` 的作者 David Tolnay (`dtolnay`)。 - 01:25: 匹配的 crates.io 账户 `dtolney` 被创建。 - 01:55: 发布了 `proc-macro1` 1.0.106:这是 `proc-macro2` 的干净、逐字复制版本。纯粹的铺垫;它在仿冒名称下构建了一个看似合理且无害的 crate。 - 07:11: 发布了 `proc-macro1` 1.0.107,添加了任何真正的过程宏库都不需要的构建依赖(`base64`、`rustls`、`ureq`)。 - 07:15: 从其所有者 `droundy` 的账户发布了 `arrayref` 0.3.10,添加了该 crate 十年历史上的第一个真实依赖:`proc-macro1 ^1.0.107`。同一分钟内,版本 0.3.5 至 0.3.9 在脚本控制下被批量撤销(间隔约 4 秒),这样 Cargo 的“已撤销版本”警告会促使用户升级到陷阱中。 - 07:54: 事件被报告给 RustSec 安全公告数据库和 Rust 安全团队。 - 08:03: crates.io 删除了 `proc-macro1`。 - 08:41: crates.io 从索引中移除了 `arrayref` 0.3.10。 暴露窗口:大约 86 分钟。 `droundy` 账户属于一位自 2009 年起信誉良好的维护者,该账户据信已被入侵,其关联的 GitHub 账户在撰写本文时返回 404。攻击者的身份是同天早上伪造的,包含伪造的作者元数据(`David Tolnay <[email protected]>`)和一个不存在的仓库链接。 ## 攻击原理 `proc-macro1` 1.0.107 中的恶意 `build.rs`: - 从 base64 片段重新组装其基础设施:载荷主机 (`https://23.254.165.112:9089/`) 和命令控制端点 (`23.254.165.112:443`)。 - 通过 TLS 获取第二阶段二进制文件(显式禁用了证书验证,即接受所有验证器),根据目标平台从 `rust-crate_0.1.0` 至 `_0.4.0` 中选择。 - 在 Unix 系统上将其放置到 `/tmp/rust-setup`,或在 Windows 系统上通过隐藏的 `wscript.exe` 启动器将其放置到 `%TEMP%\rust-setup.ps1`,然后以 C2 地址作为参数分离生成进程,小心翼翼地绕过 Cargo 的作业对象,使构建无需等待即可完成,且不会引起怀疑。 - 同时,库代码本身是真正的 `proc-macro2`,因此构建成功,感染在正常输出中不可见。 载荷主机是一个 Hostwinds VPS (`hwsrv-798836.hostwindsdns.com`)。第二阶段载荷的行为仍在分析中。 ## 重要性:影响范围 `arrayref` 是一个基础性的工具 crate,历史总下载量约为 2.45 亿次。报告者追溯了链条 `tiny-skia` → `sctk-adwaita` → `winit`,表明恶意版本位于 egui/eframe、iced 和大多数 Rust GUI 应用程序之下。我们的反向依赖检查显示影响范围更广:依赖者包括 `blake3`、`blake2b_simd`/`blake2s_simd`、`revm-precompile`(以太坊)以及 `solana-runtime`/`spl-token`(Solana)。在 86 分钟窗口期内,任何以该用户权限新解析 `arrayref ^0.3` 的 CI 作业或开发者构建都执行了该载荷。 ## 我是否受影响?现在该怎么办 - **检查锁文件**:`grep -A2 'name = "arrayref"' Cargo.lock`。版本 `0.3.10` 或任何名为 `proc-macro1` 的条目,都意味着载荷已在该机器上运行。 - **查找痕迹**:`/tmp/rust-setup`、`%TEMP%\rust-setup.ps1`、`%TEMP%\rust-setup-launch.vbs`,以及任何到 `23.254.165.112`(端口 9089 或 443)的网络出站连接。 - **如发现证据**:将该主机视为已被入侵。轮换其所有可访问的凭据、令牌和密钥,包括 CI 秘钥和签名密钥,并从干净源重新构建暴露后产生的任何制品。 - **如果未受影响**:固定 `arrayref = "=0.3.9"`(已撤销版本仍可被现有锁文件下载),且切勿通过盲目升级来解决撤销警告。请注意,在维护者问题解决之前,Cargo 当前会将 `arrayref ^0.3` 解析到 2017 年的 0.3.4 版本。 ## 感染指标 **网络**: - `23.254.165.112:9089`(载荷主机) - `23.254.165.112:443`(C2,作为 argv[1] 传递给载荷) - `hwsrv-798836.hostwindsdns.com` **文件**: - `/tmp/rust-setup` - `%TEMP%\rust-setup.ps1` - `%TEMP%\rust-setup-launch.vbs` **二进制文件**: - `rust-crate_0.1.0` / `_0.2.0` / `_0.3.0` / `_0.4.0` **Crate**: - `arrayref` 0.3.10 - `proc-macro1` 1.0.106 和 1.0.107 **账户**: - `dtolney`(crates.io id 438608)- 冒充者 - `droundy` - 合法所有者,据信已被入侵 **邮箱**: - `[email protected]`(伪造的作者元数据) **SHA-256**: - `25ad700976873c76af785cb99b33c48db7df8b81f21d1e9e06b3676b9a9373ae` arrayref-0.3.10.crate - `61198155da51b838772eecf5bfaac6cbc4dcc388dccc56658fc28a8e831b34d4` proc-macro1-1.0.107.crate - `b5c1b5b0763a8809a644a8f92224653f0aca623a98eecc714d27f74b80fbe436` proc-macro1-1.0.106.crate ## 参考资料 rustsec advisory-db (https://github.com/rustsec/advisory-db/issues/3161)

相似文章

恶意Rust包Arrayref在构建时执行负载

Hacker News Top

流行的Rust包`arrayref`的一个受损版本包含了一个恶意的构建时负载,该负载在编译期间执行远程代码,影响了众多下游项目。

使用 Cackle 提高 Rust 供应链攻击难度(2023)

Lobsters Hottest

David Lattimore 介绍了 Cackle,这是一个通过使用访问控制列表(ACL)限制依赖项行为来帮助防止 Rust 供应链攻击的工具,从而降低通过第三方 crate 引入恶意代码的风险。

事故报告:CVE-2024-YIKES

Hacker News Top

一份讽刺性的事故报告描述了一场灾难性的多阶段供应链攻击,该攻击始于一个被篡改的 JavaScript 依赖项,并在 Rust 和 Python 生态系统中蔓延,最终因一只挖矿蠕虫的“意外介入”而得以解决。