Aller au contenu principal
友田 陽大
Dependabot & dependency automation
Dependabot
サプライチェーンセキュリティ
脆弱性管理
EPSS
DevSecOps
セキュリティ

Dependabot アラート優先順位付け完全ガイド:CVSS × EPSS × 到達可能性で『どれから直すか』を決める

Dependabot のアラートが二桁溜まったとき、どれから直すべきか。深刻度(CVSS)だけで並べると優先順位を誤ります。公式ドキュメントに忠実に、CVSS(影響の大きさ)と EPSS(攻撃される確率・FIRST が毎日更新)を2軸で組み合わせ、到達可能性・依存スコープ・auto-triage rules(severity/EPSS/scope でマッチ)・REST API での棚卸しまで、アラート疲れを断ち『本当に危険な少数』に集中するトリアージ設計を実コードで解説します。

Published
Reading time
9 min read
Author
友田 陽大
Partager

Dependabot のアラートバッジが二桁になった。さて、どれから直すか——ここで多くのチームが手を止めます。よくある反応は「深刻度(Critical/High)の高い順に」。一見正しそうで、実は優先順位を誤るのが最大の罠です。深刻度は「もし悪用されたらどれだけ痛いか」しか語らず、「そもそも悪用されるのか」を語らないからです。

この記事はDependabot 本番運用ガイドの各論として、「どれから直すか」の順位付けにフォーカスします。有効化・SLA・auto-triage の運用そのものはアラート・セキュリティ更新ガイドに譲り、ここでは CVSS × EPSS × 到達可能性という3つの軸で、アラート疲れを断ち「本当に危険な少数」に集中するトリアージ設計を解説します。

この記事のルール:EPSS/CVSS の定義は FIRST の一次情報に、Dependabot の挙動は GitHub 公式ドキュメント(2026年7月時点) に忠実です。EPSS は「確率」であって「確定した予言」ではありません。数値は必ず最新を確認し、組織の文脈(公開/社内・規制業種か)で解釈してください。


1. なぜ深刻度(CVSS)だけでは優先順位を誤るのか

CVSS(Common Vulnerability Scoring System) は、脆弱性の深刻度=影響の大きさを 0〜10 で表す静的なスコアです。GitHub Advisory Database は、メンテナが割り当てた CVSS v4.0 / v3.1 / v3.0 を取り込み、Dependabot のアラートに severity(Critical/High/Medium/Low)として表示します。

CVSS は「もし悪用されたらどれだけ痛いか」を測る優れた指標ですが、決定的に欠けているものがあります——「実際に悪用されるのか」です。世の中には CVSS 9.x でも現実にはほぼ攻撃されない脆弱性が大量にあり、逆に CVSS が中程度でも攻撃が観測されているものがあります。深刻度の降順に並べて上から潰すと、めったに攻撃されない Critical に工数を溶かし、いま攻撃が来ている脆弱性を後回しにする——これが「深刻度ソートの罠」です。

GitHub のたとえが分かりやすい:CVSS は「家に侵入されたときの被害の大きさ」、EPSS は「実際に誰かが侵入を試みる可能性」。両方を見なければ、リスクの全体像は描けません。


2. EPSS:攻撃される「確率」を測る

EPSS(Exploit Prediction Scoring System) は、FIRST が公開するデータ駆動の機械学習モデルで、「公開済みの CVE が今後30日以内に実世界で悪用される確率」を 0〜1(0〜100%) で推定します。

要点は次のとおり(FIRST 公式):

  • 意味:スコアが高いほど、その脆弱性が近い将来に実際に攻撃される確率が高い
  • 更新頻度毎日、全 CVE 分が更新され、CSV / API で公開される。
  • percentile(パーセンタイル):絶対確率に加え、「全 CVE の中での相対的な位置」も提供される。
  • CVSS との違い:CVSS が主観的な深刻度を測るのに対し、EPSS は観測された悪用の実証的シグナルで「悪用の見込み」を測る。severity(重大さ)と likelihood(見込み)は別物です。

つまり EPSS は、CVSS が答えられない「この脆弱性は、この1か月で実際に狙われるのか?」に確率で答えます。両者は競合ではなく補完です。


3. CVSS × EPSS の2軸マトリクスで捌く

順位付けの実装は、2軸のマトリクスに落とすと迷いません。

EPSS 高(攻撃が来ている)EPSS 低(まだ悪用兆候なし)
CVSS 高(被害大)最優先:即時パッチ&デプロイ計画的に対応(監視しつつ次の定例更新で)
CVSS 低(被害小)監視・緩和(悪用は多いが影響は限定的)後回し(多くはノイズ。auto-triage の dismiss 候補)

GitHub 自身がこの考え方を例で示しています——「EPSS 85%・CVSS 9.8」の脆弱性は、「EPSS 0.5%・CVSS 9.0」の脆弱性より“ほぼ常に”優先すべき。どちらも severity は Critical ですが、攻撃される確率が桁違いだからです。深刻度だけを見ていると、この2つは「同じ Critical」として並んでしまいます。

なぜ少数集中が効くのか:EPSS の研究では、EPSS で優先順位を付ければ、ごく一部の脆弱性に絞って対処するだけで、実際に悪用される脆弱性の大半をカバーできると報告されています。「全部直す」ではなく「危険な少数を確実に直す」ほうが、有限のエンジニア工数に対してはるかに費用対効果が高い——これが EPSS ベースのトリアージの経済的な根拠です。


4. 第3の軸:到達可能性と依存スコープ

CVSS × EPSS で「世の中的な危険度」は測れます。しかし最後の問いが残ります——「その脆弱性は、自分たちのアプリで本当に踏めるのか?」。これが**到達可能性(reachability)**です。

ここで重要な事実:Dependabot は依存グラフ上に脆弱な依存が“存在するか”で検知します。自分のコードが、その脆弱な関数を実際に呼び出すかどうかまでは判定しません。依存として入っているだけで実際には到達しないコードパスの脆弱性は、理論上のリスクにとどまることがあります。

厳密な到達可能性解析は別ツールの領域ですが、実務ではまず依存スコープ(dev / prod)を代理指標にします。

  • 本番依存(production scope):実行時にユーザー入力を処理し得る。到達可能性が高いとみなす。
  • 開発依存(development scope):ビルド・テスト時のみ。本番の攻撃面に露出しにくく、到達可能性が低いことが多い(CI 環境自体の保護は別途必要)。

したがって最終的な優先順位は、CVSS(影響)× EPSS(確率)× 到達可能性(本番で踏むか) の3軸で決めます。「本番依存 × 高 CVSS × 高 EPSS」が最優先、「開発依存 × 低 CVSS × 低 EPSS」は auto-triage で自動 dismiss、という具合です。


5. GitHub 上での実践

5.1 EPSS でアラートを並べ替える

GitHub は 2025年2月から Dependabot アラートに EPSS スコアを表示しています(GitHub Enterprise Server は 3.17 以降)。EPSS は FIRST から毎日同期されます。アラート一覧を EPSS の高い順にソートすれば、「攻撃が来ている脆弱性」を最初に手に取れます。深刻度フィルタと併用し、Critical/High かつ 高 EPSS を最上段に集めるのが基本動作です。

5.2 auto-triage rules で「通知の前に」ノイズを断つ

auto-triage rules(自動トリアージ)は、severity・EPSS・scope・package name・CVE・ecosystem・manifest location といったメタデータでアラートにマッチし、通知が飛ぶ前に自動で dismiss / snooze する仕組みです。EPSS を条件に使えるのが強力で、たとえば次のようなポリシーを機械化できます。

  • 開発依存(dev scope)かつ 低 EPSS のアラートは自動 dismiss」——本番到達も攻撃確率も低いものを、そもそも通知しない。
  • 高 EPSS は severity に関わらず必ず残す」——確率が高いものを取りこぼさない。

ルールは通知の前に適用されるため、「後でフィルタ」ではなく「そもそも上げない」を実現します。自動 dismiss は「本番に影響しないと論証できるもの」に限定し、判断がログに残る運用にしてください。

5.3 REST API で「未対応の危険」を棚卸しする

回すには計測が要ります。Dependabot アラートは REST API で取得できるので、未対応(open)× Critical/High をダッシュボード化し、SLA 違反を早期検知します。

# Critical / High の未対応アラートだけを抽出(棚卸し・可観測化の起点)
gh api \
  -H "Accept: application/vnd.github+json" \
  "/repos/{owner}/{repo}/dependabot/alerts?state=open&severity=critical,high" \
  --jq '.[] | {number, severity: .security_advisory.severity, package: .dependency.package.name, ghsa: .security_advisory.ghsa_id}'

Organization 横断なら /orgs/{org}/dependabot/alerts を使い、EPSS の高い順に人手のレビュー順を決めます。「未対応の高 EPSS が滞留していないか」を一目で見られる状態が、形骸化を防ぐ最後の砦です。SLA そのものの設計はアラート・セキュリティ更新ガイドへ。


6. 優先順位ポリシーを明文化する

トリアージは「その場の勘」ではなく明文化されたポリシーで回します。世界最高峰を名乗るなら、次を言語化してチームで共有します。

  • 順位付けの式:本番到達 × EPSS × CVSS の優先順(例:本番 × EPSS≥高 × Critical を最上位)。
  • 自動 dismiss の境界:どの scope・EPSS 帯を auto-triage で落とすか、その論拠
  • 例外の扱い:修正版が無い高 EPSS を、緩和策(到達経路を塞ぐ・機能無効化・WAF)や代替ライブラリ移行でどう凌ぐか。
  • 見直しの頻度:EPSS は毎日動く。昨日“低”だったものが今日“高”になるため、定点観測を欠かさない。

「直せないから放置」ではなく、意思決定を残すのがトリアージです。順位付け(本記事)と、いつまでに直すかの SLA・自動化(本番運用ガイドアラート・セキュリティ更新ガイド)は、役割を分けて設計してください。


7. よくある誤解を避ける

  • 「CVSS=リスク」ではない。CVSS は影響の一軸にすぎません。リスク ≒ 影響 × 確率 × 到達可能性。
  • EPSS は“予言”ではなく“確率”。EPSS 90% でも攻撃が来ないことはあるし、低 EPSS が突然跳ね上がることもある(だから毎日更新される)。確率として扱い、定点観測します。
  • Dependabot は SCA(依存の既知脆弱性)。自作コードの脆弱性(SQLi/XSS/SSRF/認可不備)は SAST/DAST の領域で、EPSS/CVSS の議論とは別レイヤーです。全体像はWebアプリ脆弱性診断ガイドで扱っています。

「深刻度の高い順に上から」をやめ、「攻撃が来ていて・被害が大きく・本番で踏む少数」に集中する。これが、有限の工数でサプライチェーンの実リスクを最短で下げる、現時点で最も費用対効果の高いトリアージ設計です。

Questions fréquentes

CVSS が高い順に直せばよいのでは?
いいえ。CVSS は「被害の大きさ(影響)」で、「攻撃される確率」ではありません。GitHub 自身の例でも、EPSS 85%・CVSS 9.8 は EPSS 0.5%・CVSS 9.0 より“ほぼ常に”優先すべきとされます。CVSS(影響)と EPSS(確率)を2軸で見るのが正解です。
EPSS とは何ですか?
FIRST が公開する機械学習モデルで、公開済み CVE が今後30日以内に実世界で悪用される確率(0〜1)を毎日更新します。パーセンタイルも提供されます。CVSS が「深刻度」を測るのに対し、EPSS は「悪用される見込み(likelihood)」を測ります。
GitHub のどこで EPSS を確認できますか?
Dependabot アラート画面に表示されます(2025年2月に一般提供、GitHub Enterprise Server は 3.17 以降)。GitHub は FIRST から EPSS を毎日同期します。EPSS の高い順に並べ替えて、攻撃が来ている脆弱性から対処できます。
到達可能性(reachability)は Dependabot で分かりますか?
いいえ。Dependabot は依存グラフ上に脆弱な依存が“存在するか”で検知し、自分のコードが脆弱な関数を実際に呼ぶかまでは判定しません。dev/prod の依存スコープを実用的な代理指標にし、厳密さが要るなら別途、到達可能性解析を併用してください。
アラート疲れを自動で減らせますか?
auto-triage rules で severity・EPSS・scope・package・CVE・ecosystem・manifest location を条件にできます。低 EPSS の開発依存などをルールで自動 dismiss すれば、通知が飛ぶ前に抑制できます。ルールは通知の前に適用されるのが要点です。
全部直さないと危険では?
有限の工数を“危険な少数”に集中させるのが最適です。EPSS の研究では、EPSS で優先順位を付ければ、ごく一部の脆弱性に絞って対処するだけで、実際に悪用される脆弱性の大半をカバーできると報告されています。まず高 EPSS × 高 CVSS × 本番到達から着手します。

Références

友田

友田 陽大

Créateur d’un produit lauréat du prix du ministre (METI). Avec TypeScript + Python + AWS, je livre SaaS, transformation numérique industrielle et IA générative (RAG) prête pour la production — des spécifications à l’infrastructure et à l’exploitation, seul.

I can take on the implementation from this article as an engagement

Dependency auto-updates & supply-chain defense, from design to production

From enabling alerts/security/version updates, to dependabot.yml design (groups, cooldown, monorepo directories, private registries), safe auto-merge via GitHub Actions + fetch-metadata (auto for patch/minor, human review for major), severity-based-SLA vulnerability response, and observability of the open count. With experience wiring dependency updates into CI quality gates, I implement automation that doesn't flood you with PRs or pile up technical debt.

Disponible en mission au forfait comme en conseil technique. Commencez par un échange gratuit de 30 minutes.

最短ルート:カレンダーから直接予約

相談内容が固まっている方は、フォーム送信よりその場で日程を確定する方がスムーズです。下記から空き時間をお選びください。

  • 30分のオンライン無料相談
  • Google Meet / Zoom / Microsoft Teams
  • NDA 商談前締結可・無理な営業はいたしません
無料相談の空き枠を予約する

À lire également