自己増殖するnpmサプライチェーンワーム。Shai-Huludとその亜種が広がる仕組みと防御
対象の目安: ソフトウェア開発者やCI/CD運用者 / 実務

npmのようなパッケージレジストリは、世界中の開発者が書いたコードを互いに再利用するための共有基盤です。インストールするパッケージの多くは、自分が直接選んだものではなく、その依存先のさらに依存先として自動で引き込まれます。この「信頼して引き込む」仕組みそのものが、攻撃者にとっては格好の侵入経路になります。中でも近年問題になっているのが、人手を介さずに自分自身を増やしていく自己増殖型のワームです。
その最初の本格例として広く注目されたのが、2025年9月に確認されたShai-Huludです。Palo Alto NetworksのUnit 42は、これを新種の自己複製ワーム(novel, self-replicating worm)として報告しました。盗んだ認証情報を使って、感染した開発者が管理する別のパッケージへ自分を書き込み、再公開する。この一連の流れが自動化されているため、攻撃者が個別に操作しなくても感染が連鎖的に広がります。2026年に入ってからもShai-Huludの新しい波や、Miasma、IronWormといった亜種が相次いで確認されています。
この記事では攻撃の再現手順には触れず、なぜワームが自己増殖できるのか、なぜインストールしただけでコードが走るのか、そして開発者個人とCI/CDを含む組織がそれぞれ何をすべきかを整理します。なお、検証は自分が管理を許された環境だけで行ってください。他者のアカウントやシステムへの無断のアクセスや改ざんは、不正アクセス禁止法などに触れる可能性があります。
自己増殖型npmワームとは何か
通常のサプライチェーン攻撃では、攻撃者が手作業で人気パッケージに似た名前を付けたり、メンテナの信頼を得てから悪意あるコードを仕込んだりします。これに対して自己増殖型のワームは、感染したパッケージ自身が次の感染先を見つけて広がる点が異なります。攻撃者が最初の一押しをした後は、コードが自律的に増殖していきます。
Shai-Huludの最初の波は2025年9月に観測されました。Unit 42は、攻撃の発端の一つとして、npmをかたってMFAの設定を更新するよう促すフィッシングがあった可能性を指摘しています。開発者が認証情報を入力すると、それを起点に感染が始まります。米国のCISAも2025年9月23日にnpmエコシステムへの広範なサプライチェーン侵害について注意喚起を出しており、組織横断で警戒すべき事象として扱われました。
2025年11月には、より広範な波であるShai-Hulud 2.0が報告されました。Unit 42によれば、この波は数万のGitHubリポジトリに及び、約350の固有ユーザー配下で25,000を超える悪意あるリポジトリが作成されたとされ、初期の波より大幅に規模が拡大しています。ここでいう悪意あるリポジトリは、被害を受けた正規のプロジェクトではなく、攻撃者が窃取した情報の公開先として作り出したものです。一過性の事件ではなく、手口が更新されながら繰り返される脅威として捉える必要があります。
供給元を経由して被害が広がるという構造は、サプライチェーン攻撃全般に共通します。
あわせて読みたい
サプライチェーン攻撃の構造と防御の考え方。ソフト・ハード・サービス経由の侵入をどう減らすか
なぜワームは自己増殖できるのか
自己増殖の中心にあるのは、盗んだ認証情報の再利用です。ワームは感染した開発環境から、.npmrcに保存されたnpmアクセストークン、GitHubのパーソナルアクセストークン、AWSやGCP、Azureといったクラウドの認証情報を探し出します。Unit 42の報告では、Shai-Huludが秘密情報の探索にTruffleHogのような走査を用いたとされています。
盗んだnpmトークンを使うと、ワームはレジストリに対して、感染した開発者本人として認証できます。そこで本人が管理する他のパッケージを列挙し、それぞれに自分のコードを書き込んで、汚染した新しいバージョンとして再公開します。この「盗む、なりすます、再公開する」が一周するたびに感染パッケージが増えるため、感染が指数的に広がる構造になります。
2026年6月に確認されたIronWormは、この再公開の経路をさらに巧妙にしました。JFrog Security Researchによれば、IronWormはRustでコンパイルされたLinux向けのELFバイナリで、侵害されたnpmアカウントからpreinstallフックを通じて実行されます。CI環境では、ランナーのOIDC識別トークンをnpmのトークン交換エンドポイントに渡し、パッケージスコープの自動化トークンを得て再公開します。つまり、環境変数や秘密情報ストアに保存された認証情報がなくても、CIの実行そのものが再公開の手段になりうるということです。IronWormはOpenAIやAnthropic、Geminiといった各種の開発者向け認証情報も標的にしたと報告されています。
開発者の認証情報をどう守るかという問題は、シークレット管理の考え方と地続きです。
あわせて読みたい
シークレット管理の実務。APIキー・認証情報をハードコードせず、Vaultやマネージドサービスで守りローテーションする
インストール時にコードが走る経路
多くのセキュリティツールは、package.jsonのpreinstallやpostinstallといったライフサイクルスクリプトを監視します。ここに不審なコマンドがあれば検知できるからです。ところが2026年に確認されたMiasmaの一部の波は、この監視をすり抜ける経路を使いました。
その経路がbinding.gypです。npmは、パッケージにbinding.gypがあると、ネイティブモジュールをビルドするためにインストール時へ自動的にnode-gypを走らせます。本来はC/C++の拡張モジュールのための仕組みです。攻撃者は、このbinding.gypにgyp特有のコマンド展開構文を仕込み、ビルド設定の段階で任意のコードを実行させました。StepSecurityはこの手口をPhantom Gypと名付けています。package.jsonにインストールスクリプトが一切宣言されていないため、スクリプトのフックだけを見るツールには無害に見えてしまいます。
Snykはこの一連の侵害をNode-gyp Supply Chain Compromiseとして追跡し、57個のパッケージが影響を受けたと報告しています。binding.gypから起動したコードは、Node.jsのプロセス監視を避けるために別のJavaScriptランタイムを取得し、その上で認証情報を収集する処理を動かしていました。再公開の際には、メンテナのパッケージをレジストリAPIで列挙し、binding.gypと本体コードを注入して公開し直す流れが自動化されていました。
この事例が示すのは、インストール時にコードが走る経路はpostinstallだけではないという点です。ネイティブビルドのための仕組みや、依存解決の隙も実行点になりえます。だからこそ、特定のスクリプト名を塞ぐだけでなく、インストール時のコード実行そのものを抑える発想が必要になります。
開発者個人ができる防御
開発者一人ひとりの環境は、ワームにとって最初の侵入口であり、認証情報の供給源でもあります。盗まれにくくすること、盗まれても再公開に使われにくくすることが基本になります。
開発者個人の防御ステップ
- 1
公開時のフィッシングを疑う
npmやレジストリをかたってMFAや認証情報の再入力を求めるメールやページを警戒します。アクセスは公式ドメインへ自分で移動して行い、誘導リンクから入力しません。 - 2
トークンの種類と寿命を見直す
npmの公式ドキュメントにあるとおり、用途に応じてアクセストークンの種類を選びます。長命の汎用トークンを避け、必要最小の権限と短い有効期間にします。 - 3
二要素認証と公開時の確認を有効にする
npmアカウントで二要素認証を有効にし、公開操作にも認証を求める設定にします。盗まれたトークン単体での再公開を成立しにくくします。 - 4
インストール時のスクリプトを抑える
信頼の確認が済むまでは、依存導入時にライフサイクルスクリプトを自動実行しない設定で扱います。新しく入れる依存や更新する依存は、隔離した環境でまず確認します。 - 5
侵害が疑われたら即座にローテーションする
不審なインストールや公開を見たら、npmやGitHub、クラウドのトークンを失効させて再発行します。盗まれた認証情報が生き続けるほど再公開の窓が広がります。
対策の効きが大きいのは、トークンの寿命と権限を絞ることです。盗まれても短時間で失効し、できる操作も限られていれば、ワームが再公開へ持ち込める余地は小さくなります。
組織とCI/CDで備えること
組織では、個々の開発者の対策に加えて、依存の取り込み方とCI/CDの権限設計が防御の要になります。IronWormの事例が示すとおり、CIランナーの識別情報そのものが再公開の手段になりうるため、パイプラインの権限を絞ることが直接の対策になります。
組織とCI/CDのチェックリスト
- 依存の取得元を社内プロキシやレジストリに集約し、外部から無制限に取り込まない
- 新しく入れる依存も更新する依存もバージョン固定とロックファイルを徹底し、勝手に最新へ追従させない
- CI/CDの公開用トークンを最小権限かつ短命にし、Trusted Publishingの設定範囲を必要なパッケージだけに絞る
- ビルドのジョブと公開のジョブを分離し、テスト段階では公開権限を持たせない
- SCAや依存監査を導入し、既知の悪性バージョンや不審な再公開を検知する
- インシデント時にトークンを一括で失効させて再発行できる手順をあらかじめ用意する
依存を継続的に把握し、悪性バージョンを早く弾く仕組みは、依存管理とソフトウェアコンポジション解析(SCA)の延長線上にあります。
あわせて読みたい
依存ライブラリ管理とSCA。SBOMで攻撃面を把握する
汚染されたパッケージの本当の怖さは、公開時点では誰も気づきにくいことです。Snykの報告では、汚染されたバージョンがnpm上で依然としてインストール可能なまま残る場合があると指摘されています。latestタグが正常な版を指していても、明示的にバージョンを固定して取りに行くと汚染版を引いてしまう余地があるということです。だからこそ、取得元の集約とロックファイルの管理を組み合わせ、どの版を本当に使っているのかを常に説明できる状態にしておくことが効いてきます。
自己増殖型のワームは、レジストリという共有基盤が前提とする「信頼して引き込む」性質を逆手に取ります。完全に止めるのは難しい一方で、認証情報を盗まれにくくし、盗まれても再公開できないよう権限を絞り、インストール時のコード実行を抑えるという三つの方向で、感染が連鎖する確率は確実に下げられます。脅威の名前は波ごとに変わっても、守るべき急所は大きく変わりません。日々の依存の扱い方とトークンの管理を、その急所に合わせて整えていくことが現実的な備えになります。
出典・参考
- Palo Alto Networks Unit 42: Shai-Hulud Worm Compromises npm Ecosystem in Supply Chain Attack
- CISA Alert: Widespread Supply Chain Compromise Impacting npm Ecosystem
- JFrog Security Research: IronWorm, Shai-Hulud's rustier cousin
- Snyk: Node-gyp Supply Chain Compromise (self-propagating npm worm via binding.gyp)
- StepSecurity: Miasma npm Supply Chain Attack spreads like a worm via Phantom Gyp
- npm Docs: About access tokens
関連する記事
サプライチェーン攻撃の構造と防御の考え方。ソフト・ハード・サービス経由の侵入をどう減らすか
自社が直接狙われなくても、取引先やライブラリ、サービス経由で侵入されるのがサプライチェーン攻撃です。実例をもとに攻撃の構造を分解し、信頼の前提を見直すための実務的な防御の考え方を解説します。
依存ライブラリ管理とSCA。SBOMで攻撃面を把握する
自作コードより外部ライブラリのほうが多い時代に、何を使っているかを台帳化するSBOMと、既知の脆弱性を突き合わせるSCAの基本を解説。SPDX/CycloneDXの違い、Dependabot/Renovateによる更新自動化、CI組み込みの判断基準まで実務目線でまとめます。
シークレット管理の実務。APIキー・認証情報をハードコードせず、Vaultやマネージドサービスで守りローテーションする
APIキーやDB認証情報などのシークレットを、ハードコード回避・集中管理・ローテーション・最小権限という4つの軸で守る方法を、Vaultやクラウドのマネージドサービス、動的シークレットまで実務目線で解説します。


