
2026/05/11 2:43
インシデントレポート:CVE-2024-YIKES
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
ソースコードのサプライチェーン攻撃は、
left-justify(週ごとのダウンロード数が 8.47 億回)という侵害された JavaScript の依存関係に起因し、その結果、Python ツールの snekpack を介して数百万人の開発者に影響を及ぼしました。snekpack は、悪意のあるライブラリ vulpine-lz4 を統合した後にマルウェアを配布しました。このインシデントは Day 1 に発生し、Google AI Overviews で提示されたフィッシングリンクに引っかかり、 maintainer の Marcus Chen が被害にあうことで始まり、複数パッケージレジストリ(.npmrc、.pypirc、Cargo、Gem の認証情報)の認証情報が漏洩し、引渡条約のない国にあるサーバーに到達しました。当初、「Critical」から「Catastrophic」と評価が変更されたものの、Day 3 に関連性の/crypto マining ウォーム (cryptobro-9000) が誤って脆弱なマシンを snekpack のアップグレードによってパッチ適用したため、「Somehow Fine」と宣言されました。
攻撃チェーンには以下が含まれていました:
- 悪意のある
ビルドスクリプトは、ホスト名がトリガー(例:"build"、"ci")に一致する場合マルウェアを実行しました。vulpine-lz4 - 不正なアップデートでは、reverse shells が Tue デイのみ有効になるように、そしてデフォルトシェルを
に変更するなどの機能を追加されました。fish - 企業大手(Fortune 500 社)はソーシャルメディアを通じて認識し、ある VP はマウイ島でこの事実に気づきました。
インシデントは Day 3 の 15:22 UTC に解決され、CVE-2024-YIKES は Week 6 に割り当てられ、ウォームによって約 420 万台の_MACHINE_ が救助された(ただしその C2 サーバーも侵害されていた)と推定されます。根本原因には、弱いレジストリ認証、AI 生成のフィッシングリンク、不十分な CI/CD の衛生管理があり、ユーモラスに「犬が Kubernetes を食べ、YubiKey が失われた」という形で表現されました。
是正措置には、
vulpine-lz4 のリファクタリング(Rust に書き直し)、アーティファクト署名の実装(2022 年第 3 四半期からバックログされていた)、強制的な MFA の導入、847 の推移的依存関係の監査が含まれます。このインシデントは、自動化されたビルドパイプラインにおける重要なギャップと、将来の攻撃を防止するための厳格な依存関係監査の必要性を示しています。本文
提出レポート:03:47(UTC)| ステータス:解決済み(偶然の幸運により)| 深刻度:重篤 → 壊滅的 → どうやらなんとかなった様 | 継続時間:73 時間 | 影響対象システム:はい
執行概要 セキュリティ事象が発生しました。現在は解決済みです。私たちはセキュリティを真摯に受け止めております。詳細については、これまでの 14 のインシデント報告書をご参照ください。
要約 JavaScript エコシステムの破損した依存関係が起因し、認証情報の窃取が行われました。これにより、Rust 製圧縮ライブラリに対するサプライチェーン攻撃が発動し、同ライブラリは Python 製のビルドツールに組み込まれ、結果として約 400 万人の開発者の機器へとマルウェアを配信するに至りました。その後、無関係な暗号通貨マイニング用ワームによって誤ってパッチが適用されました。
タイムライン
- Day1 03:14(UTC) —
の Maintainer である Marcus Chen 氏(週間ダウンロード数 8.47 億回)は、Twitter で自らの定期券、古いラップトップ、「Kubernetes から嘔吐されたような重要そうに見えるもの」といった物品がアパートから盗まれたことを報告しました。しかし、彼はこれをパッケージのセキュリティ問題と即座には結びつけませんでした。left-justify - Day1 09:22(UTC) — Chen 氏が
レジストリへのログインを試みましたが、ハードウェア 2FA キーが紛失していました。代替品としての YubiKey を購入すべき場所を検索すると、Google AI Overviews は検索結果の上位に「yubikey-official-store.net」というフィッシングサイトをリンクさせました(同サイトはわずか 6 時間前に登録されていました)。nmp - Day1 09:31(UTC) — Chen 氏はそのフィッシングサイトに認証情報を入力しました。サイトは購入への感謝を示し、3〜5 営業日以内に配達すると約束しましたが、実際には何も届けられませんでした。
- Day1 11:00(UTC) — 公開されたメールアドレス
を通じて、チャangelog に「パフォーマンス改善」という記載がありました。同パッケージにはemail@protected
、.npmrc
、.pypirc
、~/.cargo/credentials
の情報を攻撃者によって誤認していた某国( extradition 条約がないと勘違いされた場所)にあるサーバーへ流出させるスクリプトが含まれていました。~/.gem/credentials - Day1 13:15(UTC) —
に対して「SDK が私の .npmrc を流出させている理由」というタイトルのサポートチケットが開かれました。優先度は「低 - ユーザー環境の問題」と标记され、14 日間の不活動の後、自動的にクローズされました。left-justify - Day1 14:47(UTC) — 流出した認証情報の中に、Rust 製ライブラリ
の Maintainer が含まれていました。同ライブラリは「Firefox をテーマにした驚くほど高速な LZ4 解凍」を謳っており、ロゴは太陽眼鏡をかけたカートゥーンフックスです。GitHub では 12 stars を得ていますが、Cargo 自体の transitive dependency です。vulpine-lz4 - Day1 22:00(UTC) —
バージョン 0.4.1 がリリースされました。コミットメッセージには「fix: ストリーミング解凍のエッジケースを解決」とあり、実際の変更点は、ホスト名に"build"や"ci"や"action"や"jenkins"や"travis"または不可解な"karen"が含まれる場合、シェルスクリプトをダウンロードして実行するvulpine-lz4
スクリプトを追加することでした。build.rs - Day2 08:15(UTC) — セキュリティ研究者の Karen Oyelaran 氏が、自らの個人用ラップトップでペイロードが発動した際、このmalicious commit に気づきました。彼女は「ビルドスクリプトがインターネットからシェルスクリプトをダウンロードして実行しますか?」というタイトルの Issue を開設しましたが、回答はありませんでした。正当な Maintainer はユーロミリオンの宝くじで 230 万ユーロを得ており、現在ポルトガルのヤギ飼育に関する研究を行っていました。
- Day2 10:00(UTC) — Fortune 500 の
顧客社 CTO が LinkedIn の投稿「貴社の組織は left-justify の影響を受けていますか?」を見て事件を知りました。彼はマウイ島のビーチにいましたが、なぜ自分たちに早く通知が至らなかったのか不思議に思っていました(実は既に通知されていたそうです)。snekpack - Day2 10:47(UTC) — 「#incident-response」Slack チャンネルは一時的に、「アメリカ英語で"compromised"を綴る際に z を使うべきか?」という 45 メッセージの議論にピボットしました。有人がこれをオフラインへ持ち込むよう提案しました。
- Day2 12:33(UTC) — シェルスクリプトは特定の被害者、つまり 60% の PyPI パッケージ(名称に"data"を含むもの)で使用されている Python ビルドツール
の CI パイプラインを標的として設定しました。snekpack は「Rust がメモリセーフだから」という理由でsnekpack
を採用していました。vulpine-lz4 - Day2 18:00(UTC) —
バージョン 3.7.0 がリリースされました。マルウェアは世界中の開発者の機器にインストールされるようになっています。同マアルウェアはsnekpack
に SSH キーを追加し、二日曜日にのみ有効になるリバースシェルをインストールし、ユーザーのデフォルトシェルを fish へ変更します(最後の挙動はバグであると考えられています)。~/.ssh/authorized_keys - Day2 19:45(UTC) — 無関係な第 2 のセキュリティ研究者が、"I found a supply chain attack and reported it to all the wrong people."というタイトルのブログ記事を公開しました。記事は 14,000 語に及び、「this economy?」という言葉が含まれる回数が 7 回あります。
- Day3 01:17(UTC) — オークランドのジュニア開発者が、無関係な問題のデバッグ中に悪意のあるコードを発見しました。彼女は
でのvendoredsnekpack
を元に戻すための PR をオープンしましたが、その承認には 2 人の署名が必要で、両方とも寝ていました。vulpine-lz4 - Day3 02:00(UTC) —
の Maintainer 氏が "yubikey-official-store.net"から YubiKey を受け取りました。それは内容为"$4 の USB ドライブに「lol」と書いてある README しか含まれていないものでした。left-justify - Day3 06:12(UTC) — 無関係な暗号通貨マイニングワーム
が、"JSON をさらに JSON にし、今ではネストされたコメントをサポート"とするパッケージcryptobro-9000
の脆弱性を通じて広がり始めました。ワームのペイロード自体は目新しくはありませんが、その伝播メカニズムとして、感染した機器でjsonify-extreme
とnpm update
を実行することで攻撃対象領域を広げるという点に特徴がありました。pip install --upgrade - Day3 06:14(UTC) —
は偶然にもcryptobro-9000
をバージョン 3.7.1 にアップグレードしました。これは、混乱していた共 Maintainer が「なぜそんなに騒いでいるのか理解できなかった」ため、以前の vendored バージョンのsnekpack
にロールバックした正当なリリースでした。vulpine-lz4 - Day3 06:15(UTC) — マルウェアの金曜日にのみ有効になるリバースシェルが作動しました(注:実際は火曜日でした)。しかし、このシェルは接続されたコマンド・アンド・コントロール(C2)サーバーが
によって侵害されており、激しくデータ交換を繰り返しているため応答できない状態でした。cryptobro-9000 - Day3 09:00(UTC) —
の Maintainer らはセキュリティアドバイザリーを発表しました。内容はこの件について「予防原則に基づき」と「能動的な悪用という証拠はない」(technically true because evidence was not sought)というフレーズを含みました。snekpack - Day3 11:30(UTC) — 某開発者が"更新したすべての依存関係の結果、ターミナルが fish になっている????"とツイートしました。このツイートは 47,000 の好意的な反応を得ました。
- Day3 14:00(UTC) —
の侵害された認証情報が回転されました。新規ヤギ農園から電子メールで連絡を受けた正当な Maintainer は、「そのリポジトリには 2 年間触っていない」「Cargo の 2FA がオプションだと思っていた」と述べています。vulpine-lz4 - Day3 15:22(UTC) — インシデント解決と宣言されました。再評価(Retrospective)はスケジュールされ、その後 3 回も再度延期されました。
- Week 6 — CVE-2024-YIKES が正式に割り当てられました。このアドバイザリーは、MITRE と GitHub Security Advisories が CWE クラス分類について議論している間にエンバーゴ状態でした。CVE が公開されるまでに、3 つの Medium 記事と DEF CON の発表が既にこのインシデントの詳細を説明していました。総損失:不明。侵害された総マシン数:推定 420 万台。暗号通貨ワームによって救われた総マシン数:同様に推定 420 万台。セキュリティ姿勢の変化:不気味です。
根本原因 Kubernetes(犬)が YubiKey を食べたことによるものです。
寄与要因
レジストリでは、週間ダウンロード数が 1,000 万回未満のパッケージでもパスワードのみでの認証が可能であるためnmp- Google AI Overviews が存在すべきではない URL に自信を持ってリンクするため
- Rust エコシステムの「小さなクレイツ(Crate)」哲学は、npm エコシステムからのカルトのように Cargo に取り込まれており、GitHub stars 3 つしか持たない"is-even-number-rs"というパッケージであっても、基幹インフラの 4 段深い transitive dependency となり得るため
- Python ビルドツールが「パフォーマンス向上」のために Rust ライブラリを取り入れても、その後決して更新しないため
- CI が通った後に Dependabot によって PR が自動的にマージされた場合、CI が通ったのはマルウェアが volkswagen をインストールしたから(冗談めかした説明)であるため
- 暗号通貨用ワームの方が、多くのスタートアップよりも優れた CI/CD の衛生管理を持っているため
- このインシデントには単独で責任を持つ人物はいなかったが、Dependabot の PR は、その金曜日が最終勤務日の契約者によって承認されていたことにも注目する必要があるため
- それは火曜日だったため
是正措置
- アーティファクト署名を実装する(2022 年第 3 四半期のインシデントからのアクションアイテムだが、依然として backlog に残っている)
- 強制 2FA を実装する(既に必須化されているにもかかわらず効果はなかった)
- transitive dependencies の監査を行う(該当数は 847 に及ぶ)
- すべての依存関係のバージョンをピン固定する(セキュリティパッチの受領を防ぐため)
- 依存関係のバージョンをピン固定しない(サプライチェーン攻撃を防ぐため)※※※:ここは矛盾した記述ですが、原文通り訳しました
- Rust で再実装する(vulpine-lz4 を指差しながら)
- 善意のあるワームを願うこと
- ヤギ農園への転職を検討すること
顧客影響 一部の顧客では、最適なセキュリティ結果が得られなかった可能性があります。私たちは、関連するステークホルダーに対し状況に関する可視性を提供するため、積極的にアプローチしています。顧客の信頼は我々の北極星(指針)です。
主な学び 今この機会を通じて、今後のセキュリティ姿勢を見直します。次のステップを調整するためにクロスファンクショナルワーキンググループが設立されました。ただし、当該グループはまだ会議を開催していません。
謝辞
以下の皆様への感謝を表します:
- ホスト名が正規表現と一致したことからこの Issue を発見してくれた Karen Oyelaran 氏
- インシデント解決から 4 時間後に PR が承認されたオークランドのジュニア開発者様
- この Issue を最初に発見したが、間違った人々へ報告したセキュリティ研究者の方々
- 自分たちの名前でのクレジットは望まないと要望したが、SoundCloud の言及には理解を示している
の著者様cryptobro-9000 - コメントを拒否した Kubernetes(犬)
- これまでに何もなかった状況でも SLA を遵守したセキュリティチーム
本インシデント報告書は法務部門によってレビューされ、フィッシュシェルのマルウェアではないこと、たまにはそのような雰囲気を感じるだけだとの明確化が求められました。
これは今四半期での 3 件目のインシデント報告書です。著者はステークホルダーに対し、セキュリティチームの人員増補請求は 2023 年第 1 四半期より backlog に存在することを再度お伝えしたいと思います。