背景
CVE(脆弱性ごとに振られる共通の識別番号)の情報を毎日まとめるサイトを作っています。
昨日までは JetBrains の TeamCity の CVE が書けず、見送っていました。
理由は、JetBrains の公式ページが動的表示で、本文がうまく取れなかったからです…。
そこで CVE の「公式レコード」を直接読むことにしました。
そうしたら、思っていない形のデータが出てきたので、備忘録として残します。
結論
CVE の公式レコードは、下記の API で JSON として取れます。
https://cveawg.mitre.org/api/cve/{CVE番号}
CVE とは、脆弱性ごとに振られる共通の識別番号のことだ。
今回の対象は CVE-2026-111094 で、TeamCity のリモートコード実行の脆弱性です。
このレコードの lessThan が、バージョン1つではなく、修正版3つを含む1本の文字列でした。
手元で取ってみる
下記は Node.js(18 以降なら fetch が標準で使えます)で、該当 CVE のレコードを取って lessThan を出すだけのコードです。
containers.cna は、番号を採番した組織(CNA)が書いた本体部分のことだ。
affected はその中の「影響を受ける製品」の配列で、今回は要素が1つだけでした。
const id = "CVE-2026-111094";
const res = await fetch(`https://cveawg.mitre.org/api/cve/${id}`);
const rec = await res.json();
const v = rec.containers.cna.affected[0].versions[0];
console.log(JSON.stringify(v.lessThan));
実行すると、下記のように出ました(2026-10-19 に手元で確認)。
"2026.2, \n2026.1.4, \n2025.11.8"
「未満」を表す lessThan に、バージョンが3つ入っています。
しかもカンマと改行(\n)が混ざっています。
なぜ困るのか
私のサイトは「このバージョン未満が影響を受ける」を機械的に判定して載せています。
lessThan を単一のバージョンだと思って比較すると、この文字列全体を1つのバージョンとして扱ってしまいます。
結果として、たとえば 2026.1.2 を使っている人が「影響あり」かどうかを正しく言えなくなる気がします。
2026.1 系の修正版は 2026.1.4 なので、2026.1.2 は未満=影響ありのはずです。
でも文字列全体を比較すると、その判断にたどり着けません。
脆弱性の情報は、読んだ人が自分の環境に当てはめて使うものです。
ここがずれると、ミスリードになってしまう。
だから、分割してから扱うことにしました。
分割するコード
区切りはカンマと改行の両方があり得るので、どちらでも切れるようにします。
const fixed = v.lessThan
.split(/[,\n]+/)
.map((x) => x.trim())
.filter(Boolean);
console.log(fixed);
実行結果は下記です。
[ '2026.2', '2026.1.4', '2025.11.8' ]
3系統(2026.2 / 2026.1 / 2025.11)それぞれの修正版が取れました。
本文(description)にも「before 2026.2, 2026.1.4, 2025.11.8」と書かれていたので、内容は一致しています。
一次情報の確認
ちなみに、このレコードの内容は次のとおりです(API の返り値から確認した範囲です)。
- 弱点の種類(CWE)は CWE-502。CWE とは、脆弱性の原因を分類する番号で、502 は信頼できないデータのデシリアライズを指す
- 深刻度は CVSS v3.1 で 8.1(High)。CVSS は脆弱性の深刻度を 0〜10 で表す指標で、7.0 以上が High だ
- 攻撃元区分は NETWORK、攻撃条件の複雑さは HIGH
- 概要は、ビルドメッセージのプロトコルにおけるホワイトリストの回避で、リモートコード実行が可能というもの
動的ページで本文が取れなくても、採番した組織自身のレコードが公式の記述になります。
今回はそちらを一次情報として使いました。
まとめた結果は、私の CVE サイトに載せています。
気づいたこと
lessThan を1つの値だと決めつけて作ると、複数系統を持つ製品で必ずズレます。
CVE レコードのバージョン欄は、取り込む側で分割してから比較する。
これが今回持ち帰った一手です。
本記事はAI補助で執筆した、個人開発の紹介記事です。