「npm」に自己複製型のワームプログラムが動作可能な脆弱性が報告されるプロジェクトでは既知の問題として把握済み

npmにワームプログラムが動作可能な脆弱(ぜいじゃく)性が報告されている。npmプロジェクトでは、改めてユーザーに注意を促している。

» 2016年03月30日 11時12分 公開
[@IT]

 Node.jsのデフォルトパッケージマネジャーとして広く利用されている「npm」に、自己複製型のワームプログラムが動作可能な脆弱(ぜいじゃく)性が報告されている。

 Sam Saccone氏が公開したレポートによると、この脆弱性は、npmのようなパッケージマネジャーが持つ「ライフサイクルスクリプト」のコンセプトに起因したものだという。パッケージマネジャーはシステムで任意のコマンドをカレントユーザーとして(Sudoの場合は一時的な特権ユーザーとして)実行できる。

 npmではセマンティックバージョニング(semver)の利用を推奨しているが、セマンティックバージョニングは、依存関係にあるパッケージのバージョンを固定せず、依存パッケージの作者は、自由にアップデートバージョンをプッシュできる仕様になっている。一方、npmはパッケージリポジトリサーバへのログイン状態を維持する仕様になっており、「npm publish」コマンドでレジストリサーバにコマンドを公開できる。

 このため、特定の手順を踏むと、依存モジュールのバージョンを「^」または「~」で指定している大多数のモジュールで次回のインストール時に自己複製型の細工されたモジュールを埋め込まれるという。

 レポートでは、次の手順で攻撃が可能だとしている。

  1. 細工したモジュールをユーザーの環境にインストールさせる
  2. ワームプログラムが、新しいnpmモジュールを生成する
  3. ワームプログラムが、インストール時にワームプログラムが実行されるようにモジュールを設定する
  4. ワームプログラムが、このモジュールをユーザーのアカウントで公開する
  5. ワームプログラムは、ユーザーがpublish権限を持っている全てのモジュールに対して、新たに作成したモジュールに依存するよう改ざんする
  6. ワームプログラムはこれら改ざんしたモジュールを、semverの「バグフィックス」レベルを示すアップデートバージョンとしてpublishする

対策

 この問題への対策としてJapan Vulnerability Notes(JVN)では以下のワークアラウンドの実施を推奨している。あくまでも、影響を最小限に抑えるための対策だ。

  • npmサーバにログインしたままにしない(npm logout コマンドでログアウト可能)
  • npm shrinkwrapコマンドで依存パッケージのバージョンを固定する
  • インストール時に「ignore-scripts」オプションを付ける「:npm install <モジュール名> --ignore-scripts」

npmプロジェクトは既知の問題として把握済み

 Sam Saccone氏のレポートでは、脆弱性報告を行った際に、npmプロジェクトからは「対策する予定はない」との回答を得たとしている。

 npmプロジェクトは公式ブログで、この実装が持つ課題を当初から認識していたが、「ユーザーコミュニティーが拡大したことで、全ての人がこの問題を認識しなくなっていた」と、コメント。今回の脆弱性報告レポートの公開について「こうしたレポートが公開されたことは、課題認知の助けとなる」と評価している。

 npmプロジェクトでは、現在セキュリティベンダーの協力の下、セキュリティスキャンやリスク軽減サービスの導入を準備中だとしている。また、publishに二要素認証を導入する案も検討しているという。

 ただし、どんどんと登場するソフトウェアに対して、商用サービスで展開するスマホアプリのように検査するのは不可能だとしており、「npmは、レジストリに登録されているパッケージが安全であることを保証できない。もし、皆さんが悪意あるコードをレジストリに見つけたら、サポートに連絡してくれればテイクダウンする」とコメントしている。

 パッケージマネジャーは便利なツールであり、レジストリに公開されているものの多くは、オープンソースソフトウェアとして善意で提供されている。利用者側は、そのコンセプトを理解して注意深く利用し、ユーザーコミュニティーにも貢献する必要がある。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。