# 一个 Rust crate 在编译时运行了恶意软件。86 分钟。

Published: 2026-09-15

一个拥有 2.6 亿次下载量的四宏 Rust crate 添加了一个依赖项，\`cargo build\` 会在你的机器上运行陌生人的二进制文件。2026 年 8 月 20 日：arrayref 0.3.10 在 crates.io 上发布，依赖于 proc-macro1——而不是真正的 proc-macro2——其构建脚本会下载一个有效载荷，将其放到 /tmp/rust-setup 中，并在你的项目编译时将其作为分离进程启动。干净的版本被撤回，因此 Cargo 自己的警告会引导你到被污染的版本。86 分钟后它被删除。

Canonical: https://thedailydiff.dev/zh-CN/video/2026-09-15-arrayref-proc-macro/

## 本视频涵盖的内容

- cargo build 运行了陌生人的二进制文件
- 依据：Rust 博客、SafeDep、Hacker News
- 这是 The Daily Diff，事后分析
- 时间线：02:11 暂存 → 07:15 发布 → 08:41 删除
- 机制：build.rs，无沙盒，撤回诱饵

## 章节

- 0:00 cargo build 运行了陌生人的二进制文件
- 0:20 依据：Rust 博客、SafeDep、Hacker News
- 0:33 这是 The Daily Diff，事后分析
- 0:40 时间线：02:11 暂存 → 07:15 发布 → 08:41 删除
- 1:25 机制：build.rs，无沙盒，撤回诱饵
- 2:05 git blame — 分割
- 2:25 影响范围：2,285 次下载
- 2:45 结论 + 星期一的底线

## 翻译的文字记录

译自英文原版旁白。可用音频和字幕由 YouTube 控制。

### cargo build 运行了陌生人的二进制文件

0:00 一个拥有 2.5 亿次下载量的四宏 Rust crate 添加了一个 依赖项，\`cargo build\` 会在你的机器上运行陌生人的二进制文件。 2026 年 8 月 20 日。 arrayref 0.3.10 发布在 crates.io 上，依赖于 proc-macro1。 不是 proc-macro2，真正的那个：差了一个数字，其构建脚本会在你的项目编译时运行一个 有效载荷。 Rust 安全团队在 86 分钟后将其删除。

### 依据：Rust 博客、SafeDep、Hacker News

0:22 SafeDep 发布了拆解报告。 Hacker News：554 分。 它是如何发生的，为什么 Cargo 允许它，以及谁该承担责任。 这是 The Daily Diff，事后分析。 世界标准时间凌晨两点。

### 这是 The Daily Diff，事后分析

0:33 一个名为 d-tolney 的账户，与 David Tolnay 仅差一个字母， David Tolnay 维护着 Rust 的一半，他发布了 proc-macro1 1.0.106：真实的

### 时间线：02:11 暂存 → 07:15 发布 → 08:41 删除

0:41 proc-macro2，重命名。暂存。 07:11。版本 1.0.107 添加了一个构建脚本，以及 base64、TLS 和一个 HTTP 客户端。 用于一个 token 解析器。 07:15。维护者的账户将 arrayref 重新发布为 0.3.10，并 撤回了所有旧版本。 Cargo 打印：考虑更新到未被撤回的版本。 唯一剩下的就是被污染的版本。

1:02 这个警告是诱饵。 同一分钟，一家安全公司向 Rust 报告了它。 07:54，一个 RustSec 问题。 08:29，仓库上出现一个问题；攻击者以 0.3.11 和第二个 恶意依赖项作为回应。08:41，删除。 八十六分钟。为什么？ 一：Cargo 会构建所有声明的依赖项，无论是否被调用。 一个清单行就足够了。

1:21 二：构建脚本在你的机器上运行，以你的身份，使用你的 SSH 密钥和 Cargo

### 机制：build.rs，无沙盒，撤回诱饵

1:26 令牌，在你的代码编译之前。 没有沙盒，这是故意的：这是 crate 查找 C 库的方式。 三：内部是真实的 proc-macro2，所以构建成功。 有效载荷：一个信任任何证书的 TLS 客户端会获取一个二进制文件， 将其放到 /tmp/rust-setup 中，并将其作为分离进程启动。 在 Windows 上，它会通过 wscript 绕过 Cargo 的 job object；一个源代码 注释说明了这一点。 第二阶段，根据 RustSec 帖子：一个针对

1:52 浏览器和加密钱包的远程访问工具。 很有诗意，因为 arrayref 最大的用户包括 secp256k1 和 Solana。 git blame。Cargo 的模型，百分之五十五：依赖项在编译时在你的机器上运行代码， 没有沙盒，并且撤回警告将人们引向了

### git blame — 分割

2:07 毒药。一个账户，百分之三十：一个凭据 重新发布了一个拥有 2.5 亿次 下载量的 crate。 数字一，百分之十五：来自 Rust 最受信任的 crate 的一个按键， 而没有人阅读整个树。 影响范围：86 分钟内 2,285 次下载。 不到总流量的百分之十，因为大多数 lockfile 都保留了 0.3.9。 crates.io 表示没有使用证据。

### 影响范围：2,285 次下载

2:27 RustSec 帖子中有两个人不同意；一个人发现了一个 systemd 服务。 在 Hacker News 上，最热门的帖子不是关于恶意软件的。 它是关于 crate 页面，现在 0.3.10 似乎从未存在过。 结论，事后分析：NEEDS REVIEW。 86 分钟删除，当天发布博客文章，账户被锁定：这 部分是 SHIP IT。 但是 crate 页面显示什么也没发生，cargo audit 对缓存的副本保持沉默，

### 结论 + 星期一的底线

2:48 并且构建脚本仍然以你的身份运行。 星期一：运行 Rust 博客的查找命令，并将撤回警告视为一个 问题，而不是指令。 将你仍然不允许谈论的事件发送给我， 在评论中，或者发送到 daily diff dot dev。 这就是今天的 Daily Diff。 我是 Axrisi 的 Niko。 负责任地合并。

## 来源

- [Rust Blog, "Supply chain attack on arrayref" (security-response, Aug 20, 2026)](https://blog.rust-lang.org/2026/08/20/supply-chain-attack-on-arrayref/) — blog.rust-lang.org
- [RUSTSEC-2026-0260 (arrayref)](https://github.com/rustsec/advisory-db/blob/main/crates/arrayref/RUSTSEC-2026-0260.md) — github.com
- [RustSec issue #3161 (the original report, IOCs, victims)](https://github.com/rustsec/advisory-db/issues/3161) — github.com
- [SafeDep technical analysis](https://safedep.io/arrayref-proc-macro1-rust-build-time-malware/) — safedep.io
- [GitHub issue on the repo (0.3.11 spotted)](https://github.com/droundy/arrayref/issues/33) — github.com
- [crates.io](https://crates.io/crates/arrayref) — crates.io
- [Hacker News (554 points)](https://news.ycombinator.com/item?id=49374269) — news.ycombinator.com
- [BleepingComputer](https://www.bleepingcomputer.com/news/security/hackers-poison-arrayref-rust-crate-to-push-infostealer-malware/) — www.bleepingcomputer.com
