【ITニュース解説】npm史上最大:自己伝播ワーム「Shai-Hulud」のサプライチェーン攻撃
2025年09月17日に「Qiita」が公開したITニュース「npm史上最大:自己伝播ワーム「Shai-Hulud」のサプライチェーン攻撃」について初心者にもわかりやすく解説しています。
ITニュース概要
自動拡散ワーム「Shai-Hulud」がnpmにサプライチェーン攻撃。開発用パッケージにワームが潜伏し自動拡散、多くのシステムへ悪影響を及ぼす。
ITニュース解説
最近、ソフトウェア開発の世界で大きな話題となった、npmパッケージを狙った「Shai-Hulud(シャイ・ハルード)」という自己伝播型ワームによるサプライチェーン攻撃について解説する。システムエンジニアを目指す上で、このような脅威のメカニズムとその対策を理解することは非常に重要だ。
まず、npmとは何かという点から説明する。npmは、JavaScriptやNode.jsというプログラミング言語で開発を行う際に欠かせない「パッケージマネージャー」と呼ばれるツールだ。パッケージとは、他の人が作った便利なプログラムの部品やライブラリのこと。開発者はこれらを自身のプロジェクトに組み込むことで、ゼロから全てを作る手間を省き、開発速度を大幅に向上させることができる。この仕組みはJavaScript/Node.jsのエコシステムにおいて、フロントエンドからサーバーサイドまで幅広く利用され、ソフトウェア開発の基盤を支えている。
今回の攻撃は、このnpmエコシステムを狙った「サプライチェーン攻撃」の一種だ。サプライチェーンとは、製品が作られ、消費者に届くまでの生産・流通の全工程を指す言葉だが、ソフトウェア開発においても同様に、コードの作成から、さまざまな部品の利用、ビルド、テスト、そして最終的なソフトウェアのリリースまでの一連の流れが存在する。サプライチェーン攻撃とは、この開発工程のどこか、例えば利用するプログラムの部品(npmパッケージもこれにあたる)の中に悪意のあるコードをひそかに仕込み、最終的にその部品を利用する開発者や、その先のユーザーにまで被害を及ぼそうとする攻撃だ。従来型の攻撃が完成品を直接狙うのに対し、サプライチェーン攻撃は開発の「上流」を狙うため、発見が難しく、被害が広範囲に及ぶ可能性が高いという特徴がある。
Shai-Huludワームは、まさにこのサプライチェーン攻撃の手法を悪用し、npmパッケージを通じて自己増殖するタイプのワームだ。その名の通り、まるで砂漠の巨大ワームが獲物を捕らえるように、npmエコシステムの中で密かに活動し、開発環境を侵害しながら自身を広めていく。
Shai-Huludワームの感染と拡散のメカニズムは非常に巧妙だ。まず、攻撃は、開発者が悪意のあるnpmパッケージを自身のプロジェクトにインストールすることから始まる。npmパッケージには、インストール時に自動的に特定の処理を実行するスクリプト(特にpostinstallスクリプトと呼ばれるもの)を含めることができる。Shai-Huludワームは、このpostinstallスクリプトに悪意のあるコードを仕込んでいた。
この悪意のあるスクリプトが開発者のPCで実行されると、まずその開発環境の情報を収集する。具体的には、OSの種類、ユーザー名、ホスト名といった基本的なシステム情報や、npmパッケージを公開する際に使われる「npmトークン」と呼ばれる認証情報を密かに窃取する。npmトークンは、開発者がnpmアカウントにログインし、新しいパッケージを公開したり、既存のパッケージを更新したりするための重要な鍵となる情報だ。
窃取されたnpmトークンは、攻撃者が管理する外部のサーバー(C&Cサーバーと呼ばれる)に送信される。攻撃者は、この盗んだトークンを悪用し、正規の開発者になりすまして、npmに新たな悪意のあるパッケージを公開する。この新しいパッケージもまた、先のワームと同様に悪意のあるpostinstallスクリプトを含んでいる。
そして、この新たに公開された悪意のあるパッケージが、別の開発者によって誤ってインストールされると、同じプロセスが繰り返される。つまり、その開発者の環境情報とnpmトークンが窃取され、さらに攻撃者の手によって新たな悪意のあるパッケージが公開される、という連鎖反応が起きる。これが「自己伝播型」と呼ばれる所以であり、まるでワームが卵を産み、それがまた孵って別のワームになるように、npmエコシステム全体に感染が広がっていく。
Shai-Huludワームが用いた具体的な手口も非常に巧妙だった。一つは、先述のpostinstallスクリプトを悪用し、システム情報の収集やnpmトークンの窃取を実行する点だ。もう一つは、「タイポスクワッティング」という手法だ。これは、有名な正規のパッケージ名と一文字だけ違うなど、少しだけ名前を変えた悪意のあるパッケージを作成し、開発者が誤ってインストールしてしまうことを狙う。例えば、「react」という有名なパッケージの代わりに、「reacht」といったパッケージを用意する。また、悪意のあるコードの本体は、人間に読みにくい形式(難読化)にしておくことで、セキュリティツールによる検出を回避しようとした。さらに、GitHub ActionsやCI/CDパイプラインといった自動化された開発・テスト環境を悪用し、そこで新たな悪意あるパッケージを自動生成・公開する仕組みも持っていたとされる。これにより、攻撃者は手動で多くのパッケージを作成する必要がなく、効率的に感染を広げることができた。
このShai-Huludワームによる攻撃は、npm史上最大規模とされ、多くの開発者の環境が危険に晒され、npmエコシステム全体の信頼性を大きく揺るがした。開発者は、自身のPCやサーバーが悪用され、意図せずサイバー攻撃の加害者となる可能性もあった。
このような脅威から身を守るためには、システムエンジニアを目指す皆さんも、日頃からセキュリティ意識を高く持つことが不可欠だ。具体的な対策としては、まず、使用するnpmパッケージについて、安易にインストールせず、信頼できる作者や十分に利用実績のあるものを選ぶことが重要だ。パッケージのコードレビューや、脆弱性スキャンツールを用いて、悪意のあるコードが含まれていないか定期的に確認する習慣を身につける。
また、npmトークンなど、重要な認証情報の管理には細心の注意を払う必要がある。npmトークンの権限は必要最小限に限定し、多要素認証を有効にしておくことが望ましい。開発環境は常に最新のセキュリティパッチを適用し、不審な挙動がないか監視することも重要だ。プロジェクトの依存関係を定期的にチェックし、古いバージョンや既知の脆弱性があるパッケージは速やかに更新する。
ソフトウェア開発は、もはやコードを書くだけの作業ではない。利用する部品(パッケージ)の安全性や、開発プロセス全体のセキュリティを意識することが、現代のシステムエンジニアには強く求められる。Shai-Huludワームの事例は、サプライチェーン攻撃がいかに強力で広範囲に影響を及ぼすかを示すものだ。この経験を教訓として、常にセキュリティを意識した開発を心がけよう。