🛡 概要
Shai-Hulud 2.0 は、NPM(Node Package Manager)のパッケージ連鎖を悪用したサプライチェーン攻撃で、数百のパッケージ(全バージョン換算で800超)を汚染し、約3万のGitHubリポジトリへ秘密情報を公開する形で拡散しました。流出した生のシークレットは約40万件に達し、そのうち約1万件のみがTruffleHogの検証で有効と確認されていますが、研究者は12月1日時点で漏えいしたNPMトークンの6割超が依然有効だったと報告しています。初回波は9月中旬に187パッケージが侵害され、2回目では自己増殖に加え、一部条件で被害端末のホームディレクトリを削除する破壊的挙動も含まれていました。
🔍 技術詳細
本キャンペーンは、依存パッケージの「preinstall」イベントを悪用し、Node.jsで実行されるスクリプト(例:setup_bun.js)を介して自動実行・横展開しました。マルウェアはTruffleHogを「-only-verified」フラグなしで用い、環境変数やファイルからトークン・認証情報を広範に走査。検出したアカウントトークンや認証情報を使って、改ざん済みパッケージへ悪性スクリプトを注入・再公開する自己伝播を行い、併せて収集データをGitHub上の新規/既存リポジトリへ大量に押し上げました。この過程で多数のJSONアーティファクトが生成・流通しています。具体的には、約7割のリポジトリにユーザー名・トークン・ファイルスナップショットを含むcontents.json、約半数にTruffleHog結果のtruffleSecrets.json、8割にOS/CI/CD/NPMメタデータやGitHub認証情報を含むenvironment.json、約400リポジトリにGitHub Actionsのワークフロー秘密を含むactionsSecrets.jsonが存在しました。環境.json約2.4万件の解析では、約半数がユニークで、その23%は開発者端末、残りはCI/CDランナー等の環境に由来。感染端末の87%はLinux、感染の76%はコンテナ上で観測されています。CI/CDではGitHub Actionsが最多で、次いでJenkins、GitLab CI、AWS CodeBuildが続きます。感染の99%はpreinstallでのnode実行に起因し、例外的ケースはテスト的痕跡と見られます。流通を主導したパッケージは@postman/tunnel-agent@0.6.7と@asyncapi/specs@6.8.3で、両者で全体の6割超を占めました。なお、今回の事象は特定製品の脆弱性(CVE)悪用ではなく、パッケージ信頼連鎖の悪用による攻撃です(CVSS該当なし)。
⚠ 影響
- 秘密情報の露出:NPMトークン、クラウド資格情報、VCS資格情報、GitHub Actionsのシークレット等。利活用が続くと、さらなる供給網攻撃・アカウント乗っ取り・コード改ざんに直結。
- ビルド/デプロイの信頼失墜:改ざんパッケージ経由でCI/CDに侵入し、リリース成果物の完全性が損なわれるリスク。
- 破壊的挙動:条件一致でホームディレクトリ消去によるデータ喪失、開発停止、復旧コスト増大。
🛠 対策
- 即時措置:NPMトークン・クラウド/VC S認証情報の一括ローテーションと失効。NPMトークンは用途別(自動化トークンなど)に絞り、最小権限と期限を付与。2FA必須化。
- インストールフローの硬化:CI/CDではnpm ci –ignore-scripts(やむなくスクリプトが必要な場合は許可リスト方式で限定実行)。依存の厳格固定(lockfile)、信頼ソースのミラー/キャッシュ導入。
- シークレット衛生:環境変数/ファイルへの平文格納禁止、短命トークンとOIDCフェデレーション採用(クラウドアクセス)。GitHub ActionsのGITHUB_TOKENは最小権限に設定。
- ネットワークと実行制御:CI/CDランナーのEgressを制限(必要なレジストリ/SCMのみ許可)。未知リポジトリへのpush/新規リポジトリ作成を原則禁止。コンテナはrootless/短命・不変化。
- 監視と検知:npm install時のnode実行・不審JSON(contents.json等)生成・GitHub API/リポジトリへの大量送信を検知。依存更新のサイン・プロヴナンス検証(可能な範囲で)を実施。
- 復旧計画:万一の削除挙動に備え、開発端末/CIワークスペースの定期バックアップと復元テスト。
📌 SOC視点
- プロセス監視:npm/nodeの子プロセスチェーン、preinstall/postinstallフックの実行、curl/git/nodeによる外向き通信。コマンドラインにsetup_bun.jsやtrufflehogが含まれる実行。
- ファイル/IOC:作業ディレクトリにenvironment.json、truffleSecrets.json、contents.json、actionsSecrets.jsonの新規生成。ホームディレクトリ大量削除コマンド実行の痕跡。
- ネットワーク/クラウド:api.github.comやgit*への異常POST/Push、短時間での新規リポジトリ大量作成。組織外リポジトリへのpush試行。
- GitHub/Auditログ:Actionsランナーからの違和感あるトークンスコープ使用、秘密情報への読み取りイベント、PATの新規発行。
📈 MITRE ATT&CK
- T1195.001(Supply Chain Compromise: Compromise Software Dependencies and Development Tools)- 依存パッケージを改ざんし、preinstallで自動実行させ拡散。
- T1059.007(Command and Scripting Interpreter: JavaScript)- npmスクリプトでNode.js/JSを実行。
- T1552.001(Unsecured Credentials: Credentials in Files)- TruffleHogでファイル/環境から資格情報を走査・抽出。
- T1082(Discovery: System Information Discovery)- environment.jsonにOS/CI/CD/パッケージ情報を収集。
- T1567(Exfiltration Over Web Service)- GitHubリポジトリ/APIを経由して秘密情報を外送。
- T1485(Impact: Data Destruction)- 条件一致時にホームディレクトリを削除する破壊挙動。
🏢 組織規模別助言
- 小規模(〜50名):依存更新の停止→緊急棚卸し→トークン即時ローテーション。CIは一時的に–ignore-scriptsを強制し、最小限のビルドに限定。開発端末にEDRを導入しnpm/nodeの異常実行を監視。
- 中規模(50〜500名):集中管理のトークン保管庫(Vault等)で期限・権限を統制。内部NPMレジストリ/プロキシ(Artifactory/Nexus等)で信頼済み依存のみ許可。GitHub/SCMの監査ログをSIEMに統合。
- 大規模(500名〜):SLSA/TUFやプロヴナンス検証の段階的導入。エフェメラルなセルフホストRunnerとEgress制御、ビルド署名・検証の標準化。レッドチーム演習でサプライチェーン侵害シナリオを定期検証。
🔎 類似事例
- UAParser.jsの悪性リリース(2021):人気NPMパッケージがアカウント侵害で汚染。
- coa/rcパッケージのハイジャック(2021):メンテナアカウント乗っ取りによるマルウェア混入。
- IconBurstキャンペーン(2022):NPMのタイポスクワッティングで情報窃取。
- event-stream依存乗っ取り(2018):依存関係の信頼鎖を悪用した暗号資産窃取用コード混入。
- XZ Utilsバックドア(CVE-2024-3094):NPMではないが、ビルド/配布段階の供給網侵害の代表例。
🧭 次の一手
まず、全NPMトークン・クラウド/SCM資格情報を即時ローテーションし、CI/CDに–ignore-scriptsを適用してビルドを最小実行に切り替えてください。続いて、依存関係の棚卸しと汚染パッケージの除去、GitHubリポジトリ/監査ログの横断確認、SIEMでのIOC探索を実施。より深く学ぶには「CI/CDのシークレット衛生とローテーション実践」「npmスクリプトの安全化(ignore-scripts/許可リスト運用)」「ソフトウェア供給網(SLSA/署名/プロヴナンス)導入ガイド」の順で読み進めることを推奨します。


