2026年9月4日 金曜日
AI時短ラボ
業界· 約15

2.4億DL超のRustクレートarrayrefが乗っ取られた4時間──base64のC2アドレスと『非yank版へどうぞ』の罠

2026年8月20日、Rustの人気クレートarrayref(累計2.45億ダウンロード)が侵害され、typosquat(誤字狙い)クレートproc-macro1経由でビルド時にリモートバイナリを実行する仕掛けが仕込まれた。発見者本人によるRustSecアドバイザリと、SafeDepチームの技術分析を突き合わせて、手口とIOCを確認した。

2.4億DL超のRustクレートarrayrefが乗っ取られた4時間──base64のC2アドレスと『非yank版へどうぞ』の罠
執筆・編集:
目次

2026年8月20日、Rustのクレート(パッケージ)レジストリcrates.ioで、累計2.45億ダウンロードを持つ人気クレート「arrayref」の新バージョンが、ビルド中にリモートのバイナリを実行するよう仕込まれていたことが発覚した。発見者本人がRustSecのアドバイザリDBに投稿した詳細な報告と、セキュリティ企業SafeDepの技術分析記事を突き合わせて、手口の中身を確認する。

3行まとめ

  • arrayref 0.3.10(2026年8月20日07:15 UTC公開)が、typosquat(本物のproc-macro2と紛らわしい名前)クレートproc-macro1への依存を新たに追加。そのbuild.rsがビルド時にリモートの実行ファイルをダウンロードして実行する
  • 手口は「yank(取り下げ)」の悪用だった。作者アカウントを乗っ取った攻撃者は0.3.5〜0.3.9をyankし、Cargoが表示する「yankされていないバージョンへの更新を検討してください」という警告が、被害を受けた0.3.10へユーザーを誘導する仕掛けになっていた
  • arrayreftiny-skiasctk-adwaitawinitという依存チェーンを通じて、egui・eframe・icedなどRustのGUI開発の大半に間接的に組み込まれている。crates.ioチームが該当バージョンを削除し、対応は完了している

仕込まれたコード──base64で分割されたC2アドレス

RustSecアドバイザリ(発見者jhobern氏本人による投稿、GitHub Issue #3161)は、悪意あるコードの中身をこう引用している。

// proc-macro1-1.0.107/build.rs(RustSecアドバイザリ#3161より引用)
const SRC_URL_PARTS: &[&str] =
    &["aHR0cHM6Ly8=", "MjMuMjU0Lg==", "MTY1Lg==", "MTEyOg==", "OTA4OS8="];
const END_URL_PARTS: &[&str] =
    &["MjMuMjU0Lg==", "MTY1Lg==", "MTEyOg==", "NDQz"];

これをbase64デコードすると、ペイロード配布元https://23.254.165.112:9089/と、C2(司令サーバー)アドレス23.254.165.112:443が組み上がる。アドバイザリによれば、通信にはrustlsを使いながら、3種類ある証明書検証メソッドすべてが無条件に成功を返す「AcceptAll」なServerCertVerifierを使っており、TLS証明書の検証が実質的に無効化されていた。取得したバイナリはターゲットに応じてrust-crate_0.1.0/_0.2.0/_0.3.0/_0.4.0のいずれかが選ばれ、2つ目のURLを引数(argv[1])として実行される。

Unix環境では/tmp/rust-setupとして書き出し、実行権限を与えてデタッチした状態で起動、標準入出力はnullに設定される。Windows環境では%TEMP%\rust-setup.ps1というPowerShellスクリプトを%TEMP%\rust-setup-launch.vbsというVBScriptランチャー経由で、wscript.exe //B //NologoかつCREATE_NO_WINDOWフラグで起動する。アドバイザリはソースコード中のコメントを引用し、「Cargoのジョブオブジェクトから逃れるため、ビルドが子プロセスを待たないようstd::mem::forget(child)している」と、攻撃者自身の意図がコード中に書かれていたことまで指摘している。

proc-macro1src/は本物のproc-macro2のコピーであるため、ビルド自体は通常どおり成功する。メタデータにはauthors = ["David Tolnay <rchaitm@gmail.com>"]という本物のRustエコシステムの著名開発者(dtolnay氏)を騙る記載と、404を返す偽のrepositoryフィールドが仕込まれていた。

「yankされたバージョンへの警告」を逆手に取った拡散手口

SafeDepの技術分析記事は、拡散の仕組みをこう説明している。arrayrefの正規メンテナdroundy氏のアカウントが侵害されたとみられ、旧バージョン0.3.5〜0.3.9はすべてyank(取り下げ)された状態になった。Cargoは依存先がyank済みバージョンだと「yankされていないバージョンへの更新を検討してください」という警告を出す仕様があり、この警告こそが、被害を受けていない唯一の非yankバージョンである0.3.10へユーザーを誘導する罠として機能した。RustSecアドバイザリの発見者自身も、「これが自分がこの問題に行き当たった経緯だ」と明記している。

侵害されたアカウントdroundyが保有していた他のクレート、internment(0.8.7)とappend-only-vec(0.1.9)も同様に悪意あるバージョンが公開され、削除された。SafeDepの記事によれば、droundy氏のGitHubアカウント自体(github.com/droundy)は現在404を返しており、上流コードの確認はできない状態だという。攻撃者側のtyposquatクレートproc-macro1を公開したアカウントdtolneyは、本物のdtolnay氏のユーザー名に酷似させたなりすましだった。

被害の広がり──2.45億ダウンロードの深い依存チェーン

RustSecアドバイザリは、arrayrefの依存チェーンをtiny-skiasctk-adwaitawinitと特定しており、これはegui/eframe・icedなどRustのGUI開発の大半で使われる経路にあたる。SafeDepの記事は、クリーンな0.3.9単体で約1億5,200万ダウンロード、arrayref全体では約2億4,499万ダウンロード(記事執筆時点)という数字を挙げている。これはクレートの使用実績の広さを示す数字であり、実際に被害を受けたビルドの件数そのものではない、とSafeDepは注記している。

侵害されて公開された/削除されたクレートの一覧は次のとおり。

クレート バージョン 公開者 状態
arrayref 0.3.10 droundy(侵害済み) 悪性、削除済み
internment 0.8.7 droundy(侵害済み) 悪性、削除済み
append-only-vec 0.1.9 droundy(侵害済み) 悪性、削除済み
proc-macro1 全バージョン dtolney(なりすまし) 悪性typosquat、リポジトリごと削除済み
proc-macro-en/aovine/arone/aronenao/tinymember 全バージョン 悪性の依存クレート、削除済み

IOC(侵害指標)一覧

RustSecアドバイザリに記載されているIOCをそのまま引用する。

23.254.165.112:9089                           payload host
23.254.165.112:443                            C2 (argv[1])
/tmp/rust-setup
%TEMP%\rust-setup.ps1 , rust-setup-launch.vbs
rust-crate_0.1.0 / _0.2.0 / _0.3.0 / _0.4.0

sha256
  arrayref 0.3.10       25ad700976873c76af785cb99b33c48db7df8b81f21d1e9e06b3676b9a9373ae
  proc-macro1 1.0.107   61198155da51b838772eecf5bfaac6cbc4dcc388dccc56658fc28a8e831b34d4
  proc-macro1 1.0.106   b5c1b5b0763a8809a644a8f92224653f0aca623a98eecc714d27f74b80fbe436

なおproc-macro1の1.0.106は、5時間早く公開された「クリーンなproc-macro2のコピー」で、それ自体に悪意はない「地ならし(staging)」用のバージョンだったとアドバイザリは注記している。攻撃者は先に無害なバージョンを1つ公開してクレートの信頼性を作った上で、次のバージョンで悪意あるコードを混ぜたとみられる。

droundy氏の他クレートも含め、crates.ioでは現在すべて削除・復旧を確認

この記事が扱う被害はarrayrefだけでなく、同じdroundyアカウントが公開していたinternmentとappend-only-vecにも及んでいる。crates.io APIを直接叩いて、本記事執筆時点(2026年8月末)の状態を確認した。

クレート 悪性バージョン 現在のcrates.io最新版(API実測) 悪性版は一覧に存在するか
arrayref 0.3.10 0.3.9(num_versions=15) 存在しない
internment 0.8.7 0.8.6(num_versions=41) 存在しない
append-only-vec 0.1.9 0.1.8(num_versions=9) 存在しない
proc-macro1(typosquat本体) 全バージョン クレート自体が"does not exist"を返す
proc-macro-en / aovine / arone / aronenao / tinymember 全バージョン いずれも"does not exist"(5クレートすべてAPIで個別確認)

3つの正規クレートはいずれも、悪性バージョンだけがバージョン一覧から消え、その直前の正規版(arrayref 0.3.9、internment 0.8.6、append-only-vec 0.1.8)が最新版として残っている。typosquat側の6クレート(proc-macro1本体と依存関係にあった5クレート)は、crates.io API上で完全に「存在しない」扱いになっており、パッケージごと抹消されたことがわかる。

GitHub側も確認したところ、記事執筆時点でSafeDepが404と報告していたgithub.com/droundyとその配下のリポジトリは、droundy/arrayrefdroundy/append-only-vecとも現在はHTTP 200で閲覧できる状態に戻っている。droundy/arrayrefのGitHub APIレスポンスではpushed_atが2026-08-25T17:52:40Zとなっており、事件発覚(8/20)から5日後には正規メンテナー側がリポジトリへのpushを再開したとみられる。

対応済みだが、ビルド時実行という手口の再確認になった

crates.ioチームは悪性バージョンをすでに削除しており、この記事の執筆時点で新たな被害が広がっている状況ではない。ただし今回の手口──「yank警告」を悪用して被害バージョンへ誘導する、正規開発者の名前に酷似したtyposquatを使う、ビルドスクリプト(build.rs)というコンパイル時に無条件で実行されるコードにペイロードを仕込む、base64分割でC2アドレスを難読化する──は、いずれもRustに限らずサプライチェーン攻撃の定番手口の組み合わせであり、目新しい脆弱性というより「今もこの手口が通用する」という再確認として読むべき事例だ。

crates.ioの現状は確認したが、乗っ取りの手口自体は追えていない

この記事はRustSecアドバイザリ(GitHub Issue #3161、発見者jhobern氏本人の投稿)とSafeDepの技術分析記事を一次ソースに、crates.io APIとGitHub APIで現在(2026年8月末)の状態を追加確認したものだ。ただし、実際にペイロードのバイナリを取得して動作解析する、あるいはIOCに記載されたIPアドレスへの通信を自分の環境で検証するといった追加調査は行っていない。侵害されたアカウントdroundyが実際にどのような手口(パスワード漏洩・フィッシング・トークン窃取など)で乗っ取られたのかについては、両方の一次ソースにも記載がなく、crates.io・GitHubのAPIレスポンスにもその情報は含まれていないため、この記事でも特定できていない。Zenn検索では「arrayref」0件(2026年8月27日実測)。Qiitaでは類似の事件を扱った記事が別途見つかっており、この事件自体への日本語での言及がまったくないわけではない。

関連記事: 依存ゼロ・単一Rustバイナリで動くMCPサーバー mcp-stama / AIエージェント時代のセキュリティリスク

感想・指摘はコメント欄へ。

シェア: ポスト はてブ

出典・参照資料

AIニュースの解説を動画でも

YouTubeでは注目ニュースの背景を解説し、Xでは新着記事をお知らせしています。

コメント

まだコメントはありません。最初のコメントを書いてみませんか?

AIについて聞きたいことはありますか?

質問箱で無料で受け付けています。回答は公開され、他の方の参考にもなります。

質問箱を見る →

新しい記事をメールで受け取る

AIの新しい発表を、出典付きで整理して届けます。

関連記事

GitHubにすら置かれていないコーディングエージェント「kaagum」──Guile言語・自前UIなし・ACP専用という徹底ぶりの記事画像
検証09.02読了14

GitHubにすら置かれていないコーディングエージェント「kaagum」──Guile言語・自前UIなし・ACP専用という徹底ぶり

出典 ─ kaagum: Tiny, security
1.52MBのバイナリが3.5msでコンテナを起動する──ルートレスサンドボックス「kern」をAI生成コードの実行にどう使うかの記事画像
検証09.02読了15

1.52MBのバイナリが3.5msでコンテナを起動する──ルートレスサンドボックス「kern」をAI生成コードの実行にどう使うか

出典 ─ getkern/kern
OSキーチェーンが無い環境でもMCP InspectorがOAuthの秘密を保持できるように──AES-256-GCM暗号化と「壊れたら書き込まない」設計の記事画像
検証09.02読了14

OSキーチェーンが無い環境でもMCP InspectorがOAuthの秘密を保持できるように──AES-256-GCM暗号化と「壊れたら書き込まない」設計

出典 ─ modelcontextprotocol/i
AI Skillsに「品質ゲート」を通す──NVIDIAが公開したオープンソース評価基盤SkillEvaluatorを読むの記事画像
検証09.02読了14

AI Skillsに「品質ゲート」を通す──NVIDIAが公開したオープンソース評価基盤SkillEvaluatorを読む

出典 ─ NVIDIA/SkillEvaluator
『26.1%のスキルに脆弱性』──外部Agent Skillsを入れる前に走らせるNVIDIAのセキュリティスキャナ「SkillSpector」の記事画像
検証09.02読了14

『26.1%のスキルに脆弱性』──外部Agent Skillsを入れる前に走らせるNVIDIAのセキュリティスキャナ「SkillSpector」

出典 ─ NVIDIA/SkillSpector RE
人気Rustクレートarrayrefが乗っ取られ、ビルド時にマルウェアを実行していた──245百万DLの依存先で何が起きたかの記事画像
研究09.01読了16

人気Rustクレートarrayrefが乗っ取られ、ビルド時にマルウェアを実行していた──245百万DLの依存先で何が起きたか

出典 ─ SafeDep公式ブログ「Malicious
モデル署名だけじゃない──OpenSSFのAI/MLセキュリティWGが同時に動かす7つのプロジェクトの記事画像
研究09.01読了19

モデル署名だけじゃない──OpenSSFのAI/MLセキュリティWGが同時に動かす7つのプロジェクト

出典 ─ GitHub: ossf/ai-ml-sec
AIエージェントの`rm -rf`を実行前に止める「Doberman」──自己申告ベンチマークを読むと見えてくる限界の記事画像
検証09.04読了12

AIエージェントの`rm -rf`を実行前に止める「Doberman」──自己申告ベンチマークを読むと見えてくる限界

出典 ─ fu351/Doberman-Core