NPM パッケージの Manifest Confusion :チェックのための Python ツールがリリース

New Python tool checks NPM packages for manifest confusion issues

2023/07/04 BleepingComputer — NPM JavaScript ソフトウェア・レジストリのパッケージにおける、マニフェストの不一致をチェックする際に有効なツールが開発/公開された。先週に、GitHub/NPM の元 Engineering Manager である Darcy Clarke は、依存関係の中に潜むマルウェアや、インストール中のスクリプト実行の危険性をもたらす、”Manifest Confusion” の問題について警告を発した。”Manifest Confusion” という言葉が指すのは、JavaScript プログラミング言語用のパッケージ・マネージャーであり、Node.js 環境のデフォルトである NPM (Node Package Manager) のセキュリティ問題である。

NPM レジストリに表示されるパッケージのマニフェスト・データと、公開されたパッケージの package.json ファイルに存在するデータとの間に、一貫性のない情報が存在するという問題がある。

それを悪用する脅威アクターたちは、新しいパッケージのマニフェスト・データを操作し、特定のスクリプトや依存関係を削除して、NPM レジストリに表示されないようにできる。これらのスクリプトや依存関係は、package.json ファイルに依然として存在し、パッケージがインストールされるとユーザーに気づかれることなく実行される。

この問題により開発者に生じるのは、キャッシュ・ポイズニング/未知の依存関係のインストール/未知のスクリプトの実行/ダウングレード攻撃などといったリスクである。しかし、依然として GitHub は問題に対処しておらず、同プラットフォームが、今後どうするつもりなのかも不明だ。

そのため Clarke は、パッケージの管理者がマニフェスト・データへの依存を取り除き、レジストリ・プロキシを使ってデータの整合性チェックを行うことを提案している。

Manifest Confusion チェッカー

システム管理者の Felix Pankratz は、解決策が実装されるまでの緩和策として、ソフトウェア開発者が NPM パッケージの不整合をチェックに有効な、Python ベースのツールをリリースした。

このツールを使うには、まず “pip install -r requirements.txt” で PIP Python パッケージマネージャをインストールする。

1つのパッケージを検査するには、スクリプトの第1引数に以下のようなパッケージ名を渡す。

$ ./npm-manifest-check.py darcyclarke-manifest-pkg

この出力は、マニフェストと実際の package.json ファイルのバージョン/依存関係/スクリプト/パッケージ名などの不一致をハイライトしている。

Tested package
テスト済みパッケージ (BleepingComputer)

ミスマッチのないパッケージの場合には、出力は次のようになる:

$ ./npm-manifest-check.py color
No mismatch detected for color.

複数のパッケージを検査する際には、それらのパッケージを ‘packages. list’ ファイルに追加し (1行に1パッケージずつ)、’check_packages.sh’ ラッパー・スクリプトを使って検査できる。このツールは、チェックした各パッケージで見つかった、不一致を報告する。

Pankratz のツールの詳細については、以下の help コマンドで確認できる:

./npm-manifest-check.py -h

Manifest Confusion の問題は、現時点において、NPM コミュニティで広まっているわけでも、致命的な問題でもない。しかし、脅威アクターがサプライチェーン攻撃に利用し始める可能性があるため、無視できない問題だと言えるだろう。

この問題は、2023/06/28 の「NPM の根幹を揺るがす Manifest Confusion:パッケージ情報が信頼できない理由」で詳しく紹介されています。本文の最後には、NPM コミュニティで広まっているわけでも、致命的な問題でもないと記されていますが、本来であれば、GitHub が速やかに情報を整理して、対応策を提示すべき問題だと思います。それまでは、システム管理者の Felix Pankratz さんが提供してくれた、この Python ベースのツールが頼りとなります。