はじめに
npm audit を実行すると、依存パッケージの脆弱性情報がターミナルに表示されます。ですが、脆弱性が連鎖している場合、通常のテキスト出力では一部の情報が省略され、critical(緊急)な脆弱性の原因パッケージを見失ってしまうことがあります。
本記事では、npm audit --json で出力したJSONファイルの構造の読み方と、critical脆弱性の原因パッケージを特定する方法、そして実際の対応例を紹介します。
問題
以下のように npm audit を実行したところ、esbuildのmoderate(中)な脆弱性は表示されたものの、要約行には次のように出ていました。
5 vulnerabilities (3 moderate, 1 high, 1 critical)
しかし、通常のテキスト出力ではesbuild関連の連鎖しか表示されず、critical脆弱性の詳細がどこにあるのか分かりませんでした。
解決方法
1. JSON形式で全件を出力する
まず、全ての脆弱性情報を漏れなく取得するために、JSON形式で出力します。
npm audit --json > audit.json
2. severityで絞り込む
audit.json の中の vulnerabilities オブジェクトには、パッケージ名ごとに脆弱性情報が格納されています。severity フィールドで critical のものだけを抽出できます。
jqコマンドが使える場合:
npm audit --json | jq -r '.vulnerabilities | to_entries[] | select(.value.severity=="critical") | .key'
PowerShellの場合:
(npm audit --json | ConvertFrom-Json).vulnerabilities.PSObject.Properties |
Where-Object { $_.Value.severity -eq "critical" } |
Select-Object Name, @{n="severity";e={$_.Value.severity}}
3. JSONの構造を理解する
各パッケージのエントリは、次のような構造になっています。
"パッケージ名": {
"severity": "深刻度", // info / low / moderate / high / critical
"isDirect": true, // package.jsonで直接指定しているか
"via": [ ... ], // 脆弱性の発生源
"effects": [ ... ], // このパッケージが影響を与える先
"range": "影響を受けるバージョン範囲",
"fixAvailable": { ... } // 修正方法
}
ポイントは via フィールドです。
-
文字列(例:
"vite")の場合 → 他のパッケージ由来の脆弱性であることを示す。さらにそのパッケージを辿る必要がある -
オブジェクトの場合 → そのパッケージ自体が脆弱性の発生源。
title・severity・url(GitHub Advisoryへのリンク)・cvss(深刻度スコア)に具体的な情報が入っている
effects は、その脆弱性が波及して影響する下流のパッケージ一覧です。
4. 実際にcritical脆弱性を特定する
今回のケースでは metadata.vulnerabilities.critical: 1 となっており、該当エントリは以下の通りでした。
"vitest": {
"severity": "critical",
"isDirect": true,
"via": [
"@vitest/mocker",
{
"title": "When Vitest UI server is listening, arbitrary file can be read and executed",
"url": "https://github.com/advisories/GHSA-5xrq-8626-4rwp",
"severity": "critical",
"cvss": { "score": 9.8 },
"range": "<3.2.6"
},
"vite",
"vite-node"
],
"fixAvailable": {
"name": "vitest",
"version": "4.1.9",
"isSemVerMajor": true
}
}
これにより、critical脆弱性の原因パッケージは vitest であることが分かりました。
-
isDirect: trueなので、package.jsonに直接記載されている依存パッケージ - Vitest UIサーバー起動時に任意のファイルを読み取り・実行できてしまう脆弱性(CVSSスコア9.8)
- 影響を受けるバージョンは
<3.2.6 -
@vitest/mocker・vite・vite-nodeの脆弱性も連鎖的に影響していた
5. 対応する
fixAvailable を見ると、vitest を 4.1.9 にアップデートすれば解消することが分かります。ただし isSemVerMajor: true となっているため、メジャーバージョンアップ(破壊的変更の可能性あり)である点に注意が必要です。
npm install vitest@4.1.9
インストール後は、既存のテストコードが問題なく動作するか必ず確認しましょう。
なお npm audit fix --force を実行すると vite なども巻き込んで一括更新されるため、影響範囲が読みにくくなります。原因パッケージを特定できた場合は、必要なパッケージだけをピンポイントで更新する方が安全です。
おわりに
npm audit の通常のテキスト出力は、脆弱性が連鎖している場合に情報が省略されることがあります。npm audit --json で全件出力し、severity や via フィールドを確認することで、critical脆弱性の原因パッケージを確実に特定できます。
特に isDirect: true かつ severity: critical のパッケージは優先的に対応すべき対象なので、まず絞り込んで確認する習慣をつけると安心です。
参考
JISOUのメンバー募集中!
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか?
興味のある方は、ぜひホームページをのぞいてみてください!
▼▼▼
https://projisou.jp