+− THE DAILY DIFFdev & AI news
NEEDS REVIEW

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

一个拥有 2.6 亿次下载量的四宏 Rust crate 添加了一个依赖项,`cargo build` 会在你的机器上运行陌生人的二进制文件。

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

阅读书面版(英文) ↗

本视频涵盖的内容

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

翻译的文字记录

译自英文原版旁白。可用音频和字幕由 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。 负责任地合并。

来源

  1. Rust Blog, "Supply chain attack on arrayref" (security-response, Aug 20, 2026)blog.rust-lang.org
  2. RUSTSEC-2026-0260 (arrayref)github.com
  3. RustSec issue #3161 (the original report, IOCs, victims)github.com
  4. SafeDep technical analysissafedep.io
  5. GitHub issue on the repo (0.3.11 spotted)github.com
  6. crates.iocrates.io
  7. Hacker News (554 points)news.ycombinator.com
  8. BleepingComputerwww.bleepingcomputer.com

相关视频

postmortem · zh-CN · 2026年9月13日

十一行 JavaScript 代码搞垮了互联网。一次取消发布。

2016年3月22日,世界协调时21:30:一位开发者在npm将包名“kik”交给即时通讯应用Kik后,取消发布了他所有的273个npm包,Kik的专利代理人曾威胁要“让律师上门找你”。这273个包中有一个是left-pad:十一行代码,用于在字符串前面添加空格,每月下载量达250万次。几分钟之内,Babel、React和Node的构建在全球范围内失败,每分钟数百次。十分钟内出现了一个分支,但没有

2:52 ↗
postmortem · zh-CN · 2026年9月22日

一次重启让Telstra回到了2006年。九百万部手机受到影响。

墨尔本的一名工程师在凌晨2:50重新启动了一个时序机箱,到早餐时间,澳大利亚最大的移动网络竟然认为现在是2006年11月。2026年7月8日:Telstra的NTP机箱中的一张GPS卡在电源维修期间重启,其固件从未进行过GPS周翻转更新,因此它选择了旧的纪元,回到了1024周之前。由于2025年10月的一个权宜之计,这张卡成为了网络中唯一的层级1(stratum-1)时间源——并且2020年切换到

3:15 ↗