npmで脆弱性を手動で修正

cesium-gsi-terrainを使いたく、npmでインストールすると脆弱性がある旨メッセージが表示された。この脆弱性に対する対応を記述する。

user@mac ~ % mkdir nodejs/cesium
user@mac ~ % cd nodejs/cesium
user@mac cesium % npm init -y
user@mac cesium % npm install cesium
user@mac cesium % npm install cesium-gsi-terrain

ここで3つのhighな脆弱性があると表示された。Node.js自体にまだまだ不慣れで脆弱性解消に時間がかかったので記録に残しておく。

user@mac cesium % npm audit

詳しくはこのコマンドを打てと言われるままにするとcesium-gsi-terrainが依存しているライブラリに脆弱性があることがわかった。依存関係は以下の通り。

cesium-gsi-terrain > axios > follow-redirects

自動解決する方法として以下のコマンドがあるのだが、これでは解決してくれなかった。

user@mac cesium % npm audit fix

最後のfollow-redirectsに脆弱性があるらしいのだが、axiosとfollow-redirectsを調べると両方ともバージョンが古いことがわかった。axiosをバージョンアップしてみた。

user@mac cesium % npm install axios

インストールされたaxiosのバージョンを確認すると最新版になっているのだが、以下のコマンドで確認するとcesium-gsi-terrainは古いバージョンのaxiosを参照している。

user@mac cesium % npm ls axios

ここからが解決方法で、cesium-gsi-terrainディレクトリにあるpackage.jsonを書き換える。

user@mac cesium % vi node_modules/cesium-gsi-terrain/package.json

ここでaxiosのバージョンに関する記述があるので、まずこれを新しくインストールしたaxiosのバージョン番号に書き換えた。そして以下のコマンドを実行。

user@mac cesium % rm -rf node_modules/cesium-gsi-terrain/node_modules/
user@mac cesium % rm package-lock.json
user@mac cesium % npm install

インストールしたaxiosのバージョンが新しくなってしまったので、npmが旧バージョンを自動インストールしてしまっているらしくそれをまず削除。その後、依存関係が記述されているpackage-lock.jsonを削除して、再作成している。

user@mac cesium % npm audit

最後に再度脆弱性の有無を確認し、脆弱性がなくなったことを確認した。手順が多くてやや不満ではあるけど、とにかく解消できてよかった。3時間以上悩み続けてしまった。