SJ blog
security
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

npm CanisterSprawlワーム——自己増殖するサプライチェーン攻撃がpostinstallでAI APIキー・クラウド認証情報を窃取

2026年4月21〜22日に発見された自己増殖型npmワーム「CanisterSprawl」は、postinstallフックで約40カテゴリの秘密情報を収集し、盗んだnpmトークンで被害者の全パッケージに感染を拡大する。PyPIにも波及するマルチエコシステム攻撃の仕組みと対策を解説。

一言結論

CanisterSprawlは1人の開発者感染から自動でその開発者が公開しているすべてのnpmパッケージを汚染し指数的に拡散する初の実環境ワーム。OpenAI/Anthropicを含むAI APIキー、クラウド認証情報、CI/CDトークンを窃取し、PyPI認証情報が見つかれば同じ手法でPythonパッケージへも侵入する。今すぐ`npm audit`と公開パッケージのpostinstallスクリプト確認が必要だ。

何が起きたのか

2026年4月21〜22日、セキュリティ研究機関のSocketとStepSecurityが、CanisterSprawlと命名された自己増殖型サプライチェーンワームをnpmで発見した。

このワームは Namastex Labs 関連アカウントが公開した16以上のパッケージに埋め込まれており、感染した開発者環境から取得したnpmトークンを使って被害者自身のパッケージに自動的に汚染バージョンを公開し続ける。

CanisterSprawlの伝播サイクル:

  [被害者が感染パッケージをインストール]

  [postinstallフックが起動]

  [約40カテゴリの秘密情報を正規表現で収集]
  (npmトークン, クラウドキー, AI APIキー, SSHキー, CI/CDトークン等)

  [被害者のnpmトークンで被害者のパッケージに感染バージョンをpublish]

  [新たな被害者が感染パッケージをインストール → サイクル継続]

自己増殖するnpmワームが実環境で確認されたのはこれが初めての事例とされている。

窃取される情報(約40カテゴリ)

感染パッケージのpostinstallスクリプトは、開発者環境の以下の情報を正規表現でスキャンし、外部サーバーに送信する。

窃取対象(主要カテゴリ):
  ☠ npmトークン          → パッケージへの感染拡大に悪用
  ☠ AWS / GCP / Azureキー → クラウドインフラへの不正アクセス
  ☠ OpenAI / Anthropic /
     Cohere APIキー       → LLM APIの無断利用・コスト被害
  ☠ GitHubトークン       → リポジトリへのアクセス・改ざん
  ☠ CI/CDトークン        → パイプラインの乗っ取り
  ☠ SSHキー              → サーバーへの侵入
  ☠ 暗号通貨ウォレット   → 資産の窃取
  ☠ ブラウザ保存パスワード → 全体的なアカウント侵害

AI API キーが明示的なターゲットに含まれている点が今回の特徴で、盗んだキーを使ったLLMコスト請求攻撃(“LLMjacking”)への転用が危惧される。

マルチエコシステムへの波及

npmトークン以外にPyPI認証情報が見つかった場合、同じ手法でPythonパッケージにも感染を拡大する。.pthファイルを悪用してPythonの起動時に悪意コードが実行されるよう仕込む。

同週には以下の三つのサプライチェーン攻撃が並行して発生しており、協調した攻撃者グループの存在が疑われている。

同週に発生した関連攻撃:
  npm  → CanisterSprawl(自己増殖型ワーム)
  PyPI → 別のマルウェアキャンペーン
  Docker Hub → イメージへの悪意レイヤー挿入

確認された感染パッケージ(2026年4月22日時点)

@automagik/genie        4.260421.33 – 4.260421.40
pgserve                 1.1.11 – 1.1.14
@fairwords/websocket    1.0.38 – 1.0.39
@fairwords/loopback-connector-es  1.4.3 – 1.4.4
@openwebconcept/design-tokens     1.0.1 – 1.0.3
@openwebconcept/theme-owc         1.0.1 – 1.0.3
(他6バリアント・調査継続中)

既知パッケージ以外にも感染済みのバージョンが継続的に公開されている。

今すぐ行うべき対応

1. 依存関係を監査する

# インストール済みパッケージのスクリプトを確認
npm audit

# postinstallスクリプトを持つパッケージを列挙
cat package-lock.json | \
  node -e "
    const d=JSON.parse(require('fs').readFileSync('/dev/stdin','utf8'));
    Object.entries(d.packages||{}).forEach(([k,v])=>{
      if(v.scripts?.postinstall) console.log(k, v.scripts.postinstall);
    })
  "

2. 自分が公開しているパッケージを確認する

npmパッケージを公開している開発者は、最新バージョンのpostinstallスクリプトを即座に確認する。

# 自分のパッケージの最新バージョン情報を取得
npm view <your-package> dist-tags scripts

postinstallスクリプトに見覚えのないURLへのcurlやfetch、obfuscatedなコードが含まれていれば即座にトークンをローテーションし、npmサポートに連絡する。

3. npmトークンをローテーションする

感染の疑いがある場合、または感染パッケージをインストールした可能性がある場合は今すぐトークンを失効させる。

# 既存トークンを確認
npm token list

# 不審なトークンを削除
npm token revoke <token-id>

# GitHubリポジトリのシークレットも同時にローテーション:
#   Settings → Secrets and variables → Actions

4. インストール時のスクリプト実行を制限する(予防策)

# npmの場合: ignore-scripts を有効化(個別適用時)
npm install --ignore-scripts

# .npmrcに設定して恒久化(CI環境で特に有効)
echo "ignore-scripts=true" >> .npmrc

ただしignore-scriptsはネイティブアドオンや一部ツールを壊す場合があるため、本番導入前に影響を確認すること。

なぜこのワームが危険なのか

従来のサプライチェーン攻撃は「悪意ある第三者パッケージを踏み台にする」ものだった。CanisterSprawlは開発者自身を加害者に変える点が根本的に異なる。

❌ 従来型:
  悪意パッケージ → 被害者のシステムを攻撃

✅(攻撃者視点で)今回型:
  悪意パッケージ → 被害者の認証情報で
                 → 被害者の信頼されたパッケージを汚染
                 → 被害者の既存ユーザーを攻撃

正規開発者のアカウントから公開された「信頼済みパッケージ」の更新版に悪意コードが含まれるため、npm auditだけでは検出できないケースがある。

注意点・未確認情報

  • 感染パッケージの全リストは調査継続中で、公表済みの16件以外にも拡大している可能性がある
  • 窃取された情報の利用状況(どのAPIキーが実際に悪用されたか)は非公開
  • 攻撃者の帰属は調査中
  • PyPI/Docker Hubへの同時攻撃との関連は未確認

まとめ

  • CanisterSprawlはnpmの自己増殖型ワームで、postinstallを通じて開発者の全公開パッケージを汚染する
  • AI APIキー、クラウド認証情報、CI/CDトークンを含む約40カテゴリを窃取
  • 今すぐ: npm audit実施 + 自分の公開パッケージのpostinstallスクリプト確認
  • npmトークンのローテーションと.npmrcへのignore-scripts=true設定を検討する

参考リンク