JavaScript

npm パッケージのセキュリティをチェックして必要なら対応する

※当サイトにはプロモーションが含まれています。

投稿日:2019年3月20日 更新日:

1. npm パッケージのセキュリティ

以下の 2つのコマンドを取り上げます。

npm audit コマンド

あるプロジェクトのディレクトリ内で使用している npm パッケージのセキュリティをチェックするには、npm auditコマンドを使います。

npm auditコマンドを実行して問題のあるパッケージが見つかった場合、通常はパッケージを更新して対応することになります。

npm outdated コマンド

脆弱性を持ったバージョンのパッケージの使用を避けるには、日頃からパッケージを更新することが大切です。更新可能なパッケージを表示するには、npm outdatedコマンドを使います。

2. 実際にこれらのコマンドを利用してみる

実際に2つのコマンドを使った時の様子を紹介します。

前提

  • myProject1 という名前のプロジェクト・ディレクトリで作業をすることとします。
  • 環境:Ubuntu 18.04 LTS (WSL)

1. セキュリティのチェックと対応

まず npm auditコマンドで、セキュリティの問題を持ったパッケージを調査します。

$ npm audit

                       === npm audit security report ===


# Run  npm install --save-dev [email protected]  to resolve 2 vulnerabilities
SEMVER WARNING: Recommended action is a potentially breaking change
┌───────────────┬────────────────────┐
│ Low          │ Regular Expression Denial of Service                   │
├───────────────┼────────────────────┤
│ Package      │ debug                                                  │
├───────────────┼────────────────────┤
│ Dependency of │ mocha [dev]                                           │
├───────────────┼────────────────────┤
│ Path         │ mocha > debug                                          │
├───────────────┼────────────────────┤
│ More info    │ https://nodesecurity.io/advisories/534                 │
└───────────────┴────────────────────┘

┌───────────────┬────────────────────┐
│ Critical     │ Command Injection                                      │
├───────────────┼────────────────────┤
│ Package      │ growl                                                  │
├───────────────┼────────────────────┤
│ Dependency of │ mocha [dev]                                           │
├───────────────┼────────────────────┤
│ Path         │ mocha > growl                                          │
├───────────────┼────────────────────┤
│ More info    │ https://nodesecurity.io/advisories/146                 │
└───────────────┴────────────────────┘

# Run  npm install --save-dev [email protected]  to resolve 1 vulnerability
SEMVER WARNING: Recommended action is a potentially breaking change
┌───────────────┬────────────────────┐
│ Moderate     │ Regular Expression Denial of Service                   │
├───────────────┼────────────────────┤
│ Package      │ mime                                                   │
├───────────────┼────────────────────┤
│ Dependency of │ url-loader [dev]                                      │
├───────────────┼────────────────────┤
│ Path         │ url-loader > mime                                      │
├───────────────┼────────────────────┤
│ More info    │ https://nodesecurity.io/advisories/535                 │
└───────────────┴────────────────────┘

found 3 vulnerabilities (1 low, 1 moderate, 1 critical) in 7251 scanned packages
  3 vulnerabilities require semver-major dependency updates.

問題が3つ見つかりました。

出力された中に、問題のあるパッケージのバージョンを更新する2つのコマンドが指示されています。

npm install --save-dev [email protected]
  と
npm install --save-dev [email protected]

これらを順番に実行していきます。

まず1つ目のコマンドです。

$ npm install --save-dev [email protected]
npm WARN [email protected] requires a peer of mocha@^2.0.0|| ^3.0.0 || ^4.0.0 || ^5.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] scripts['server'] should probably be scripts['start'].
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

+ [email protected]
added 79 packages from 33 contributors, removed 13 packages, updated 7 packages and audited 8350 packages in 37.584s
found 1 moderate severity vulnerability
  run `npm audit fix` to fix them, or `npm audit` for details

次に2つ目のコマンドです。

$ npm install --save-dev [email protected]
npm WARN rollback Rolling back [email protected] failed (this is probably harmless): EINVAL: invalid argument, scandir '/mnt/c/Users/foo/repositories/github/laboradian/myProject1/node_modules/fsevents/node_modules'
npm WARN [email protected] requires a peer of mocha@^2.0.0|| ^3.0.0 || ^4.0.0 || ^5.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] scripts['server'] should probably be scripts['start'].
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})


+ [email protected]
added 6 packages from 2 contributors, updated 2 packages and audited 8359 packages in 26.032s
found 0 vulnerabilities

では、再度 npm audit コマンドを実行してみましょう。

$ npm audit

                       === npm audit security report ===

found 0 vulnerabilities
in 8359 scanned packages

何も引っ掛からなくなりました。

2. 古いパッケージを更新する

セキュリティの問題は見つからなかったもののバージョンが古くなっているパッケージを調べます。

$ npm outdated
Package               Current   Wanted  Latest  Location
babel-loader            7.1.5    7.1.5   8.0.5  myProject1
babel-plugin-espower    2.4.0    2.4.0   3.0.1  myProject1
css-loader            0.28.11  0.28.11   2.1.1  myProject1
eslint                 4.19.1   4.19.1  5.15.3  myProject1
eslint-loader           1.9.0    1.9.0   2.1.2  myProject1
file-loader            0.11.2   0.11.2   3.0.1  myProject1
mocha-loader            1.1.3    1.1.3   2.0.1  myProject1
sass-loader             6.0.7    6.0.7   7.1.0  myProject1
style-loader           0.18.2   0.18.2  0.23.1  myProject1
webpack                3.12.0   3.12.0  4.29.6  myProject1

結構ありました。

これらを更新するには、npm のパッケージを最新版に更新する でも説明した npm-check-updates というツールを使うことにします。そちらのページに書いてある通りに進めます。

JavaScript

npm のパッケージを最新版に更新する

2019.03.19

まずは、npm-check-updates の ncuコマンドで、あらためてパッケージのバージョンをチェックします。

$ ncu
Checking /mnt/c/Users/foo/repositories/github/laboradian/myProject1/package.json
[====================] 19/19 100%


jquery                              ^3.2.1  →   ^3.3.1
babel-core                         ^6.25.0  →  ^6.26.3
babel-loader                        ^7.1.1  →   ^8.0.5
babel-plugin-espower                ^2.3.2  →   ^3.0.1
babel-preset-env                    ^1.5.2  →   ^1.7.0
bootstrap-sass                      ^3.3.7  →   ^3.4.1
css-loader                         ^0.28.4  →   ^2.1.1
eslint                              ^4.1.1  →  ^5.15.3
eslint-loader                       ^1.8.0  →   ^2.1.2
extract-text-webpack-plugin  ^3.0.0-beta.3  →   ^3.0.2
file-loader                        ^0.11.2  →   ^3.0.1
mocha-loader                        ^1.1.1  →   ^2.0.1
node-sass                           ^4.5.3  →  ^4.11.0
power-assert                        ^1.4.4  →   ^1.6.1
sass-loader                         ^6.0.6  →   ^7.1.0
style-loader                       ^0.18.2  →  ^0.23.1
webpack                             ^3.0.0  →  ^4.29.6


Run ncu -u to upgrade package.json

npm outdatedコマンドで出力された以外のパッケージ名も表示されています。

一番最後のところに書いてある通り、次は ncu -uコマンドを実行して package.json ファイルを更新します。

$ ncu -u
Upgrading /mnt/c/Users/foo/repositories/github/laboradian/myProject1/package.json
[====================] 19/19 100%


jquery                              ^3.2.1  →   ^3.3.1
babel-core                         ^6.25.0  →  ^6.26.3
babel-loader                        ^7.1.1  →   ^8.0.5
babel-plugin-espower                ^2.3.2  →   ^3.0.1
babel-preset-env                    ^1.5.2  →   ^1.7.0
bootstrap-sass                      ^3.3.7  →   ^3.4.1
css-loader                         ^0.28.4  →   ^2.1.1
eslint                              ^4.1.1  →  ^5.15.3
eslint-loader                       ^1.8.0  →   ^2.1.2
extract-text-webpack-plugin  ^3.0.0-beta.3  →   ^3.0.2
file-loader                        ^0.11.2  →   ^3.0.1
mocha-loader                        ^1.1.1  →   ^2.0.1
node-sass                           ^4.5.3  →  ^4.11.0
power-assert                        ^1.4.4  →   ^1.6.1
sass-loader                         ^6.0.6  →   ^7.1.0
style-loader                       ^0.18.2  →  ^0.23.1
webpack                             ^3.0.0  →  ^4.29.6


Run npm install to install new versions.

あとは、npm installコマンドを実行して実際にパッケージを更新するだけです。

$ npm install

3. おわりに

パッケージのバージョンを更新した際には、そのパッケージを利用しているコードの修正が必要になることがあります(一部の関数が廃止されていたり、そもそも記述方法が変更されていたりするため)。この作業の面倒さが、パッケージの更新に消極的になる理由の1つだと思います。その場合も、せめて npm audit で問題が検知されたパッケージだけは更新するようにしましょう。npm install コマンドを実行した際にも、audit の指摘が表示されますので、その場合はちゃんと対応することをお勧めします。

📂-JavaScript

執筆者:labo


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Web Security

JavaScript の alert は CPUにたいした負荷を掛けないしタブを閉じれば終了します

以下の話題について書きます。 不正プログラム書き込み疑い補導 03月04日 20時04分 クリックすると同じ画面が表示され、消えなくなる不正なプログラムのアドレスをインターネットの掲示板に書き込んだと …

JavaScript

JavaScriptの特定の機能がどのバージョンで導入されたかを調べる

JavaScript の特定の機能がどのバージョンから導入されたか調べる方法を紹介します。

Node.js

npm install コマンドで出力される「npm warn deprecated」という警告

Ubuntu 24.04.3 LTS (WSL 2)のシェル上で 以下のコマンドを実行したところ、 $ npm install -g @google/gemini-cli 出力された中に以下のメッセー …

JavaScript

Node.js のバージョン管理ツール nvm の使い方

目次1. nvm とは?2. nvm の導入1. すでに nvm がインストールされているかチェックする2. nvm をインストールします3. Node.js のインストール4. nvm の便利なコマ …

JavaScript

【JavaScript】無名関数とアロー関数とイベントリスナーのthis

目次1. はじめに2. イベントリスナーの登録無名関数を使う場合アロー関数を使う場合3. まとめ4. 参考 1. はじめに あるHTMLにおいて、以下のようにボタンが存在しており、このボタンのクリック …