LoginSignup
0
0

CISA VulnrichmentをDB化する、hogehuga/richmentdb

Posted at

概要

CISAが、NVDの脆弱性情報を拡張する Vulnrichment を公開しました。

現時点では開発中で、branch名すらdevelopで、すぐに運用で使えるものではありません。JSONでデータは提供されていますが、NVDのような検索APIは用意されていないようです(繰り返しますが、まだ開発途中なのでまだれらを作る段階ではないということでしょう)。

とはいえ、現状がどうなっているのかを簡易に確認したい / 使えるなら使いたい、と思い、vulnrichmentのデータをmysqlに取り込んだ richmentdb を用意ました。

これの使い方などをざっくり記述します。

どのようなものか

vulnrichmentのデータを、dockerで用意したmysqlに入れるだけの物です。

  • そのため、分析や検索にはSQL文に精通している必要があります
  • 繰り返しますがvulnrichmentはまだ開発中の為、スキーマ変更等でうまく動かなくなる場合があります

hogehuga/richmentdb を使うことで、現時点ではJSONで検索性の悪いデータを、SQLを使って検索することができるようになります。

  • 分析のお供にどうぞ
  • 慣れているのであれば、運用の付加情報として使ってみてください
    • SSVCの Exploitable Automatable Technical Impact の判断値があります。システム個別の環境情報を加えれば、「CISAが提示した判断」でSSVCの決定を利用できます
      • 自分でExploit有無やAutomatableを判断するのではなく、CISAの提供情報を基にすることで、他所への説明がしやすくなるかもしれません。
    • 所々、CNAでのCVSS v4情報が乗っているので、先行してCVSS v4の判断をすることも可能かもしれません

注意点

JSONのデータから適当にmysqlに入れているため、制約が少しあります。

  • int型、date型をnullにできない
    • jsonのデータを見ると、すべてのデータが埋まっているわけではありません
    • 他方、msyqlのようなデータベースでは、特定の型はNULLにできないようです
    • そのため、値が提供されていないがNULLにできないフィールドは、特定の値で埋めています
      • CVSS BaseScore類は"0"、KEV Catalog登録日は"1900-01-01"としています
    • (グラフデータベースなり、他のデータベースで解決できると思うのですが、知見がないです。誰か教えてください…)

使い方

Dockerで用意しているので、Dockerが動く環境が必要です。

README.md にも記載がありますが、おおよそ以下で動くでしょう。

$ docker pull hogehuga/richmentdb
$ docker container run --name richmentdb -e MYSQL_ROOT_PASSWORD=mysql -d hogehuga/richmentdb
$ docker exec -it richmentdb /bin/bash
(on Container)
# cd /opt/richmentdb/init-scripts
# ./00-createdb.sh
# cd /opt/richmentdb
# ./update.sh
(3-4分くらいで仕上がるはず)
# ./mysql-console.sh
mysql> 

./mysql-console.sh でmysqlのコンソールが開くので、そこで適当にSQL文を打って確認してください。

  • データベース構造は、README.mdに書いてあります。
    • vulnrichmentデータベースの、richmentテーブルにデータが入っています
    • CNAが提供するデータは、cna*なフィールド名
    • CISAが追加提供するデータは、adp*なフィールド名

使用例

2024-05-21のデータです。

総数

mysql> select count(*) from richment;
+----------+
| count(*) |
+----------+
|     3435 |
+----------+
1 row in set (0.01 sec)

mysql>

CVSS v4の状況

mysql> select cna40Severity,count(*) from richment group by cna40Severity;
+---------------+----------+
| cna40Severity | count(*) |
+---------------+----------+
|               |     3330 |
| MEDIUM        |      101 |
| CRITICAL      |        2 |
| HIGH          |        1 |
| LOW           |        1 |
+---------------+----------+
5 rows in set (0.01 sec)

mysql>

// 全レコード3435件のうち、CVSS v4のデータがあるのは105件で、mediumが多いようだ

CVSS v4でSeverity: MEDIUM に該当するものの、SSVC:Exploitationはどうなってるのか

mysql> select adpSSVCExploitation, count(*) from richment where cna40Severity="MEDIUM" group by adpSSVCExploitation;
+---------------------+----------+
| adpSSVCExploitation | count(*) |
+---------------------+----------+
| none                |       55 |
| poc                 |       46 |
+---------------------+----------+
2 rows in set (0.00 sec)

mysql>

// Severity:MEDIUMは101件あり、そのうちExploitationがあるものは101件なので、すべてSSVC値があった。

SSVC: Automatableの取りうる値の確認

mysql> select adpSSVCAutomatable,count(*) from richment group by adpSSVCAutomatable;
+--------------------+----------+
| adpSSVCAutomatable | count(*) |
+--------------------+----------+
| no                 |     2805 |
| Yes                |      586 |
|                    |       44 |
+--------------------+----------+
3 rows in set (0.01 sec)

mysql>

// 少し前前では (no|No|yes|Yes)で揺らいでいたが、no/Yesに収まっている。欲を言えば **y**es では?

特定の脆弱性を抽出(例:CVE-2024-33631)

mysql> select adp31Score,adp31Vector,adpSSVCExploitation,adpSSVCAutomatable,adpSSVCTechImpact,cna31Score,cna31VectorString from richment where cveId="CVE-2024-33631";
+------------+----------------------------------------------+---------------------+--------------------+-------------------+------------+----------------------------------------------+
| adp31Score | adp31Vector                                  | adpSSVCExploitation | adpSSVCAutomatable | adpSSVCTechImpact | cna31Score | cna31VectorString                            |
+------------+----------------------------------------------+---------------------+--------------------+-------------------+------------+----------------------------------------------+
|         10 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H | none                | no                 | partial           |          7 | CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L |
+------------+----------------------------------------------+---------------------+--------------------+-------------------+------------+----------------------------------------------+
1 row in set (0.01 sec)

mysql>

// CNAは7.0だが、CISAとしては10.0で評価している。PR:N/UI:N/C:H/I:H/A:H辺りが評価が違うようだ

今後の展望

気が向いたらメンテナンスしますが、時間次第だと思います。

  1. VulnrichmentがStableになったときに、再度設計しなおしてデータベース作ります。
  2. 他の KEV Catalog / EPSS などと併せて利用したいため、 hogehuga/epss-db に取り込むかもしれません。
  3. 適切なデータベースがあれば、教えてください。RDBMSには向いていないデータだと思ってはいます。
  4. たぶんフロントエンドは作りません。だれかwebインタフェース作って。(epss-dbも同様)

実運用上、hogehuga/epss-db に取り込んだ方が、KEV Cataog / EPSS / NVD(将来予定) と併せて検索できるので、めんどくさくなさそうと思っています。

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