Rustサプライチェーン攻撃、arrayrefにビルド時マルウェアを混入
3 分で読めます
数字で見る
- 245M
- all-time downloads of arrayref on crates.io
- 403
- crates listing arrayref as a direct dependency
- 35%+
- of all environments contain arrayref, per Wiz
- arrayref 0.3.10
- 86 min
- internment 0.8.7
- 90 min
- append-only-vec 0.1.9
- 107 min

攻撃者は2026年8月20日、広く使われている3つのRustクレートの悪意あるバージョン - arrayref 0.3.10、internment 0.8.7、append-only-vec 0.1.9 - をcrates.ioに公開した。これらのバージョンを解決したプロジェクトをコンパイルした者は、自分のマシン上でマルウェアを実行したことになる。ペイロードはcargo buildそのものの最中に実行されるため、開発者やCIランナーが汚染されたコードを呼び出す必要は一切なかった。
露出時間は短かったが、影響範囲は小さくない。The Hacker Newsによれば、arrayrefの累計ダウンロード数は245,385,500件、攻撃前90日間だけで53,905,601件にのぼり、403のクレートが直接依存として指定している。セキュリティ企業のWizは、同社が観測する全環境の35%超にarrayrefが存在し、Rustが存在する環境に限れば4分の3で使われていると述べている。
攻撃の仕組み
Rust Security Response Teamは、8月20日7時15分(UTC)に報告を受け、新しいarrayrefリリースが「悪意あるペイロードをダウンロードするビルドスクリプトを含んでいた」ことを確認したと説明している。悪意あるバージョンはarrayref自体のコードを改変していない。代わりにproc-macro1という新しい依存関係を追加した。正規のproc-macroエコシステムを装ったタイポスクワットで、そのビルドスクリプトがコンパイル時にリモートのバイナリをダウンロードして実行する。
StepSecurityの分析はこの仕組みを端的に表現している。「ロックファイルがarrayref 0.3.10を解決するプロジェクトをビルドするだけで、ペイロードが起爆した。クレートのコードを呼び出す必要は一切ない」。同じ分析によれば、攻撃者はarrayrefのクリーンな0.3.x系リリースをスクリプトで一斉にヤンク(取り下げ)し、「Cargo自身の『yanked version』警告を配布メカニズムとして武器化」した。警告に反応した開発者は、そのまま悪意あるリリースへとアップグレードしてしまう。
Wizによれば、ダウンロードされたバックドアはBase64断片からコマンド&コントロール(C2)URLを再構成し、TLS証明書検証を無効化し、Windows・macOS・Linux向けの永続化機構を備えたプラットフォーム別ペイロードと、ブラウザプロファイルからの認証情報列挙機能を持っていた。proc-macro1に加え、Rust Security Response Teamは攻撃者が管理する5つのクレート - proc-macro-en、aovine、arone、aronenao、tinymember - を特定した。
crates.ioの対応は速かった。The Hacker Newsが報じたタイムスタンプによれば、arrayref 0.3.10の公開時間は86分、internment 0.8.7は90分、append-only-vec 0.1.9は107分だった。StepSecurityは「ペルソナの作成からレジストリでの削除まで、作戦全体が一つの平日の午前中に収まる」と指摘している。
背後にいるのは誰か
侵害されたのはメンテナーのアカウントであって、メンテナー本人ではない。Rust Security Response Teamは開示の中で「arrayrefの作者が悪意を持って行動しているとは考えていない。彼らのコンピュータか認証情報が侵害されている可能性が高い」と述べた。
Wizの報告によれば、このキャンペーンのインフラは最近の北朝鮮によるサプライチェーン作戦と大きく重なる。DPRK系のSapphire Sleetによるものとされるnpmのキャンペーン「Mastra」と同じHostwindsのアドレス帯23.254.164.0/23を共有し、C2通信の宛先IPはGoogle Cloud Threat Intelligenceによるaxios npm攻撃(これも北朝鮮によるものとされる)の分析に登場するものだった。npmでおなじみとなった攻撃の手口が、crates.ioに到達したことになる。
開発者にとっての意味
8月20日の午前中(UTC)にあなたのマシンやCIランナーがRustプロジェクトをビルドしていたなら、ロックファイルがarrayref 0.3.10、internment 0.8.7、append-only-vec 0.1.9のいずれかを解決していないか確認し、ローカルのレジストリキャッシュを調べること。Rust Security Response Teamのアドバイザリは、キャッシュされた依存関係に上記の悪意あるクレート名がないか確認するよう求めている。これらをビルドしたマシンは「露出した」ではなく「侵害された」ものとして扱うべきだ。Wizによればペイロードは永続化を仕込み、ブラウザの認証情報を列挙する。そのマシンから届く範囲のシークレットはローテーションすること。
構造的な教訓は、ビルドスクリプトはリモートコード実行の攻撃面であり、ロックファイルがその制御手段だということだ。コミットされたCargo.lockは正確なバージョンを固定するため、86分間の公開時間中に危険にさらされたのは、まっさらなcargo installやバージョン固定のないCIジョブだった。さらにこの攻撃は安全機能を餌に変えた。ヤンク警告を使ったトリックにより、「ヤンクされたバージョンを見たら即アップデート」はもはや安全な反射ではない。何にアップグレードするのかを確かめ、長年安定していたクレートの差分に突然現れた新しい依存関係は、作業を止める合図として扱うべきだ。
Sources
- Supply chain attack on arrayref - Rust Blog
- Rust Supply Chain Attack on arrayref: Significant Overlap with DPRK Campaigns - Wiz
- Rust Supply Chain Attack Puts Build-Time Malware in Crates with 245 Million Downloads - The Hacker News
- Rust Supply-Chain Attack: arrayref, internment, and append-only-vec Poisoned by the proc-macro1 Build-Time Dropper - StepSecurity