世界を動かす技術を、日本語で。

インシデントレポート: CVE-2024-YIKES

概要

  • JavaScript依存パッケージの侵害から始まった サプライチェーン攻撃 の詳細なインシデント報告
  • RustPython のビルドツールにマルウェアが拡散し、約420万台が影響を受ける
  • 偶発的に 暗号通貨マイニングワーム が問題を修正
  • 根本原因は YubiKeyの盗難 と認証の甘さ
  • 対応策・学び・今後の課題を包括的に記載

セキュリティインシデント概要

  • JavaScriptエコシステムの依存パッケージ侵害 により、認証情報の窃取が発生
  • 盗まれた認証情報で Rust製圧縮ライブラリ(vulpine-lz4) が改ざんされる
  • 改ざんされたRustライブラリが Pythonビルドツール(snekpack) に組み込まれる
  • snekpack経由で 全世界の開発者約420万台 にマルウェアが配布
  • 偶然に cryptobro-9000 (暗号通貨マイニングワーム)がsnekpackをアップグレードし、マルウェアを除去

インシデントの時系列

  • Day 1

    • 03:14 UTC:left-justifyメンテナーMarcus Chenが自宅で盗難被害
    • 09:22 UTC:nmpレジストリにログインしようとするも2FAキー紛失
    • 09:31 UTC:フィッシングサイトでnmp認証情報を入力
    • 11:00 UTC:left-justifyにマルウェア含むバージョンが公開
    • 13:15 UTC:マルウェア疑惑のサポートチケットが低優先で自動クローズ
    • 14:47 UTC:vulpine-lz4メンテナーの認証情報が流出
    • 22:00 UTC:vulpine-lz4に悪意あるbuild.rs追加
  • Day 2

    • 08:15 UTC:Karen Oyelaran氏がマルウェアを発見しIssue作成
    • 10:00 UTC:大手顧客のVPがLinkedInで事件を知る
    • 10:47 UTC:Slackで「compromised」のスペル論争
    • 12:33 UTC:snekpackのCIパイプラインが標的に
    • 18:00 UTC:snekpack 3.7.0リリース、マルウェア拡散開始
    • 19:45 UTC:別の研究者が長文ブログで報告
  • Day 3

    • 01:17 UTC:オークランドのジュニア開発者がPRで修正提案
    • 02:00 UTC:偽YubiKey到着、中身はUSBとREADME
    • 06:12 UTC:cryptobro-9000が拡散開始、npm/pipアップデートを強制
    • 06:14 UTC:snekpackが3.7.1にアップグレードされマルウェア除去
    • 06:15 UTC:マルウェアのリバースシェルが火曜に作動するもC2サーバが機能不全
    • 09:00 UTC:snekpackアドバイザリ発行、「証拠が見つかっていない」と記載
    • 11:30 UTC:開発者が「ターミナルがfishになった」とツイート
    • 14:00 UTC:vulpine-lz4の認証情報ローテーション、メンテナーは不在
    • 15:22 UTC:インシデント解決宣言、振り返り会議は三度延期
  • Week 6

    • CVE-2024-YIKES割り当て、公開は遅延
    • メディア・カンファレンスで既に詳細が拡散

根本原因・要因

  • Kubernetesという名の犬 がYubiKeyを食べた
  • nmpレジストリが パスワード認証のみ を許容
  • Google AI Overview がフィッシングサイトを上位表示
  • Rustの「小さなクレート」文化による依存深度の増加
  • PythonビルドツールがRustライブラリを 放置してベンダリング
  • Dependabot がCIパスで自動マージ、CI自体がマルウェアでバイパス
  • 暗号通貨ワームの方がCI/CD運用が優れているという皮肉
  • 最終承認者が外部委託者、かつ火曜日

対応策・今後の課題

  • アーティファクト署名の導入 (未実施の宿題)
  • 2FAの義務化 (既に必須だが機能せず)
  • 依存関係の監査 (847個存在)
  • バージョン固定 はセキュリティパッチ受信を妨げるジレンマ
  • Rustへの全面移行 の皮肉
  • 善意のワーム に期待
  • ヤギ農場 への転職検討

顧客影響・信頼

  • 一部顧客で セキュリティリスク 発生
  • 積極的な情報開示 と顧客信頼の維持を最優先

学び・教訓

  • セキュリティ体制の再点検 を開始
  • クロスファンクショナルワーキンググループ 設立(未開催)

謝辞・その他

  • Karen Oyelaran氏、オークランドの開発者、各セキュリティ研究者へ感謝
  • cryptobro-9000作者はSoundCloudの宣伝を希望
  • Kubernetes(犬) はコメント拒否
  • fish shellはマルウェアではない と法務部から明記要請
  • セキュリティチームの 人員増強要望 は依然バックログ中

Hackerたちの意見

サプライチェーンの問題は本当に厄介だし、もっと良くする必要があるよね。個人的には、Rustの基盤がいくつかのコアクレートをサポートして、メインのRust言語と同じ監査手続きを受けさせるのがいいと思う。それでプロジェクトに資金を提供して、サプライチェーンの脆弱性を減らすべきだと思う。クレートやnpmを排除するのが正しい答えだとは思わないよ。クレートやnpmは多くの開発者にとってありがたい存在だからね。

CratesもRust Secを取り入れる努力をしてるけど、上記に加えて、コミュニティには小さな依存関係をたくさん持つのではなく、Tokioのようにいくつかの大きなものに絞ってほしいな。

でも、npmとnmpの両方が本当に必要なの?

いや、NPMは削除しちゃおう。あれから良いことなんて出てこないし。

高価値のクレートを標準ライブラリに移すのはどう?

正直、これが blessed.rs の最終目標だと思ってた。

crates.ioで人気のクレートの多くは、すでにRust組織が提供している公式のクレートなんだよね。Rustのクレートグラフについて悩んでる人たちがこれを見落とすことが多い。crates.ioのトップページで最もダウンロードされたクレートのトップ10を見てみると、Rust組織かRustのコアメンテイナー以外のものはbase64クレートだけだよ。

これは最近読んだ中で、実際にはSCPじゃないけど、最もSCPっぽい内容だね。

ああ、そうそう、めっちゃ珍しい:サプライチェーン問題(SCP)

混乱してる人のために言うと、これはサプライチェーンの問題についての(個人的にはすごく良い)フィクションだよ。最初にざっと読んだときは本物かと思ってすごく心配になったけど、だからこそもっと注意深く読んじゃった :)

'nmp'

最初は全然わからなかった、正直言って。こんな雰囲気だったよね。https://github.com/bitcoin/bips/blob/master/bip-0042.mediawi...

後から振り返ると、問題も解決策も明らかに見えるから、シニカルになりがちだよね。でも長い間(今もかもしれないけど)、ハッカーの信条は「速く動いて物を壊す」だったんだ。npmのようなサプライチェーンシステムの明らかな問題を修正するために多くの勢いがあるのは素晴らしいけど、エージェント的な開発によって新たなセキュリティ関連の問題の時代に突入しているのが心配だよ。MythosやGlasswingがほぼすべてに触れて脆弱性を表面化させることだけじゃなくて、ソフトウェアの開発方法や依存関係の取り込み方、複雑なシステムの人間の思考モデルが失われる可能性があることが、ハッキングされたソフトウェアやインフラにつながると思う。数年後に今日を振り返って、どうしてこんなにナイーブだったのか、AI開発の長期的な計画を立てることができなかったのかと考えないことを願ってる。AIを使って複雑なシステムを再構築しようとするだけじゃ解決にならないのにね。でも、この記事は面白かったよ。

でも長い間(今もかもしれないけど)、ハッカーの信条は「速く動いて物を壊せ」だったよね。そうだったっけ? ザッカーバーグがこのひどいフレーズを作ったと思ってた。

left-justify のメンテナーは、yubikey-official-store.net から YubiKey を受け取る。中には「lol」と書かれた README が入った4ドルのUSBドライブが。マジで笑ったわ… ほんとにトロールだね。

それはいいね。フィッシングサイトからUSBデバイスを接続すること自体が、別の攻撃ベクトルになるっていうのが面白い。

npm や pip を使わないから良かったわ、ただ推奨された curl ... | bash だけ。

curl | sudo bash だよ。素人だな。

Day 1, 14:47 UTC — 流出した認証情報の中には、Rust ライブラリ「blazingly fast Firefox-themed LZ4 decompression」のメンテナーである vulpine-lz4 が含まれてる。このライブラリのロゴはサングラスをかけた漫画のキツネ。GitHub では12個の星がついてるけど、cargo 自体の遷移依存関係なんだ。ちょっと興味が湧いて、cargo ビルドに関わるために妥協すべきクレートの不完全なリストを作ってみた。すでに build.rs があるから目立たないと思うよ:flate2 tar curl-sys libgit2-sys openssl-sys libsqlite3-sys blake3 libz-sys zstd-sys cc ちなみに、xz2 の権利を得れば rustup を妥協できるよ。ちなみに、少なくとも Cargo.lock は追跡してるみたい。

これが本物として通用するってことは、今の状況を物語ってるよね。

“左寄せ”にはほとんど反応しなかったよ、ただ目を転がして「またかよ‽」って思っただけ。

カレンのやつ、めっちゃ笑ったわ :D ;) 昔、クラスメイトのプロジェクトをレビューしてたときに、makeを使ったビルドスクリプトをもらったことを思い出した。ホスト名にbpavukが含まれてたら、ホームフォルダをrm -rfしようとしてたんだよ。それが中学1年生のときの話!!

パングラムによると、これ多分AI生成だよね。誰も指摘してないのが驚き。

ありえないね。あまりにも面白いし、書き方も上手いし、ウィットに富んでるのに簡潔。これがLLM生成だなんて全く思えないし、LLMにはできないことがたくさん含まれてる。もし間違ってたら、入力を見てみたいな。