CISA VulnrichmentをDB化する、hogehuga/richmentdb

# 概要

CISAが、NVDの脆弱性情報を拡張する [Vulnrichment](https://github.com/cisagov/vulnrichment) を公開しました。

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

- そもそもが、NVDのデータ提供遅延の解決策のような意味合いがありますので、調べてみるとよいかもしれません。
    - https://www.linkedin.com/feed/update/urn:li:activity:7193995615737901056/
    - https://nvd.nist.gov/general/news/nvd-program-transition-announcement


とはいえ、現状がどうなっているのかを簡易に確認したい / 使えるなら使いたい、と思い、vulnrichmentのデータをmysqlに取り込んだ [richmentdb](https://github.com/hogehuga/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](https://github.com/hogehuga/richmentdb/blob/main/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](https://github.com/hogehuga/epss-db/) に取り込むかもしれません。
3. 適切なデータベースがあれば、教えてください。RDBMSには向いていないデータだと思ってはいます。
4. たぶんフロントエンドは作りません。だれかwebインタフェース作って。（epss-dbも同様）

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