Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】毎週200万回DLされているパッケージをnpm install するだけで感染する、サプライチェーン攻撃の進化

2025年09月22日に「Qiita」が公開したITニュース「毎週200万回DLされているパッケージをnpm install するだけで感染する、サプライチェーン攻撃の進化」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

毎週200万回ダウンロードされる人気npmパッケージが「npm install」だけで悪意あるコードに感染するサプライチェーン攻撃が進化している。開発環境や利用するパッケージに不正なコードが入り込む危険性が高く、開発者はフィッシングだけでなく、使用するnpmパッケージの安全性にも注意が必要だ。

ITニュース解説

システム開発では、外部から提供されるソフトウェア部品である「パッケージ」や「ライブラリ」を組み合わせて効率的に開発を進めるのが一般的だ。特にJavaScript開発で利用されるnpm(Node Package Manager)は、世界中の開発者が作成した便利なパッケージを簡単にインストールできるため、非常に広く利用されている。しかし、この便利さの裏には、悪意のある攻撃者がその仕組みを悪用し、ユーザーのコンピュータに被害をもたらす危険性が潜んでいる。最近、その脅威の手口が巧妙化しており、システムエンジニアを目指す初心者が特に注意すべきサプライチェーン攻撃について解説する。

「サプライチェーン攻撃」とは、ソフトウェアの供給経路、つまりソフトウェアが開発され、ユーザーの手元に届くまでの連鎖(サプライチェーン)に悪意のあるコードを仕込み、それを経由してユーザーのコンピュータに被害を与える攻撃手法を指す。これまでも、人気のあるオープンソースソフトウェア(OSS)の開発者アカウントが乗っ取られたり、よく似た名前の偽パッケージ(typo-squatting)が作られたり、あるいは内部犯行によって悪意のあるコードが紛れ込んだりする事例が報告されてきた。しかし、今回特に注目すべきは、これまでの手口とは異なる新しい形の攻撃が登場したことだ。

今回の攻撃は、世界中で毎週200万回以上ダウンロードされていた人気パッケージ「node-ipc」を巡って発生した。このパッケージは、異なるプログラム間で通信を行うための便利な機能を提供するものだ。驚くべきことに、この攻撃では、パッケージの作者自身が意図的に悪意のあるコードを仕込んだ。具体的には、「node-ipc」のバージョン9.2.2から11.0.0の間に、ロシアとウクライナの紛争に関連する政治的なメッセージを目的としたコードが組み込まれた。このコードは、ユーザーのIPアドレスがロシアまたはベラルーシの地域に属していると判断した場合、そのコンピュータのファイルシステム上のデータを破壊する機能を実行するように設計されていた。

さらに巧妙な点は、この悪意あるコードが、別の依存関係を通じて多くのユーザーに知らず知らずのうちにインストールされてしまったことだ。「node-ipc」は、JavaScript開発で広く使われるフレームワークVue.jsのプロジェクトを作成するツールである「vue-cli」の一部である「@vue/cli-service」というパッケージの依存関係として含まれていた。つまり、「vue-cli」を使ってプロジェクトを作成したり、既存のプロジェクトの依存関係を更新したりするだけで、意図せず破壊的なコードが自分のコンピュータに入り込んでしまう可能性があったのだ。

この攻撃では、悪意のあるコードが直接「node-ipc」のメインコードに埋め込まれるだけでなく、「peacenotwar」という別の悪意あるパッケージを「node-ipc」の依存関係として追加するという手法も用いられた。「peacenotwar」パッケージが、実際にIPアドレスを判定し、ファイルを破壊する役割を担っていた。このように、一見無害に見えるパッケージの依存関係の中に、さらに別の悪意あるパッケージが隠されているケースもあるため、依存関係の全体像を把握することの重要性が増している。

また、npmパッケージの利用を狙ったフィッシング攻撃も進化している。フィッシングとは、本物そっくりの偽サイトやメッセージを使い、ユーザーのIDやパスワードなどの個人情報をだまし取る手法だ。例えば、パッケージ管理ツールである「pnpm」や「yarn」を使ってパッケージをインストールしようとした際に、通常とは異なる画面が表示され、npmアカウントのユーザー名とパスワードの入力を求められるケースが報告されている。これは、公式のnpmレジストリではなく、攻撃者が用意した偽のサイトに誘導され、入力した認証情報を盗み取られる危険性があることを意味する。一度認証情報が盗まれてしまえば、攻撃者はユーザーのアカウントを乗っ取り、悪意のあるパッケージを公開したり、さらなる被害を広げたりする恐れがある。

これらの脅威から自分の開発環境やプロジェクトを守るためには、システムエンジニアを目指す初心者のうちから、いくつかの対策を習慣づけることが重要だ。

まず、脆弱性スキャンを積極的に利用することだ。npmには「npm audit」というコマンドがあり、現在インストールされているパッケージに既知の脆弱性がないかを自動でチェックし、修正方法を教えてくれる。開発の初期段階から定期的にこのコマンドを実行し、発見された脆弱性には迅速に対応する習慣をつけるべきだ。

次に、依存関係の固定が挙げられる。npmでパッケージをインストールすると、「package-lock.json」というファイルが生成される。このファイルには、プロジェクトが依存するすべてのパッケージとその正確なバージョン、およびそれらがさらに依存するパッケージの情報が詳細に記録されている。このロックファイルをバージョン管理システムで管理し、利用することで、チームの全員が同じバージョンのパッケージを利用できるだけでなく、意図しないパッケージのバージョンアップによって悪意のあるコードが混入するのを防ぐことができる。

さらに、新しいパッケージを導入する際には、その信頼性を確認する習慣をつけること。パッケージのダウンロード数、最終更新日、作者の情報、GitHubリポジトリでの活動状況、コミュニティの活発さなどを確認し、広く利用され、定期的にメンテナンスされている信頼できるパッケージを選ぶようにする。不審な点がある場合は、安易に利用しない判断も必要だ。

自身のnpmアカウントを守るためにも、二段階認証(2FA)を有効にすることは非常に重要だ。これにより、たとえパスワードが盗まれても、スマートフォンなど別の認証手段がなければログインできないため、アカウントの乗っ取りリスクを大幅に低減できる。

また、パッケージのインストール中に、通常と異なる画面が表示されたり、不審なサイトへの誘導が見られたりした場合は、安易に個人情報を入力せず、一度操作を中断し、状況を確認する冷静な判断力も必要だ。公式な情報源や信頼できるセキュリティ情報を参照し、それが正規のプロセスであるかを確かめるべきだ。

最後に、開発チーム全体でセキュリティに関する意識と知識を共有し、継続的に学習することが不可欠だ。新たな攻撃手法は日々生まれており、一度対策を講じれば安心というわけではない。最新のセキュリティ情報を収集し、チーム内で共有することで、未知の脅威にも対応できる体制を築くことができる。

システムエンジニアとして、利便性だけでなく、それに伴うリスクを理解し、適切な対策を講じる能力は、今後ますます重要になる。今回の事例は、身近な開発環境にも深刻な脅威が潜んでいることを改めて教えてくれるものだ。日々の開発作業の中で、これらのセキュリティ対策を意識し、実践していくことで、より安全なソフトウェア開発を目指してほしい。

関連コンテンツ

関連IT用語