uvで簡単に依存関係の脆弱性情報を取得する方法

2025-12-05

はじめに

uvで簡単に脆弱性スキャンできないかな~と思ったけど、まだuvにその機能は実装されていないらしい。

という訳で既存の専用ライブラリである`pip-audit`を使うことになるが、uvを使ってる環境でシンプルに実行できるコマンドを組んだので備忘録として残します。

ちなみにissueは立ってるので、待ってればuv標準機能として来てくれるかな

本編

といってもコマンドは非常にシンプルで、`$ uvx pip-audit -r <(uv pip freeze)`とするだけ。

実行例

$ uvx pip-audit -r <(uv pip freeze)
Installed 29 packages in 85ms
Found 11 known vulnerabilities in 7 packages
Name         Version ID             Fix Versions
------------ ------- -------------- ------------
starlette    0.41.3  CVE-2025-54121 0.47.2
starlette    0.41.3  CVE-2025-62727 0.49.1
h11          0.14.0  CVE-2025-43859 0.16.0
jinja2       3.1.4   CVE-2024-56326 3.1.5
jinja2       3.1.4   CVE-2024-56201 3.1.5
jinja2       3.1.4   CVE-2025-27516 3.1.6
jupyter-core 5.7.2   CVE-2025-30167 5.8.1
requests     2.32.3  CVE-2024-47081 2.32.4
urllib3      2.2.3   CVE-2025-50182 2.5.0
urllib3      2.2.3   CVE-2025-50181 2.5.0
tornado      6.4.2   CVE-2025-47287 6.5

一応これだけで脆弱性のあるパッケージとその修正バージョン、CVEは取得できる。

……でもやっぱCVSSの情報も欲しいですよね

ということでCopilotにワンライナー組んでみてもらいました

$ output=$(uvx pip-audit -r <(uv pip freeze) 2>&1); \
cves=$(printf "%s\n" "$output" | grep -oE 'CVE-[0-9]{4,}-[0-9]+' | sort -u); \
map=$(printf "%s\n" "$cves" | while read -r cve; do \
  score=$(curl -s "https://cve.circl.lu/api/cve/${cve}" | jq -r '(.containers.cna.metrics // [] | map(.cvssV3_1.baseScore // .cvssV3.baseScore // .cvssV2.baseScore) | map(select(.!=null)) | .[0]) // "N/A"'); \
  printf "%s\t%s\n" "$cve" "$score"; \
done); \
awk 'BEGIN{ while((getline < ARGV[1])>0){split($0,a,"\t"); m[a[1]]=a[2]} delete ARGV[1]} { for(k in m) gsub(k, k " (CVSS=" m[k] ")"); print }' <(printf "%s" "$map") - <<< "$output"

実行結果

Found 11 known vulnerabilities in 7 packages
Name         Version ID             Fix Versions
------------ ------- -------------- ------------
starlette    0.41.3  CVE-2025-54121 (CVSS=5.3) 0.47.2
starlette    0.41.3  CVE-2025-62727 (CVSS=7.5) 0.49.1
h11          0.14.0  CVE-2025-43859 (CVSS=9.1) 0.16.0
jinja2       3.1.4   CVE-2024-56326 (CVSS=N/A) 3.1.5
jinja2       3.1.4   CVE-2024-56201 (CVSS=N/A) 3.1.5
jinja2       3.1.4   CVE-2025-27516 (CVSS=N/A) 3.1.6
jupyter-core 5.7.2   CVE-2025-30167 (CVSS=7.3) 5.8.1
requests     2.32.3  CVE-2024-47081 (CVSS=5.3) 2.32.4
urllib3      2.2.3   CVE-2025-50182 (CVSS=5.3) 2.5.0
urllib3      2.2.3   CVE-2025-50181 (CVSS=5.3) 2.5.0
tornado      6.4.2   CVE-2025-47287 (CVSS=7.5) 6.5

悪くないね

スポンサーリンク