npm auditとnpm audit fixとは?実行結果の見方やオプションなどを解説!

この記事では『npm audit』について、

  • npm auditとは
  • npm auditの実行結果の見方
  • npm audit fixとは

などを分かりやすく説明するように心掛けています。ご参考になれば幸いです。

npm auditとは

npm auditはプロジェクトにインストールされているパッケージ(ライブラリやツール)の中に脆弱性のあるものが存在するかをチェックしてくれるコマンドです。

npm auditに関するコマンドを以下に示します。

  • npm audit
    • プロジェクトにインストールされているパッケージの脆弱性を確認する。
  • npm audit --json
    • プロジェクトにインストールされているパッケージの脆弱性を確認して、JSON形式で出力する。
    • 結果を他のツールでさらに処理する場合に便利です。
  • npm audit --omit=dev
    • Dependencys(本番環境の依存関係)に対して脆弱性を確認する。
    • npm audit単独では「Dependency(本番環境の依存関係)」と「DevDepndencys(開発時にのみ使用される依存関係)」の両方に対して脆弱性を確認する。
  • npm audit --audit-level=[level]
    • 特定の重大度レベル(low, moderate, high, critical)の脆弱性に限定して確認を行い、指定されたレベル以上の脆弱性のみを報告する。

補足

auditは「監査」や「監査する」といった意味があります。

では実際にnpm auditコマンドを事項してみましょう。実行結果の一例を以下に示します(2023年12月時点での実行結果です)。

PS C:\test> npm audit 
# npm audit report

axios  0.8.1 - 1.5.1
Severity: moderate
Axios Cross-Site Request Forgery Vulnerability - https://github.com/advisories/GHSA-wf5p-g6vw-rhxx
fix available via `npm audit fix`
# 省略(axiosの依存関係などが記載)

semver  <5.7.2
Severity: moderate
semver vulnerable to Regular Expression Denial of Service - https://github.com/advisories/GHSA-c2qf-rxjj-qqgw
fix available via `npm audit fix --force`
Will install prettier-eslint-cli@8.0.1, which is a breaking change
# 省略(semverの依存関係などが記載)

vite  4.5.0
Severity: moderate
Vite XSS vulnerability in `server.transformIndexHtml` via URL payload - https://github.com/advisories/GHSA-92r3-m2mg-pj97
fix available via `npm audit fix`
# 省略(viteの依存関係などが記載)

11 moderate severity vulnerabilities

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

上記の実行結果が確認された際のpackage.jsonを以下に示します。

{
  "dependencies": {
    "@angular-devkit/build-angular": "^17.0.5",
    "prettier-eslint-cli": "^5.0.1"
  }
}

npm auditの実行結果の見方

npm auditの実行結果より以下の内容が分かります。

  • 脆弱性があるパッケージ
  • 脆弱性があるパッケージの重大度レベル
  • 脆弱性の内容
  • 脆弱性の修正方法
  • 脆弱性の合計件数

脆弱性があるパッケージ

npm auditの実行結果より以下に示すように脆弱性があるパッケージが分かります。

  • axios 0.8.1 - 1.5.1
    • axiosの0.81~1.51のバージョンに脆弱性がある。
  • semver <5.7.2
    • semverの5.7.2以下のバージョンに脆弱性がある。
  • vite 4.5.0
    • viteの4.5.0のバージョンに脆弱性がある。

脆弱性があるパッケージの重大度レベル

npm auditの実行結果に記述されている以下の箇所は脆弱性の重大度レベルを示しています。

Severity: moderate

脆弱性の重大度レベルには以下の4種類あります。先ほどの実行結果では全てmoderate(中程度)の脆弱性でした。

脆弱性の重大度レベル推奨される対応
critical直ちに対応する
highできるだけ早く対応する
moderate時間が許す限り対応する
low対応するか否かはお任せする

脆弱性の内容

npm auditの実行結果の「重大度レベル」の下に記述されている以下の箇所は、どのような脆弱性があるかを示しており、githubのリンクにはさらに詳しい内容が記載されています。

Axios Cross-Site Request Forgery Vulnerability - https://github.com/advisories/GHSA-wf5p-g6vw-rhxx

脆弱性の修正方法

npm auditの実行結果の「脆弱性の内容」の下に記述されている以下の箇所は、脆弱性の修正方法が記述されています。

fix available via `npm audit fix`

上記はnpm audit fixコマンドを実行すれば脆弱性を修正できることを示しています。脆弱性の修正方法には以下の種類があります。

  • fix available via `npm audit fix`
    • npm audit fixコマンドを実行すれば脆弱性を修正できる。
  • fix available via `npm audit fix --force`
    • npm audit fix --forceコマンドを実行すれば脆弱性を修正できる。
  • No fix available
    • コマンドでは自動修正することができない。

脆弱性の合計件数

npm auditの実行結果の最後の方に記載されている以下の箇所は、脆弱性の合計件数を示しています。

11 moderate severity vulnerabilities

上記は重大度レベルmoderate(中程度)の脆弱性が11個発見されたことを意味しています。例えば、以下のような実行結果の場合には、脆弱性が12個あり、そのうち、moderateが6個、highが4個、criticalが2個発見されたことを意味しています。

12 vulnerabilities (6 moderate, 4 high, 2 critical)

脆弱性のあるパッケージの依存関係を確認する

npm ls <パッケージ名>を実行すると、パッケージのプロジェクト内での依存関係や実際にインストールされているパッケージのバージョンを確認することができます。

では実際にコマンドを実行してみましょう。以下のコマンドでは「axios」の依存関係を確認しています。

PS C:\test> npm ls axios
test@ C:\test
└─┬ @angular-devkit/build-angular@17.0.5
  └─┬ browser-sync@2.29.3
    └─┬ localtunnel@2.0.2
      └── axios@0.21.4 # このパッケージに脆弱性あり!

「@angular-devkit/build-angular@17.0.5」が「browser-sync@2.29.3」に依存しており、「browser-sync@2.29.3」が「localtunnel@2.0.2」に依存しており、「localtunnel@2.0.2」が脆弱性のある「axios@0.21.4」に依存していることが分かります。

親(@angular-devkit/build-angular@17.0.5)、子(browser-sync@2.29.3)、孫(localtunnel@2.0.2)、ひ孫(axios@0.21.4)みたいな感じですね。

「axios@0.21.4」をインストールした覚えがなくても、上記に示すように各パッケージが依存しているので、実際にはインストールされているのです。

npm audit fixとは

npm audit fixは脆弱性のあるパッケージを自動修正してくれるコマンドです。

npm audit fixに関するコマンドを以下に示します。

  • npm audit fix
    • 脆弱性があるパッケージを自動的に更新する。
    • メジャーバージョンが変わる場合には更新しません。マイナーバージョンまでの更新なので比較的安全な更新になります。
  • npm audit fix --force またはnpm audit fix -f
    • 脆弱性があるパッケージを自動的に更新する。
    • メジャーバージョンが変わる場合も更新します。そのため、現状のプロジェクトに対して互換性を無視した変更がされる場合があるので、慎重に対応する必要があります。
  • npm audit fix --only=prod
    • Dependencys(本番環境の依存関係)に対して脆弱性を確認する。
    • --productionを指定しても同じ結果が得られる。
  • npm audit fix --only=dev
    • devDependencys(開発時にのみ使用される依存関係)に対して脆弱性を確認する。
  • npm audit fix --package-lock-only
    • 脆弱性があるパッケージを更新することなく、「package-lock.json」ファイルのみを更新する。
  • npm audit fix --dry-run
    • npm audit fixコマンドを実行する前に、どのような変更が行われるかを確認する。
    • このオプションを使うと、実際の修正は行われないが、どのパッケージがどのように変更されるかが表示される。

本記事のまとめ

この記事では『npm audit』について、以下の内容を説明しました。

  • npm auditとは
  • npm auditの実行結果の見方
  • npm audit fixとは

お読み頂きありがとうございました。