0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

critical脆弱性の原因パッケージを特定する方法

0
Posted at

はじめに

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")の場合 → 他のパッケージ由来の脆弱性であることを示す。さらにそのパッケージを辿る必要がある
  • オブジェクトの場合 → そのパッケージ自体が脆弱性の発生源。titleseverityurl(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/mockervitevite-node の脆弱性も連鎖的に影響していた

5. 対応する

fixAvailable を見ると、vitest4.1.9 にアップデートすれば解消することが分かります。ただし isSemVerMajor: true となっているため、メジャーバージョンアップ(破壊的変更の可能性あり)である点に注意が必要です。

npm install vitest@4.1.9

インストール後は、既存のテストコードが問題なく動作するか必ず確認しましょう。

なお npm audit fix --force を実行すると vite なども巻き込んで一括更新されるため、影響範囲が読みにくくなります。原因パッケージを特定できた場合は、必要なパッケージだけをピンポイントで更新する方が安全です。

おわりに

npm audit の通常のテキスト出力は、脆弱性が連鎖している場合に情報が省略されることがあります。npm audit --json で全件出力し、severityvia フィールドを確認することで、critical脆弱性の原因パッケージを確実に特定できます。

特に isDirect: true かつ severity: critical のパッケージは優先的に対応すべき対象なので、まず絞り込んで確認する習慣をつけると安心です。

参考

JISOUのメンバー募集中!

プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか?
興味のある方は、ぜひホームページをのぞいてみてください!
▼▼▼
https://projisou.jp

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?