NPM

NPM (Node Package Manager) レジストリには、「マニフェスト混乱」と呼ばれるセキュリティ上の欠陥があり、パッケージの信頼性が損なわれ、攻撃者が依存関係にマルウェアを隠したり、インストール中に悪意のあるスクリプトを実行したりする可能性があります。

NPM は JavaScript プログラミング言語のパッケージ マネージャーであり、広く使用されている Node.js 環境のデフォルトです。パッケージ マネージャーは、プロジェクト所有者が、npmjs.com の「npm レジストリ」データベースでホストされているソフトウェア パッケージのインストール、アップグレード、構成を自動化するのに役立ちます。

2020 年に、このプラットフォームは GitHub を通じて Microsoft に買収され、現在では世界中で 1,700 万人を超えるソフトウェア開発者がこのプラットフォームを使用しており、毎月 2,080 億のパッケージをダウンロードしていると推定されています。

元 GitHub エンジニアのダーシー・クラーク氏は、 自身のブログの記事で明らかな混乱の問題を強調し、彼の元雇用主は少なくとも 2022 年 11 月からこの問題について知っていたにもかかわらず、関連するリスクに対処するためにほとんど何も行われていなかったと説明しました。

NPM レジストリには、追加の開発作業を必要とせずにアプリケーションの機能を拡張するために使用できる幅広いパッケージが含まれているため、開発者の間でも非常に人気があります。

しかし、その人気により、悪意のあるパッケージを配布して開発者のコンピュータを乗っ取ったり資格情報を盗んだり、さらにはランサムウェアを展開したりする攻撃者にとっての主要な標的となっています。

明らかな混乱

マニフェストの混乱が発生する npm レジストリに表示されるパッケージのマニフェスト情報と、パッケージのインストール時に使用される公開された npm パッケージの tarball 内の実際の「package.json」ファイルとの間に不一致が発生します。

パッケージの公開時に NPM に送信されるマニフェスト データと package.json の両方に、パッケージ名、バージョン、および展開で使用されるスクリプトやビルドの依存関係などのその他のメタデータに関する情報が含まれています。

2 つは個別に npm レジストリに送信され、プラットフォームはそれらが一致するかどうかを検証しないため、データが異なる可能性があり、その内容を精査しない限り誰も知りません。

これにより、脅威アクターは、新しいパッケージとともに送信されたマニフェスト データを変更して、依存関係やスクリプトを削除し、NPM レジストリに表示されないようにすることができます。ただし、これらのスクリプトと依存関係はpackage.jsonファイル内にまだ存在しており、パッケージのインストール時に実行されます。

この「明らかな混乱」は以下の図に示されており、package.json には依存関係がリストされているにもかかわらず、Clarke の概念実証パッケージの NPM には依存関係がリストされていないことが示されています。

操作されたマニフェストデータの例
操作されたマニフェスト データの例(blog.vlt.sh)

「明らかな混乱」の不一致から生じるリスクには、キャッシュ ポイズニング、不明な依存関係のインストール、不明なスクリプトの実行、さらにはダウングレード攻撃が含まれる可能性があります。

「そして明確にしておきますが、これは隠れた依存関係だけではありません」と Socket CEO の Feross Aboukhadijeh 氏は警告し、同社のツールはこの問題の影響を受けないと述べた

「マニフェストの混乱により、攻撃者が隠しインストール スクリプトを組み込むことも可能になります。これらの隠しスクリプトと依存関係は、npm CLI によってインストールされる場合でも、npm Web サイトやほとんどのセキュリティ ツールには表示されません。」

残念ながら、npm コミュニティと、npm@6、npm@9、yarn@1、pnpm@7 などのすべての主要なパッケージ マネージャーがこの問題の影響を受けます。

npm@6 がマニフェストに存在しないインストール スクリプトを実行している、またはその逆
npm@6 がマニフェストに存在しないインストール スクリプトを実行している、またはその逆(blog.vlt.sh)

残念ながら、依存関係、バージョン番号、さらにはパッケージ名さえも正確でない可能性があるため、これにより NPM レジストリの信頼が失われます。

代わりに、開発者は package.json を手動で読んで、バージョン番号、インストールされる依存関係、および実行されるスクリプトを決定する必要があります。

問題はまだ解決されていない

Clarke 氏によると、GitHub は少なくとも 2022 年からマニフェスト混乱の問題を認識しており、 node-canvasパッケージに関する npm CLI の GitHub リポジトリに提出されたバグ レポートがそれを裏付けているようです。

このエンジニアは、2023 年 3 月 9 日に問題の例を示した詳細な HackerOne レポートを提出しました。

2023 年 3 月 21 日、GitHub はチケットをクローズし、内部でこの問題に対処していると回答しました。それでも、まだリスクを修正しておらず、npm コミュニティに通知していません。

Clarke 氏は、npm の規模が非常に大きいことと、npm がこの危険な慣行を長年にわたって続けてきたという事実のため、この問題に対処するのは決して簡単なことではないと述べています。

GitHub が npm 上のマニフェストの混乱に対処する計画を立てるまで、Clarke 氏は、パッケージの作成者と保守者がマニフェスト データへの依存を取り除き、代わりに、名前とバージョンを除くすべてのメタデータを、影響を受けにくい「package.json」ファイルから取得することを提案しています。操作。

もう 1 つの保護手段は、パッケージ データベースと npm クライアントの間でレジストリ プロキシを使用することです。これにより、追加のチェックと検証を実装して、マニフェスト データとパッケージの tarball 内の情報の間の一貫性を確保できます。

この問題について GitHub に連絡しました。返答があり次第、この投稿を更新します。