いろいろなコンピュータ言語があります。
新しいそれらには共通して利便性の高い特徴があります。
コンピュータ言語利用時に使用できる膨大な量のパッケージが簡単に利用できるという特徴です。
こういったものは、PythonでいうPyPI、RubyでいうRubyGems、などのパッケージ管理システムを通じて簡単に利用することができます。
これらの横並びでJavaScript実行環境であるNode.js用に、npmというものがあります。
npmはNode Package Managerです。
この種のパッケージ管理システムはよくできていて、文字列を指定してそれが名前に含まれるパッケージを簡単に探すことができるようになっています。
そして探したパッケージを簡単に手元の環境に取り込むことができるようになっています。
さらに、そのパッケージを正しく動作させるために前提として必要な他のパッケージを自動的に追加で手元環境に取り込んでくれる機能も搭載しています。
この機能によって、利用者はそのパッケージの利用をスムーズに開始することができるようになっています。
この機能は多くのパッケージ管理システムで利用できるようになっている機能です。
しかし、どうやらnpm用においては、少し様子が異なっていたことがわかりました。
通常期待される流れはこうなります。
- 利用者がなにかのパッケージを探し出す
名前で探します。
この時点ですでに注意が必要なのですが、typoを狙って怪しいパッケージがあることに注意が必要です。
この話はまた別の話ですが。 - 利用者が特定したパッケージを取り込むコマンドを実行する
使いたいものを手元にインストールするコマンドを実行します。 - パッケージ管理システムから当該パッケージをダウンロードする
インストールのコマンドが該当するパッケージをダウンロードします。 - パッケージの依存関係が確認される
入手したパッケージの中から依存関係のあるパッケージの情報が読みだされます。 - パッケージ管理コマンドが依存関係のあるパッケージをインストールする
読み取った情報に従って追加インストールします。 - 目的のパッケージをインストールする
前提条件が整った段階で、目的のパッケージをインストールします。
これで利用者は目的のパッケージを利用できるようになりました。
よかったよかった。
ところで、多くのパッケージ管理システムは、Webで利用できるポータルサイトも持っています。
それらのサイトでは各種パッケージの説明文を読んだり、実際のコードを確認したり、依存関係を確認したりすることができる機能が搭載されています。
こういったものも、利用者がなにかのパッケージを探し出す段階でよく利用されます。
ここで得られる情報は実際のパッケージの内容と一致していることを利用者は通常期待したいでしょう。
しかし、これがそうではなかったということがnpmで発生していました。
npmでパッケージを公開する際に、npmで公開するパッケージをtar形式のアーカイブファイルで送信します。
そのアーカイブファイルの中には実際の前述の流れの「パッケージ管理コマンドが依存関係のあるパッケージをインストールする」の部分で利用されることになるpackage.jsonの情報が含まれます。
そして、それとは別にnpmレジストリに表示されるパッケージのマニフェスト情報が送信されます。
npmレジストリではパッケージの情報を表示する際にこのマニフェスト情報を使用します。
通常考えると、これらは同じ内容であるべきものです。
しかしnpmの現状のシステムではこれらの整合性は確認されていないということなのです。
何が起こるでしょうか。
利用者がそのパッケージを利用する際に一緒にインストールされると思っていたパッケージとは異なるものが実際にはインストールされるという状態を生んでしまうことになります。
これはシステムの実装の問題というよりも、システムの設計というか仕様の問題に思えます。
さらにこの問題は、依存関係の情報だけではありませんでした。
別々に送信される情報の中に、パッケージのインストール時に使用されるスクリプトの内容も含まれるのです。
つまり、インストール時に動作すると思っていたスクリプトとは異なるインストールスクリプトが動作するという事態が起こります。
これは、攻撃者が隠しインストールスクリプトを組み込むことを可能にします。
これらの隠しスクリプトと依存関係は、npm CLI によってインストールされる場合でも、npm
Webサイトやほとんどのセキュリティツールには表示されません。
この問題は、すでに関係組織で認識されている問題となっていますが、現在はまだ解消されていません。
問題が解消されるまでは利用者が自分自身で、不整合による問題が発生してしまっていないかを手元の環境で検証する必要がありそうです。
参考記事(外部リンク):The massive bug at the heart of the npm
blog.vlt.sh/blog/the-massive-hole-in-the-npm-ecosystem
この記事をシェア |
---|