公開日:2016/03/29 最終更新日:2016/03/29
JVNVU#96681018
Node.js のパッケージマネージャ npm が不正なパッケージの動作を制限しない問題
npm には、ワームプログラムの感染拡大を許す問題が存在します。
- Node.js のパッケージマネージャ npm
npm は、サーバサイドのウェブアプリケーションを開発するための実行環境である Node.js のパッケージマネージャです。npm には、ワームプログラムの感染拡大を許す問題が存在します:
- npm はセマンティックバージョニング (semver) の使用を推奨しています。セマンティックバージョニングでは、依存関係にあるパッケージのバージョンは固定されておらず、依存パッケージの作者は、自由にアップデートバージョンをプッシュできるようになっています。
- npm は、npm サーバへのログイン状態を維持しています。ログインすると、手動で操作しない限りログアウトすることはありません。ログイン済みユーザが
npm install
コマンドを実行することで、新たなバージョンのパッケージを publish させられる可能性があります。 - npm は、Node.js 環境で広く使われている集中型のレジストリをそのまま使用しています。
npm publish
コマンドを実行することで、レジストリサーバにコードを公開することができ、他のユーザがインストールできるようになります。
- ユーザを誘導し、細工したモジュールをユーザ自身の環境にインストールさせる
- ワームプログラムは、新しい npm モジュールを生成する
- ワームプログラムは、インストール時にワームプログラムが実行されるようにこのモジュールを設定する
- ワームプログラムは、このモジュールをユーザのアカウントで公開する
- ワームプログラムは、ユーザが publish 権限を持っている全てのモジュールに対して、新たに作成したモジュールに依存するよう改ざんする
- ワームプログラムは、これら改ざんしたモジュールを、semver の "バグフィックス" レベルを示すアップデートバージョンとして、publish する。これによって、依存するモジュールのバージョンを記号
^
または~
で指定している大多数のモジュールが、次回のインストール時に自己複製型のモジュールを埋め込まれる
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
-
CERT/CC Vulnerability Note VU#319816
npm fails to restrict the actions of malicious npm packages -
Sam Saccone
npm hydra worm disclosure
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) |