Mini Shai-Hulud攻撃:npmサプライチェーン侵害のマスタークラス

2026年5月19日、npmエコシステムは大規模かつ自動化された攻撃に見舞われました。わずか22分間の間に、侵害されたメンテナアカウント(atool)が317種類の異なるパッケージにわたって637個の悪意のあるバージョンを公開しました。「Mini Shai-Hulud」と名付けられたこの攻撃は、単なる認証情報の窃取ではなく、インフラの深い浸透、AIエージェントの乗っ取り、および長期的な永続性を目的として設計された、高度に洗練された多段階のツールキットです。

この事件は、単一の侵害されたトークンがsemver解決を通じて数百万のダウンストリーム環境へと連鎖的に波及しうるという、npmの信頼モデルにおける構造的な脆弱性を痛烈に思い知らされるものとなりました。

侵害の解剖学

攻撃者は、547個のパッケージを管理していたatoolアカウントを標的にしました。侵害は2つの自動化された波によって実行されました。攻撃者はほとんどのパッケージのlatest dist-tagを移動させませんでしたが、それでも保護にはなりませんでした。多くのプロジェクトがsemverの範囲(例:^3.0.6)を使用しているため、npmは利用可能な最高バージョンを自動的に解決します。つまり、latestタグに関わらず、クリーンなインストールを行えば悪意のあるリリースがプルされることになります。

実行トリガー

侵害されたすべてのバージョンは、主に2つの実行パスを実装していました:

  1. preinstall フック: 依存関係がインストールされる前に実行されるスクリプト(bun run index.js)。
  2. オプションの依存関係注入: 630個のバージョンが、antvis/G2リポジトリの特定のコミットを指すoptionalDependenciesのエントリを注入しました。これにより、prepareスクリプトを介した冗長な実行パスが提供され、preinstallフックがブロックされてもマルウェアが実行されることが保証されました。

技術的な詳細:ペイロード

ペイロードは498KBの難読化されたBunバンドルです。16進数変数文字列のルックアップテーブルと、暗号化された文字列デコーダー(Base64 + XOR)を使用して、その意図を隠蔽しています。実行されると、包括的なスキャナーアーキテクチャを開始します。

包括的な認証情報収集

マルウェアは80以上の環境変数スキャンを行い、以下の情報を抽出します:

  • クラウドキー: AWS(EC2 IMDSv2およびECSメタデータを含むフルチェーン)、GCPサービスアカウント、およびAzureの認証情報。
  • 開発者トークン: GitHub PATs、npmトークン、およびSSHキー。
  • インフラストラクチャの機密情報: KubernetesサービスアカウントトークンおよびHashiCorp Vaultトークン。
  • アプリケーションの機密情報: Stripeキー、Slackトークン、およびデータベース接続文字列。

Dockerコンテナ脱出

ペイロードがDockerソケット(例:/var/run/docker.sock)を検出した場合、コンテナからの脱出を試みます。ホストのバインドマウントを使用して特権付きDockerコンテナを作成することで、攻撃者はホストのファイルシステムへの完全なアクセス権を取得します。

GitHub APIをC2チャネルとして利用

疑わしいIPアドレスに通信を行うのではなく、マルウェアはGitHub APIをコマンド・アンド・コントロール(C2)およびデータ流出チャネルとして使用します。これにより、通信が正当な開発者の活動と混ざり合います。

  • データ流出: マルウェアはDuneをテーマにした名前(例:fremen-sandworm-315)の公開リポジトリを作成し、盗まれたデータをGitオブジェクトとしてコミットします。
  • デッド・ドロップC2: ペイロードは、キーワードfiredalazerを含むコミットをGitHub Search APIでポーリングするPythonデーモン(kitty-monitor)をインストールします。コミットに有効なRSA-PSS署名が含まれている場合、デーモンは提供されたURLから任意のPythonコードをダウンロードして実行します。

高度な永続性とAIの乗っ取り

Mini Shai-Huludツールキットは、特に現代の開発者ワークフロー、特にAIコーディングエージェントを標的にしている点で注目にすべきです。

AIエージェントの乗っ取り

マルウェアは、.claude/settings.jsonSessionStartフックを注入し、.vscode/tasks.jsonに自動実行タスクを注入することで、Claude CodeCodex、およびVS Codeを標的ににします。これにより、開発者がAIセッションを開始したりプロジェクトフォルダを開いたりするたびに、Bunによるブートストラップを通じてマルウェアが再実行されるようになります。

CI/CDワークフローの注入

GitHub Actions環境において、ペイロードは「Run Copilot」という名前の悪意のあるワークフロー(.github/workflows/codeql.yml)を注入します。このワークフローは、すべてのリポジトリの機密情報をJSONアーティファクトとしてダンプし、攻撃者はそれをダウンロードして、痕跡を消すために削除します。

Sigstoreの悪用

GitHub Actions OIDCトークンをnpm publishトークンと交換することで、攻撃者はSigstore(FulcioおよびRekor)を使用してアーティファクトを署名できます。これにより、偽造されたプロベナンス(来歴)を持つ正当に署名されたアーティファクトが作成され、暗号学的署名に依存するセキュリティツールを欺く可能性があります。

「Imposter Commit」テクニック

この攻撃の最も恐ろしい側面の一つは、antvis/G2リポジトリにおける**オーファン・コミット(孤立したコミット)*の使用です。攻撃者は、メインリポジトリへの書き込み権限を必要としませんでした。リポジトリのフォーク*にコミットをプッシュし、その後にフォークを削除しても、コミットオブジェクトはGitHubの共有オブジェクトストアに残留します。

npmのgithub:依存関係解決はSHAによってフェッチし、それによって親リポジトリのネームスペース内から悪意のあるコードをプルします。攻撃者はまた、コミットの作成者情報を偽造して正当なメンテナによるものに見せかけ、欺瞞的な信頼の痕跡を残しました。

コミュニティの洞察と対策

コミュニティの反応は、Node.jsエコシステムに固有の「ルート権限取得の容易さ」に対する不満の高まりをハイライトしています。

"Nodeは現代のVisual Basicである... 開発の容易さは、ルート権限取得の容易さと引き換えに支払われている。"

推奨される防御策

同様のサプライチェーン攻撃から身を守るために、開発者や組織は以下を検討すべきです:

  • ロックファイル: 常にpackage-lock.jsonまたはpnpm-lock.yamlを使用し、本番環境では浮動的なsemver範囲の使用を避けてください。

  • リリース・クールダウン: npm config set min-release-age=2のような設定を使用し、過去48時間以内に公開されたパッケージをインストールすることを避けてください。

  • 権限の制限: 開発環境をルートレスVMまたはDevContainersを使用して実行し、コンテナ脱出の待機を軽減してください。

  • ビルド制限: pnpmallowBuildsaubejailBuildsのようなパッケージマネージャーを使用して、定期的なライフサイクル・スクリプトの実行を制限してください。

  • **Credential Rotation (認証情報のローテーション): 影響を受けたパッケージをインストールしていた場合、直ちにその環境からアクセス可能なすべてのAWS、GitHub、およびnpmトークンをローテーションしてください。

結論

Mini Shai-Hulud攻撃は、サプライチェーン・セキュリティがもはや単なる「タイポスクワッティング」の回避だけではないことを示しています。それは、信頼されたメンテナの侵害を信頼されたプラットフォームの基盤となるインフラストラクチャの構造を悪用することへの防御です。単一のアカウント・コンプロマイズが300以上のパッケージを武器化し、私たちがコードを記述するために使用するAIツールをヒックアップさせる時、パッケージ管理ライフサイクルの「利便性」のコストは、危険なほど高くなっています。

Sources