Skip to content

ci: scan dependencies for known vulnerabilities with uv audit - #14

Merged
furedea merged 1 commit into
mainfrom
ci/add-uv-audit
Nov 2, 2026
Merged

furedea merged 1 commit into
mainfrom
ci/add-uv-audit

Conversation

@furedea-agent

@furedea-agent furedea-agent Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

概要

CI の audit ジョブに uv audit --preview-features audit を追加し,既知の脆弱性を持つ依存があれば CI を失敗させる.既存の audit ジョブは deptry と vulture(未使用の依存とコード)のみで,脆弱性スキャンはなかった(Rust テンプレートは cargo-deny,Go テンプレートは govulncheck で実施している).

変更内容

  • .github/workflows/ci.yml: audit ジョブの末尾に Run uv audit ステップを追加した.最上位の UV_LOCKED: "1" が効くため,--locked は付けていない.
  • lefthook には追加していない(ネットワークを使い遅いため).justfile や CI チェックを列挙したドキュメント,AGENTS.md は存在しないため,ドキュメントは変更していない.

pip-audit ではなく uv audit を選んだ理由

  • uv に組み込まれており,uv.lock をそのまま読む.pip-audit のように uv export で requirements を書き出したり,依存グループを追加したりする必要がない.
  • 問い合わせ先は OSV(https://api.osv.dev/)で,PyPI Advisory(PYSEC)と GHSA を含む.
  • リスク:preview 機能(PreviewFeature::AuditCommand)であり,フラグ名,出力,終了コードが予告なく変わりうる.uv を上げたときにこのステップが壊れた場合は,CI の失敗で検知できる.

グループの扱い

既定のまま全グループを監査する.uv 0.13.5 の uv audit には --all-groups がなく,既定で全グループが対象になる.

  • 既定:16 パッケージ(default-groups に含まれない audit グループの deptry と vulture の依存も含む)
  • --no-group audit: 11 パッケージ
  • --no-default-groups: 0 パッケージ

開発用ツールも CI で実行されるため,サプライチェーンの対象として監査に含める.

uv のバージョン確認

  • CI と devShell で固定している uv 0.13.5 に uv audit があることを確認した.フラグなしでは --preview-features audit-command を勧める警告が出る.alias の audit でも警告なしで有効になる.
  • uv audit reports "no known vulnerabilities" (exit 0) when the OSV querybatch response has fewer results than queries astral-sh/uv#22102(OSV の querybatch 応答が問い合わせより少ないとき「脆弱性なし」で終了 0 になる問題)は修正されていない.報告者自身が「実際の環境では未観測で,応答を操作できる者は元から検出結果を隠せるためセキュリティ境界ではない」としてクローズした.main の crates/uv-audit/src/service/osv.rs も件数を照合しない zip のままである.そのため,バージョンを上げても得るものはなく,0.13.5 のままにした.本プロジェクトの依存数(16)はバッチ上限(1,000)を大きく下回る.

検証

devShell の uv 0.13.5 で,api.osv.dev への接続を許可して実行した.

  • UV_LOCKED=1 uv audit --preview-features audit: 16 パッケージに既知の脆弱性なし,終了コード 0
  • 脆弱な jinja2==2.10 を依存に持つ使い捨てプロジェクト:12 件を検出し,終了コード 1(既知の脆弱性があれば CI が失敗することを確認)
  • lefthook(pre-commit,commitlint): 通過
  • actionlint は devShell に含まれないため,CI の GitHub Actions Lint に任せた

レビュー

Codex による読み取り専用のレビューを 1 回実施した.P0〜P3 の指摘はなし(actionlint も Codex 側で通過).

🤖 Generated with Claude Code

Run uv's preview audit command in the audit job so a dependency with a known
OSV advisory fails CI. It audits every dependency group by default,
including the non-default audit group.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@furedea
furedea merged commit adb4ef5 into main Nov 2, 2026
12 checks passed
@furedea
furedea deleted the ci/add-uv-audit branch November 2, 2026 05:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant