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
- article
npmの事故伝播ワーム「Shai-Hulud」徹底解説:被害範囲・仕組み・今すぐ取るべき対策
- article
【完全版】Vite ライブラリモード徹底ガイド:npm 配布のための設計と落とし穴
- article
Turbopack と npm scripts の連携テクニック
- article
npm と yarn:パッケージ管理の違いとベストプラクティス
- article
【2025年3月版】JavaScript時間操作ライブラリを徹底比較!日付処理の最適解とは?
- article
【解決方法】nodenvで入れたnpmのグローバルインストールでパスが通らない場合の対処について
- article
MySQL ロック待ち・タイムアウトの解決:SHOW ENGINE INNODB STATUS の読み解き方
- article
WordPress を Docker で最速構築:開発/本番の環境差分をなくす手順
- article
Motion(旧 Framer Motion)でカクつき・ちらつきを潰す:レイアウトシフトと FLIP の落とし穴
- article
WebSocket 導入判断ガイド:SSE・WebTransport・長輪講ポーリングとの適材適所を徹底解説
- article
npmの事故伝播ワーム「Shai-Hulud」徹底解説:被害範囲・仕組み・今すぐ取るべき対策
- article
JavaScript メモリリーク診断術:DevTools の Heap スナップショット徹底活用
- blog
iPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
- blog
Googleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
- blog
【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
- blog
Googleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
- blog
Pixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
- blog
フロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
- review
今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
- review
ついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
- review
愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
- review
週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
- review
新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
- review
科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来