# 一個 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 — 該 crate 的構建腳本會下載一個有效負載，將其放入 /tmp/rust-setup 並在您的項目編譯時以分離模式生成它。乾淨的版本被撤銷，因此 Cargo 自己的警告會引導您到被感染的版本。86 分鐘後，它被刪除。

Canonical: https://thedailydiff.dev/zh-HK/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，事後分析。 UTC 時間凌晨兩點。

### 這是 The Daily Diff，事後分析

0:33 一個名為 d-tolney 的帳戶，與 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 客戶端。 用於一個令牌解析器。 07:15。維護者的帳戶將 arrayref 重新發佈為 0.3.10 並 撤銷了所有舊版本。 Cargo 打印：考慮更新到一個未被撤銷的版本。 唯一剩下的就是被感染的版本。

1:02 警告就是誘餌。 同一分鐘，一家安全公司向 Rust 報告了它。 07:54，一個 RustSec 問題。 08:29，repo 上的一個問題；攻擊者以 0.3.11 和第二個 惡意依賴項回應。08:41，已刪除。 86 分鐘。為什麼？ 第一：Cargo 會構建所有聲明的依賴項，無論是否被調用。 一個清單行就足夠了。

1:21 第二：一個構建腳本在您的機器上執行，作為您，帶有您的 SSH 密鑰和 cargo

### 機制：build.rs，無沙盒，撤銷誘餌

1:26 令牌，在您的代碼編譯之前。 無沙盒，這是設計使然：這是 crate 查找 C 庫的方式。 第三：內部是真正的 proc-macro2，因此構建成功。 有效負載：一個信任任何證書的 TLS 客戶端會獲取一個二進制文件， 將其放入 /tmp/rust-setup 並以分離模式生成它。 在 Windows 上，它會通過 wscript 繞道以逃避 Cargo 的作業對象；一個源代碼 註釋說明了這一點。 根據 RustSec 線程，第二階段：一個針對瀏覽器和加密錢包的遠程訪問工具。

1:52 瀏覽器和加密錢包。 富有詩意，因為 arrayref 的最大用戶包括 secp256k1 和 Solana。 git blame。Cargo 的模型，百分之五十五：依賴項在編譯時在您的 機器上執行代碼，無沙盒，並且撤銷警告將人們引導到了

### git blame — 分裂

2:07 毒物。一個帳戶，三十：一個憑證 重新發佈了一個 crate，有 2.5 億次 下載信任。 數字一，十五：來自 Rust 最受信任的 crate 的一個擊鍵， 沒有人讀樹。 影響範圍：在 86 分鐘內下載了 2,285 次。 不到流量的百分之十，因為大多數鎖定文件都保存了 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。 這就是今天的 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
