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?

脆弱性DBのAPIを叩いて、対応の優先順位を機械で決める

0
Posted at

背景

脆弱性の対応順を、私はずっと点数の大きい順で決めていました。

でもそれだと、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補助で執筆した、個人開発の紹介記事です。

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?