公開日:2016/03/29 最終更新日:2016/03/29

JVNVU#96681018
Node.js のパッケージマネージャ npm が不正なパッケージの動作を制限しない問題

概要

npm には、ワームプログラムの感染拡大を許す問題が存在します。

影響を受けるシステム

  • Node.js のパッケージマネージャ npm

詳細情報

npm は、サーバサイドのウェブアプリケーションを開発するための実行環境である Node.js のパッケージマネージャです。npm には、ワームプログラムの感染拡大を許す問題が存在します:

  1. npm はセマンティックバージョニング (semver) の使用を推奨しています。セマンティックバージョニングでは、依存関係にあるパッケージのバージョンは固定されておらず、依存パッケージの作者は、自由にアップデートバージョンをプッシュできるようになっています。
  2. npm は、npm サーバへのログイン状態を維持しています。ログインすると、手動で操作しない限りログアウトすることはありません。ログイン済みユーザが npm install コマンドを実行することで、新たなバージョンのパッケージを publish させられる可能性があります。
  3. npm は、Node.js 環境で広く使われている集中型のレジストリをそのまま使用しています。npm publish コマンドを実行することで、レジストリサーバにコードを公開することができ、他のユーザがインストールできるようになります。
これら 3つの要素が揃うことで、自己複製型のワームプログラムが動作可能となります。Sam Saccone のレポートでは、ワームが動作するワークフローの概要を次のように例示しています:
  1. ユーザを誘導し、細工したモジュールをユーザ自身の環境にインストールさせる
  2. ワームプログラムは、新しい npm モジュールを生成する
  3. ワームプログラムは、インストール時にワームプログラムが実行されるようにこのモジュールを設定する
  4. ワームプログラムは、このモジュールをユーザのアカウントで公開する
  5. ワームプログラムは、ユーザが publish 権限を持っている全てのモジュールに対して、新たに作成したモジュールに依存するよう改ざんする
  6. ワームプログラムは、これら改ざんしたモジュールを、semver の "バグフィックス" レベルを示すアップデートバージョンとして、publish する。これによって、依存するモジュールのバージョンを記号 ^ または ~ で指定している大多数のモジュールが、次回のインストール時に自己複製型のモジュールを埋め込まれる
Sam Saccone のレポートに記載されているタイムラインは次の通りです。

2016/01/01 悪用可能であることを発見
2016/01/04 再現手順と情報を npm に通知
2016/01/05 Facebook に通知
2016/01/07 npm から応答
2016/01/08 npm から、その時点で修正する予定はないとの意思表示
2016/02/05 レポートの公開

想定される影響

ユーザのパッケージインストール操作によって感染を拡大する自己複製型のワームプログラムを作成される可能性があります。

対策方法

2016年3月29日現在、有効な対策方法は不明です。npm プロジェクトの見解については、ブログを参照してください。

ワークアラウンドを実施する
次のワークアラウンドを実施することで、本脆弱性の影響を軽減することが可能です。

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

参考情報

  1. CERT/CC Vulnerability Note VU#319816
    npm fails to restrict the actions of malicious npm packages
  2. Sam Saccone
    npm hydra worm disclosure

JPCERT/CCからの補足情報

JPCERT/CCによる脆弱性分析結果

CVSS v3 CVSS:3.0/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L
基本値: 6.5
攻撃元区分(AV) 物理 (P) ローカル (L) 隣接 (A) ネットワーク (N)
攻撃条件の複雑さ(AC) 高 (H) 低 (L)
必要な特権レベル(PR) 高 (H) 低 (L) 不要 (N)
ユーザ関与レベル(UI) 要 (R) 不要 (N)
スコープ(S) 変更なし (U) 変更あり (C)
機密性への影響(C) なし (N) 低 (L) 高 (H)
完全性への影響(I) なし (N) 低 (L) 高 (H)
可用性への影響(A) なし (N) 低 (L) 高 (H)
CVSS v2 AV:N/AC:M/Au:S/C:P/I:P/A:P
基本値: 6.0
攻撃元区分(AV) ローカル (L) 隣接 (A) ネットワーク (N)
攻撃条件の複雑さ(AC) 高 (H) 中 (M) 低 (L)
攻撃前の認証要否(Au) 複数 (M) 単一 (S) 不要 (N)
機密性への影響(C) なし (N) 部分的 (P) 全面的 (C)
完全性への影響(I) なし (N) 部分的 (P) 全面的 (C)
可用性への影響(A) なし (N) 部分的 (P) 全面的 (C)

謝辞

関連文書

JPCERT 緊急報告
JPCERT REPORT
CERT Advisory
CPNI Advisory
TRnotes
CVE
JVN iPedia