T-CREATOR

npmの事故伝播ワーム「Shai-Hulud」徹底解説:被害範囲・仕組み・今すぐ取るべき対策

npmの事故伝播ワーム「Shai-Hulud」徹底解説:被害範囲・仕組み・今すぐ取るべき対策

Shai-Huludはnpmパッケージに仕込まれた自己増殖型のワームで、インストール時にトークンやクラウド鍵を盗み、GitHub Actionsへ悪性ワークフローを仕掛けて次のパッケージへ伝播する問題が報告されています。

9月15〜16日を起点に100〜200超のパッケージで不正版が観測され、@ctrl/tinycolorやngx-bootstrap、CrowdStrike関連パッケージなどへ波及した事例が報告されました。対象数や詳細は日々更新されており、影響はCI環境や開発端末にも及びます。

本記事は、まず直ちに実施すべき初動を示し、次に感染判定と復旧、最後に中長期の再発防止設計を提示します。読者の不安を最小化しながら、現実的に実行できる順序で整理しますね。

現状把握の要点

報告によれば、攻撃はpostinstallで起動するbundle.js等のスクリプトを用い、TruffleHogなどのツールで環境変数や各種トークンを収集し、攻撃者管理のGitHubリポジトリ(Shai-Hulud)やWebhookへ送信します。続いて流出トークンで被害者が管理する他のnpmパッケージへ改変版を公開し、悪性のGitHub Actionsを仕込み、自己増殖的に広がる振る舞いが確認されています。

影響規模は報道・各社調査で幅があり、発覚初期の100超から、200以上、さらには数百パッケージに達したとする見立てもあります。時点により数値が異なるため、最新の脅威インテリジェンスを併読してください。

緊急初動チェックリスト(優先度順)

次の表は「被害の拡大を止める」「認証情報の差し替えをやり切る」ことに集中します。迷ったら上から順に実施してください。

#アクション目的/ポイント
1CIの外部公開ジョブ・自動publishを一時停止悪性ワークフローや外部送信の封じ込め
2npmトークンの列挙と即時失効(npm token listnpm token revoke <id>流出済みトークン悪用の遮断。CIDR/期限/権限で再発行を徹底
3GitHub PAT/環境変数/クラウド鍵の全面ローテーションOIDCへの移行方針を同時決定
4端末・ビルドサーバの隔離スキャンpostinstall実行により端末も信頼喪失の前提
5依存とロックファイルの固定・--ignore-scriptsインストールスクリプト実行抑止と再汚染防止
6影響版のインストール有無を全リポジトリ横断で確認該当期間のビルドログ/lockを証跡化

npmのトークン失効は公式手順に従い、CLIでの列挙・失効とWeb管理を併用してください。CIDR制限・権限最小化・有効期限設定を必ず入れます。

感染判定の指標(IoCと痕跡)

Shai-Huludの活動痕跡は以下が代表的です。ひとつでも見つかれば、関連資産すべてを侵害前提で扱ってください。

  • package.jsonに不審なpostinstallbundle.js呼び出し、curlpowershell等の外部送信。
  • リポジトリに見慣れない.github​/​workflows​/​shai-hulud*.yml等の追加や改変。ログに外部Webhook送信の痕跡。
  • アカウント配下に「Shai-Hulud Repository」「◯◯-migration」といった説明・命名のGitHub公開リポジトリが新規作成。中身はdata.jsonのみ。
  • 影響例が報告されたパッケージ(例:@ctrl​/​tinycolor@4.1.1​/​4.1.2ngx-bootstrapの特定バージョンなど)の導入履歴。

調査コマンド集(横断検索)

以下はYarn利用前提の横断確認例です。CIでもローカルでも実行できます。

bash# lock/manifest内のpostinstall/bundle.js/TruffleHog/ウェブフックを横断探索
rg -n --hidden -S "postinstall|bundle\\.js|trufflehog|webhook" .

# 影響が噂されたパッケージの混入確認
yarn list --pattern "@ctrl/tinycolor|ngx-bootstrap|ng2-file-upload" 2>/dev/null

# 期間指定で該当コミット・ワークフロー追加を洗い出し(例:9/15以降)
git log --since="2025-09-15" -- .github/workflows
gh api repos/:owner/:repo/actions/workflows --jq '.workflows[].name' | rg -n "hulud|exfil|webhook"

# GitHubで怪しい公開リポジトリ命名を探索(権限に応じて)
gh repo list <org> --visibility public --json name,description | jq -r '.[] | select(.description|test("Shai-Hulud|Migration";"i"))'

具体的な封じ込めと復旧

まず、影響可能な全秘密情報をローテーションした上で、クリーン環境から再デプロイします。ビルドキャッシュやNodeモジュールは信用しません。SnykやJFrog、Unit42などが示す被害バージョンやタイムラインも突き合わせ、該当期間のビルドを優先的に再生成してください。

  • npm:npm token listnpm token revoke <id>で即時失効。必要最小限の権限で再発行し、CIDR・期限・対象パッケージを絞ります。
  • GitHub:PAT・環境変数・組織シークレットを全更新。可能なら**OIDC(Trusted Publishing)**へ移行し、長期保存トークンを排除します。
  • 端末/ランナー:EDRでスキャン後、証跡保全してから再プロビジョニングを検討します。postinstall実行端末は安全とは言い切れません。

Yarn環境での安全なインストール運用

Yarnを使う前提で、スクリプト実行抑止を標準化します。

#設定/運用具体例
1CIのyarn installは原則--ignore-scriptsyarn install --ignore-scripts(Classic系で有効)
2Yarn Berryは.yarnrc.ymlenableScripts: falseも検討一部バージョンで挙動差の報告あり。CIではフラグ優先で回避策を併用
3バージョン固定とCorepack活用corepack enable && corepack use yarn@<version>

--ignore-scriptsはClassic系で公式ドキュメントに明記されています。Berry系では設定名がenableScriptsに変わり、環境変数YARN_ENABLE_SCRIPTS=falseも知られていますが、バージョンによって挙動差の報告があるため、CIジョブではフラグ・設定・環境変数を組み合わせた「多層抑止」を推奨します。

依存関係の影響調査と除外

Snykのまとめによれば、ngx-bootstrapの特定バージョン群や@ctrl​/​tinycolorに不正版が一時公開されました。ロックファイルに該当があれば、そのビルドは侵害前提で扱い、クリーン環境で再構築してください。

bash# lockファイルに影響バージョンが残っていないかを検索
rg -n "(^|@)ngx-bootstrap@20\\.0\\.(4|5|6)|ngx-bootstrap@19\\.0\\.3|ngx-bootstrap@18\\.1\\.4|@ctrl/tinycolor@4\\.1\\.(1|2)" yarn.lock pnpm-lock.yaml package-lock.json

中長期の再発防止設計(実務編)

表に「攻撃面の縮小」「伝播阻止」「誤配布防止」の観点でまとめます。情シス/開発/セキュリティで共有してください。

#テーマ具体策
1トークン衛生Granular/Read-onlyトークンを基本に、スコープ・パッケージ・期限・CIDRを厳格化。発行・棚卸・失効を定例化
2Trusted Publishing/OIDCnpmのTrusted Publishingで公開時にトークン不要へ。クラウド認証もOIDC化し短期クレデンシャル運用へ移行
3スクリプト実行の既定OFFCIのyarn install --ignore-scriptsを標準。例外は審査・Allowlist運用
4監査とSBOM依存の可視化とゼロデイレポート(Snyk/JFrog/Unit42等)を定期トリアージ。異常なpostinstall検知をルール化
5GitHub Actions硬化権限read-all既定化、外部Actionのピン止め(SHA固定)、セルフホストランナーの送信先制限
6変更監視.github​/​workflows追加や公開設定変更を保護ブランチ化。検知時に自動ブロック
7供給側対策2FA必須、組織権限の最小化、依存のリリース検証パイプラインを別アカウントで実施

トークンのCIDR制限・権限最小化・有効期限はnpm公式がサポートしており、Trusted Publishing(GitHub OIDC)による「発行時トークン撤廃」は強力です。GitHub Actionsのハードニングガイドも併せて導入ください。

事例と最新動向の把握

発覚初期は187件規模の報告が見られ、その後200件超や数百件まで拡大したとする観測もあります。CrowdStrike関連や人気パッケージの巻き込みが話題となりました。時系列・影響パッケージは継続更新されているため、最新の調査記事を定点観測してください。

まとめ

Shai-Huludは、自己増殖秘密情報奪取CI侵害を組み合わせたnpm由来のサプライチェーン攻撃です。いま最重要なのはトークン失効とスクリプト抑止で拡散を止めることです。次に、OIDC/Trusted Publishingや権限最小化で「侵害されても増幅しない設計」に移行します。被害の見積もりは更新が続くため、公式アドバイザリと主要ベンダーの調査を継続監視しながら、運用ルールまで反映させてください。

関連リンク(公式・参考)