背景
脆弱性の対応順を、私はずっと点数の大きい順で決めていました。
でもそれだと、9.8 の案件が十件並んだときに詰まります。
全部 Critical なので、全部いますぐ、になってしまう…。
先に用語を片付けておきます。
CVE とは、個々の脆弱性に振られる世界共通の通し番号のことだ。
CVSS とは、脆弱性の深刻度を 0.0〜10.0 の数値で表すものさしのことだ(7.0 以上が High、9.0 以上が Critical の扱い)。
NVD とは、アメリカの NIST が運営する脆弱性データベースのことだ(CVE ごとに CVSS や参照リンクが載っている)。
KEV とは、アメリカの CISA が「実際に悪用が確認された」ものだけを並べたリストのことだ。
結論
NVD の API は、点数以外の判断材料も返してくる。
それが SSVC で、私はいまこちらを優先順位の一次判定に使っています。
下記のコードで取れます。
// CVE 番号を1つ渡して、metrics の中身を全部並べる。
// NVD の API は鍵なしでも 1件なら叩ける(連打すると 403 になるので間隔を空ける)。
const cveId = "CVE-2026-86218";
const url = `https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=${cveId}`;
const res = await fetch(url);
const json = await res.json();
const cve = json.vulnerabilities[0].cve;
for (const [name, value] of Object.entries(cve.metrics)) {
console.log(name, JSON.stringify(value).slice(0, 200));
}
cve.metrics は、評価の種類ごとにキーが分かれたオブジェクトだ。
私の手元では、次の3つが入っていました。
cvssMetricV31
cvssMetricV40
ssvcV203
上2つが点数、3つ目が今回の本題です。
SSVC の中身
ssvcV203 の ssvcData.options を展開すると、こうなっていました。
exploitation: active
automatable: yes
technicalImpact: total
role: CISA Coordinator
SSVC は Stakeholder-Specific Vulnerability Categorization の略で、CISA が使っている「どれから直すか」を決めるための分類だ。
3つの項目の意味はこうです。
exploitation は悪用の状況で、none(報告なし)/ poc(実証コードはある)/ active(現に悪用されている)のいずれか。
automatable は攻撃を自動化できるかで、yes なら「見つける・入り込む」を機械が回せるという意味だ。手動でしか刺さらない脆弱性とは、広がる速さが違う。
technicalImpact は取られる範囲で、partial か total。total は対象システムの制御を丸ごと奪われるという意味になる。
なぜ点数より使いやすいのか
CVSS の点数は、そのバグがどれだけまずいかを表しています。
SSVC の3項目は、いま自分が何をすべきかに近い。
具体例を出します。
手元に CVSS 9.8 が2件あったとします。
- A:
exploitation: none/automatable: no/technicalImpact: partial - B:
exploitation: active/automatable: yes/technicalImpact: total
点数は同じ 9.8 です。
でも B は「もう攻撃されていて、自動化できて、全部取られる」。
A は「まだ誰も撃っていなくて、撃っても手作業で、一部しか取れない」。
先に直すのは B だ、と機械でも言えます。
私はこの3項目を数値化して並べ替えるだけの雑なスクリプトを書きました。
active に 3点、automatable: yes に 2点、total に 2点を足して、合計で降順に並べるだけです。
雑ですが、点数だけで並べていたころより、朝いちばんに見る案件がまともになりました。
注意している点
ひとつ。SSVC は全部の CVE に付いているわけではない。
role: CISA Coordinator から分かるとおり、これは CISA が付けた値です。
KEV に載るような案件には付いていますが、付いていない CVE のほうが多い。
なので「SSVC が無い=安全」ではありません。無いものは従来どおり点数と自分の環境で判断する、という運用にしています。
もうひとつ。cve.metrics の各要素には type があって、Primary が NVD 自身の評価、Secondary が CVE を採番した側の評価だ。
同じ CVE で 3.1 が 9.8、4.0 が 10.0 のように食い違うことがあるので、どちらを採るかは先に決めておいたほうがいいです。
私は 3.1 の Primary を保存して、本文で「別の物差しでは 10.0 だ」と書く形にしました。
集計した結果はこちらに置いています。
https://cve.autoarticles.net
点数で詰まっている人は、いちど metrics の中身を全部出力してみてください。
本記事はAI補助で執筆した、個人開発の紹介記事です。