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以上、さらには数百パッケージに達したとする見立てもあります。時点により数値が異なるため、最新の脅威インテリジェンスを併読してください。
緊急初動チェックリスト(優先度順)
次の表は「被害の拡大を止める」「認証情報の差し替えをやり切る」ことに集中します。迷ったら上から順に実施してください。
| # | アクション | 目的/ポイント |
|---|---|---|
| 1 | CIの外部公開ジョブ・自動publishを一時停止 | 悪性ワークフローや外部送信の封じ込め |
| 2 | npmトークンの列挙と即時失効(npm token list→npm token revoke <id>) | 流出済みトークン悪用の遮断。CIDR/期限/権限で再発行を徹底 |
| 3 | GitHub PAT/環境変数/クラウド鍵の全面ローテーション | OIDCへの移行方針を同時決定 |
| 4 | 端末・ビルドサーバの隔離スキャン | postinstall実行により端末も信頼喪失の前提 |
| 5 | 依存とロックファイルの固定・--ignore-scriptsインストール | スクリプト実行抑止と再汚染防止 |
| 6 | 影響版のインストール有無を全リポジトリ横断で確認 | 該当期間のビルドログ/lockを証跡化 |
npmのトークン失効は公式手順に従い、CLIでの列挙・失効とWeb管理を併用してください。CIDR制限・権限最小化・有効期限設定を必ず入れます。
感染判定の指標(IoCと痕跡)
Shai-Huludの活動痕跡は以下が代表的です。ひとつでも見つかれば、関連資産すべてを侵害前提で扱ってください。
package.jsonに不審なpostinstall、bundle.js呼び出し、curlやpowershell等の外部送信。- リポジトリに見慣れない
.github/workflows/shai-hulud*.yml等の追加や改変。ログに外部Webhook送信の痕跡。 - アカウント配下に「Shai-Hulud Repository」「◯◯-migration」といった説明・命名のGitHub公開リポジトリが新規作成。中身は
data.jsonのみ。 - 影響例が報告されたパッケージ(例:
@ctrl/tinycolor@4.1.1/4.1.2、ngx-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 list→npm token revoke <id>で即時失効。必要最小限の権限で再発行し、CIDR・期限・対象パッケージを絞ります。 - GitHub:PAT・環境変数・組織シークレットを全更新。可能なら**OIDC(Trusted Publishing)**へ移行し、長期保存トークンを排除します。
- 端末/ランナー:EDRでスキャン後、証跡保全してから再プロビジョニングを検討します。postinstall実行端末は安全とは言い切れません。
Yarn環境での安全なインストール運用
Yarnを使う前提で、スクリプト実行抑止を標準化します。
| # | 設定/運用 | 具体例 |
|---|---|---|
| 1 | CIのyarn installは原則--ignore-scripts | yarn install --ignore-scripts(Classic系で有効) |
| 2 | Yarn Berryは.yarnrc.ymlでenableScripts: 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を厳格化。発行・棚卸・失効を定例化 |
| 2 | Trusted Publishing/OIDC | npmのTrusted Publishingで公開時にトークン不要へ。クラウド認証もOIDC化し短期クレデンシャル運用へ移行 |
| 3 | スクリプト実行の既定OFF | CIのyarn install --ignore-scriptsを標準。例外は審査・Allowlist運用 |
| 4 | 監査とSBOM | 依存の可視化とゼロデイレポート(Snyk/JFrog/Unit42等)を定期トリアージ。異常なpostinstall検知をルール化 |
| 5 | GitHub 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や権限最小化で「侵害されても増幅しない設計」に移行します。被害の見積もりは更新が続くため、公式アドバイザリと主要ベンダーの調査を継続監視しながら、運用ルールまで反映させてください。
関連リンク(公式・参考)
- GitHub Advisory: Malware in ngx-bootstrap(GHSA-6m4g-vm7c-f8w6)
- Unit 42: “Shai-Hulud” Worm Compromises npm Ecosystem
- JFrog: Shai-Hulud npm supply chain attack - new compromised packages detected
- Snyk: Embedded malicious code in tinycolor and ngx-bootstrap releases on npm
- Zscaler: Mitigating Risks from the Shai-Hulud NPM Worm
- StepSecurity: ctrl/tinycolor and 40+ NPM Packages Compromised
- ReversingLabs: Self-replicating Shai-hulud worm spreads token stealing malware
- npm公式:トークン失効 Revoking access tokens
- npm公式:トークン作成/制限 Creating and viewing access tokens
- npm公式:Trusted Publishing(OIDC) Trusted publishing for npm packages
- GitHub公式:OIDCとセキュリティハードニング About security hardening with OpenID Connect
articlenpmの事故伝播ワーム「Shai-Hulud」徹底解説:被害範囲・仕組み・今すぐ取るべき対策
article【完全版】Vite ライブラリモード徹底ガイド:npm 配布のための設計と落とし穴
articleTurbopack と npm scripts の連携テクニック
articlenpm と yarn:パッケージ管理の違いとベストプラクティス
article【2025年3月版】JavaScript時間操作ライブラリを徹底比較!日付処理の最適解とは?
article【解決方法】nodenvで入れたnpmのグローバルインストールでパスが通らない場合の対処について
articleLodash の組織運用ルール:no-restricted-imports と コーディング規約の設計
articleRedis 7 の新機能まとめ:ACL v2/I/O Threads/RESP3 を一気に把握
articleLlamaIndex の Chunk 設計最適化:長文性能と幻覚率を両立する分割パターン
articleReact フック完全チートシート:useState から useTransition まで用途別早見表
articleLangChain × Docker 最小構成:軽量ベースイメージとマルチステージビルド
articlePython UnicodeDecodeError 撲滅作戦:エンコーディング自動判定と安全読込テク
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来