PR

Shai-Hulud 2.0のNPM攻撃で最大40万件の秘密情報流出

Security

Source:https://www.bleepingcomputer.com/news/security/shai-hulud-20-npm-malware-attack-exposed-up-to-400-000-dev-secrets/

🛡 概要

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/署名/プロヴナンス)導入ガイド」の順で読み進めることを推奨します。