目次
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 というツールを使うことにします。そちらのページに書いてある通りに進めます。
まずは、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 の指摘が表示されますので、その場合はちゃんと対応することをお勧めします。





