【緊急】npm Shai-Hulud感染3分チェック!11月21日以降npm install実行者は今すぐ確認

2025年11月21日以降にnpm installを実行した方は、今すぐこの記事を読んでください。npm史上最悪のサプライチェーン攻撃「Shai-Hulud 2.0」により、正規パッケージが突然攻撃の入口に変わりました。

この記事では、3分でできる感染チェック方法と、今後の被害を防ぐ3層防御の設定方法を解説します。すべてコピペで即実行できる内容です。

目次

【緊急】npm史上最悪の攻撃「Shai-Hulud 2.0」とは

11月21日から急速拡散

Shai-Hulud 2.0は、2025年11月21日から急速に拡散したnpmサプライチェーン攻撃です。攻撃の手口は以下の通り:

  1. 攻撃者が正規パッケージのメンテナー認証情報を窃取
  2. 悪意あるバージョンをnpmに公開
  3. 既存ユーザーがnpm installnpm updateで感染
  4. 感染したマシンから更なる認証情報を窃取

正規パッケージが突然攻撃の入口に

これまで安全に使っていたライブラリが、ある日突然攻撃の入口になる。これがShai-Hulud型攻撃の恐ろしさです。

攻撃者はpreinstallスクリプトを悪用して、npm installを実行した瞬間に悪意あるコードを実行します。

3分でできる感染チェック(今すぐ実行)

感染チェックは優先度順に3つあります。最優先はGitHubアカウントの確認です。

チェック1:GitHubアカウント(ブラウザで完結・最優先)

確認ポイント1:見覚えのないリポジトリ

GitHubで自分のリポジトリ一覧を確認します:

https://github.com/[あなたのユーザー名]?tab=repositories

descriptionに「Sha1-Hulud: The Second Coming」という文字列があったら確実に感染しています。攻撃者が窃取した認証情報を公開する際に付ける名前です。

確認ポイント2:不審なワークフローファイル

GitHubのコード検索でdiscussion.yamlがないか確認:

https://github.com/search?q=owner%3A[あなたのユーザー名]+path%3A.github%2Fworkflows%2Fdiscussion.yaml&type=code

このdiscussion.yamlは感染時にGitHub Actionsに追加されるバックドアです。被害者のマシンはCI/CDランナーが多いため、このチェックは必須です。

確認ポイント3:セルフホストランナー

各リポジトリのSettings → Actions → Runnersを開いて、「SHA1HULUD」という名前のセルフホストランナーが登録されていないか確認します。

自分のPCがここに登録されていたら即座に削除し、全認証情報をローテーションしてください。

チェック2:ローカル環境(1コマンド)

npmプロジェクトがある開発ディレクトリで以下のコマンドを実行:

find . -type d -name "node_modules" -newermt "2025-11-20" -prune 2>/dev/null \
    | xargs -I {} find $(dirname {}) -name "setup_bun.js" -o -name "bun_environment.js" \
        -o -name "cloud.json" -o -name "actionsSecrets.json" 2>/dev/null | uniq

以下のファイルが見つかったら感染している可能性があります:

  • setup_bun.js:ドロッパー
  • bun_environment.js:メインペイロード(10MB以上の難読化ファイル)
  • cloud.json:AWS/GCP/Azure認証情報
  • actionsSecrets.json:GitHub Actionsシークレット

感染していた場合の緊急対応

感染が確認できた場合、即座に以下を実行してください:

  1. 全トークンのローテーション:npm、GitHub、AWS、GCP、Azureなど
  2. 不審なリポジトリの削除
  3. セルフホストランナーの削除
  4. ワークフローファイルの削除
  5. プライベートリポジトリの確認:強制的にパブリック化されていないか

今後の被害を防ぐ3層防御(5分で設定完了)

Shai-Hulud型攻撃に対する防御は、多層防御アプローチが有効です。

対策 防御対象
層1 新しすぎるパッケージをブロック サプライチェーン攻撃
層2 スクリプト実行を無効化 悪意あるスクリプト実行
層3 継続的にスキャン 既知の脆弱性

層1:新しすぎるパッケージをブロック(Aikido Safe Chain)

SCAツールは「既知の脆弱性」しか検知できません。Advisoryに登録されるまで無力です。そこで時間を味方につける戦略が有効です。

pnpmユーザー向け

pnpm-workspace.yamlにこの設定を追加:

minimumReleaseAge: 2880

「公開から2880分(2日)経ってないバージョンはインストール拒否」という設定です。値は分単位で指定します。

npm/yarn/bunユーザー向け

Aikido Safe Chainを使います。すべてのパッケージマネージャーに対応:

# インストール
npm install -g @aikidosec/safe-chain

# シェル統合のセットアップ
safe-chain setup

# ターミナル再起動後、通常通りnpmを使うだけ
npm install express

Aikido Safe Chainは2つの機能を持っています:

  • 24時間ルール:デフォルトで公開から24時間以内のパッケージはブロック(設定変更可能)
  • マルウェア検知:Aikido Intelデータベースに対してリアルタイムで検証

無料で、トークンも不要で簡単に使えます。CI/CDにも簡単に組み込めます:

- name: Setup safe-chain
  run: |
    npm i -g @aikidosec/safe-chain
    safe-chain setup-ci

- name: Install dependencies
  run: npm ci

層2:スクリプト実行を無効化(ignore-scripts)

悪意のあるパッケージが入ってしまった場合の最終防衛線がignore-scriptsです。

Shai-Hulud 2.0はpreinstallスクリプトを起点として感染します:

{
  "scripts": {
    "preinstall": "node setup_bun.js"
  }
}

.npmrcにこの設定を追加することで、スクリプトは実行されません:

ignore-scripts=true

ネイティブモジュールの問題を解決

「ネイティブモジュール(bcrypt、sqlite3、sharpなど)が動かなくなるのでは?」という疑問があるかもしれません。

解決策はホワイトリスト方式。デフォルトで全てブロックし、必要なパッケージだけ許可します。

pnpm v10の場合(デフォルトで安全)

pnpm v10から、依存パッケージのスクリプトはデフォルトで実行されなくなりました。必要なパッケージだけpackage.jsonで許可:

{
  "pnpm": {
    "onlyBuiltDependencies": ["esbuild", "sharp"]
  }
}

npmの場合(@lavamoat/allow-scripts)

npmで同じことをやるには、@lavamoat/allow-scriptsを使います:

npm install @lavamoat/allow-scripts
{
  "lavamoat": {
    "allowScripts": {
      "sharp": true,
      "bcrypt": true
    }
  }
}

層3:継続的にスキャン(OSV-Scanner)

OSV-Scannerは、Googleが運営するOSV(Open Source Vulnerabilities)データベースを使った脆弱性スキャナーです。

npm auditとの違いは、複数のソース(GitHub Advisory、NVD等)を統合したデータベースを使う点です。カバー範囲が広く、完全にオープンソースで無料です。

# インストール
brew install osv-scanner

# スキャン
osv-scanner --lockfile package-lock.json

CI/CDに組み込むのも簡単:

- name: Run OSV-Scanner
  uses: google/osv-scanner-action@v1
  with:
    scan-args: --lockfile package-lock.json

プルリクエストごとにスキャンを走らせれば、脆弱性のあるパッケージがマージされる前に検知できます。

まとめ:優先度別アクションリスト

やることは3つです。優先度順に実行してください:

優先度 対策 ツール
1 新しすぎるパッケージをブロック Aikido Safe Chain / pnpm minimumReleaseAge
2 スクリプト実行を無効化 ignore-scripts + @lavamoat/allow-scripts
3 継続的にスキャン OSV-Scanner

完璧な防御は存在しませんが、複数の対策を組み合わせることで攻撃の可能性を大幅に減らすことができます。

11月21日以降にnpm installを実行した方は、まず感染チェックを実行してください。感染していなくても、今後の被害を防ぐために3層防御の設定を推奨します。

セキュリティをさらに強化する関連記事

npmセキュリティ対策を実装したら、開発環境全体のセキュリティも強化して、より安全な開発体制を構築しましょう:

開発ツール・セキュリティ

自動化・効率化ツール

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次