觀點 · 資訊分享
Rust 熱門套件 arrayref 被植入惡意依賴:上架 86 分鐘就被撤,期間被下載 2,285 次
Rust 官方套件庫 crates.io 發現 arrayref 等 3 個套件被發布了帶惡意依賴的新版,編譯時就會下載惡意程式。官方 1 個多小時內全數撤下,並提供檢查方法。
- 發布
- 2026-08-20
- 篇幅
- 約 4 分鐘 · 1,616 字
- 結構
- 7 節 + 3 題常見問題
- 標籤

一句話看懂:Rust 熱門套件 arrayref 被人用作者帳號發布了帶惡意依賴的新版,一編譯就會下載惡意程式;官方 86 分鐘內撤下,多數人因為鎖檔沒被波及。

先用白話講:供應鏈攻擊是什麼?
寫程式很少從零開始,大家都會拿別人做好的「零件」來組裝,這些零件就是套件。Rust 的官方零件倉庫叫 crates.io。
供應鏈攻擊就像有人混進零件工廠,在一顆很多人用的螺絲裡藏了東西。你什麼都沒做錯,只是照常進貨、組裝,問題就跟著進來了。
這次更麻煩的是:Rust 套件可以帶一個建置腳本,在「編譯」的時候就自動執行。所以攻擊者不用等你呼叫任何功能,你一按建置,惡意程式就開始動作。
發生什麼事
依 Rust 官方部落格與 RustSec 公告:
- 8 月 20 日 07:15(UTC,台灣時間 15:15,自行換算),Rust 安全回應小組收到通報,確認
proc-macro1套件的建置腳本會下載惡意程式 - 它的名字跟常見套件
proc-macro2只差一個數字,很容易被看成同一個 - 熱門套件
arrayref被發布新版 0.3.10,加上對proc-macro1的依賴;同一作者的internment、append-only-vec也被動手腳 - 官方刪除惡意版本、恢復被惡意下架的舊版,並鎖定作者帳號;官方認為作者本人不是惡意,而是電腦或帳密可能被盜
各版本上架時間:
| 惡意版本 | 上架時間 |
|---|---|
| arrayref 0.3.10 | 86 分鐘 |
| internment 0.8.7 | 90 分鐘 |
| append-only-vec 0.1.9 | 107 分鐘 |
另外 proc-macro1、proc-macro-en、aovine、arone、aronenao、tinymember 這 6 個套件的所有版本都被刪除。
影響有多大?
RustSec 公告寫明:惡意版 arrayref 被下載 2,285 次,不到 arrayref 全部下載流量的 10%。原因是多數專案的 Cargo.lock 鎖檔還停在舊版,沒有自動升上去。這次是鎖檔真正發揮作用的例子。
給開發者的技術細節
- 安全版本:arrayref 0.3.9 以前不受影響,目前沒有「修補版」,鎖在 0.3.9 即可
- 先看自己專案的鎖檔有沒有出現惡意版本:
# 在專案根目錄檢查 Cargo.lock
grep -nE 'name = "(proc-macro1|proc-macro-en|aovine|arone|aronenao|tinymember)"' Cargo.lock
grep -nA1 'name = "arrayref"' Cargo.lock
- 再照官方部落格提供的
find指令,檢查~/.cargo/registry/cache有沒有這幾個版本的.crate檔;CI 建置機也要一起查 - 首先通報這件事的是 Nextron Systems 研究團隊
我的看法
這次能把損害壓在兩千多次下載,靠的是兩件事:官方一個多小時內就處理完,以及大家的專案都有鎖檔。接案時我會要求 Cargo.lock、pnpm-lock.yaml 這類鎖檔一定要進版控,CI 也用鎖檔安裝,不要每次建置都抓最新版,這就是原因。
另一個提醒是建置環境本身。CI 機器上通常放著部署金鑰、雲端權杖,建置腳本一執行就碰得到它們。如果查到命中,不要只把套件版本改回來就算了,那台機器上的金鑰都應該當成外洩,全部換掉。
名詞小辭典
- 套件(Crate):Rust 世界裡別人寫好、可以直接拿來用的程式零件。
- 鎖檔(Cargo.lock):記錄專案用到的每個套件「確切版本」的檔案,讓每次建置都裝一樣的版本。
- 建置腳本(build.rs):編譯 Rust 套件時會自動執行的一段程式。
- RustSec:Rust 社群維護的安全公告資料庫,每個問題有一個 RUSTSEC 編號。