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?

CVEレコードの lessThan に修正版が3つ入っていた話(TeamCity CVE-2026-111094)

0
Posted at

背景

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

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?