TrivyでLinuxサーバ上の脆弱性パッケージをスキャンする

小ネタ。
Trivyと言えばコンテナ向けの脆弱性スキャンツールとして有名だが、Linuxサーバに対してもスキャン出来る。
サポートしているOSの一覧は[こちら](https://aquasecurity.github.io/trivy/v0.35/docs/vulnerability/detection/os/)になる。
一応'23/9/5時点でのサポート対象リストを一部抜粋したものも載せておく。

|OS|Version|Target|
|---|---|---|
|Alpine|2.2-2.7,3.0-3.16,edge|apk|
|Redhat UBI|7,8,9|yum/rpm|
|RHEL|6,7,8|yum/rpm|
|CentOS|6,7,8|yum/rpm|
|Amazon Linux|1,2,2022|yum/rpm|
|Ubuntu|All version|apt/apt-get/dpkg|
|Photon|1.0,2.0,3.0,4.0|tdnf/yum/rpm|

見てのように、メジャーどころは一通り抑えているので、Linux利用者のほとんどは利用できるのではないかと思う。
今回はこれを使ってどれだけ脆弱性が含まれているかを確認する。

## 検証
### インストール
インストール方法は[こちら](https://aquasecurity.github.io/trivy/v0.45/getting-started/installation/)に書かれている。
ディストリビューションによってインストール方法が異なるが、インストールスクリプトを使ってバイナリをインストールすればどこの環境でも間違いなく入ると思う。
ということでインストールスクリプトでインストールする。
rootで作業するため、rootに切り替える。
```sh
sudo su -
```
インストールする。
```sh
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin v0.45.0
```
問題なければ以下でバージョンが確認できるようになる。
```
# trivy version
Version: 0.45.0
```

### 脆弱性スキャン
OSに対するスキャンは[Filesystem](https://aquasecurity.github.io/trivy/v0.45/docs/target/filesystem/)に対して実行する形になる。
OS全体なので、ファイルシステムとしてはrootディレクトリを指定する形となる。
今回はしばらく放置していたubuntu20.04に対して実行する。
なお、対象が多いとタイムアウトに引っかかるため、`--timeout`でタイムアウトを延長する。以下実行コマンドとなる。
```
# trivy fs / --timeout 120m
```
今回の検証環境では30分くらいで結果を得た。
なお、パッケージの脆弱性スキャンの結果のみを知りたい場合は`--scanners vuln`をつけて実行するとよい。これだと1分程度で結果が得られる。
出力結果は以下のような感じとなった。
```sh
2023-09-05T10:03:46.537Z	INFO	Vulnerability scanning is enabled
2023-09-05T10:03:46.540Z	INFO	Secret scanning is enabled
2023-09-05T10:03:46.541Z	INFO	If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2023-09-05T10:03:46.541Z	INFO	Please see also https://aquasecurity.github.io/trivy/v0.45/docs/scanner/secret/#recommendation for faster secret detection
2023-09-05T10:28:29.013Z	INFO	Detected OS: ubuntu
2023-09-05T10:28:29.024Z	INFO	Detecting Ubuntu vulnerabilities...
2023-09-05T10:28:29.214Z	INFO	Number of language-specific files: 3
2023-09-05T10:28:29.214Z	INFO	Detecting gomod vulnerabilities...
2023-09-05T10:28:29.251Z	INFO	Detecting pip vulnerabilities...

wdc2-jumphost (ubuntu 20.04)

Total: 1001 (UNKNOWN: 0, LOW: 441, MEDIUM: 548, HIGH: 12, CRITICAL: 0)

┌─────────────────────────────────┬──────────────────┬──────────┬──────────┬─────────────────────────────────┬───────────────┬──────────────────────────────────────────────────────────────┐
│             Library             │  Vulnerability   │ Severity │  Status  │        Installed Version        │ Fixed Version │                            Title                             │
├─────────────────────────────────┼──────────────────┼──────────┼──────────┼─────────────────────────────────┼───────────────┼──────────────────────────────────────────────────────────────┤
│ accountsservice                 │ CVE-2012-6655    │ LOW      │ affected │ 0.6.55-0ubuntu12~20.04.6        │               │ accountsservice: local encrypted password disclosure when    │
│                                 │                  │          │          │                                 │               │ changing password                                            │
│                                 │                  │          │          │                                 │               │ https://avd.aquasec.com/nvd/cve-2012-6655                    │
├─────────────────────────────────┼──────────────────┼──────────┤          ├─────────────────────────────────┼───────────────┼──────────────────────────────────────────────────────────────┤
│ apache2-utils                   │ CVE-2019-17567   │ MEDIUM   │          │ 2.4.41-4ubuntu3.14              │               │ httpd: mod_proxy_wstunnel tunneling of non Upgraded          │
│                                 │                  │          │          │                                 │               │ connection                                                   │
│                                 │                  │          │          │                                 │               │ https://avd.aquasec.com/nvd/cve-2019-17567                   │
├─────────────────────────────────┼──────────────────┤          │          ├─────────────────────────────────┼───────────────┼──────────────────────────────────────────────────────────────┤
：（省略）
```
全体として脆弱性が1001件あり、またどういうパッケージにどういう脆弱性が含まれているかも分かる。
今回は幸いにもCRITICALは含まれなかった。
パッケージをupgradeすると結果がどう変わるか確認する。手始めにupgradeして、不要なパッケージも削除する。
```sh
apt-get update -y
apt-get upgrade -y
apt autoremove
```
スキャンする。
```sh
trivy fs / --timeout 120m --scanners vuln
```
以下のように少し減った。パッケージの更新はセキュリティ対策の1つとしては有効かと思われる。
```sh
Total: 739 (UNKNOWN: 0, LOW: 329, MEDIUM: 403, HIGH: 7, CRITICAL: 0)
```
ちなみにそれでも結構な数の問題が残っているように思えるが、これに対して対策出来るかどうかを見るには`--ignore-unfixed`オプションをつけるとよい。
これは修正版が出ていない場合、脆弱性としてカウントしないオプションで、これを付けても表示されるパッケージは対策可能なパッケージとなる。
確認してみる。
```
# trivy fs / --timeout 120m --scanners vuln --ignore-unfixed
2023-09-05T23:39:50.750Z	INFO	Vulnerability scanning is enabled
2023-09-05T23:40:00.013Z	INFO	Detected OS: ubuntu
2023-09-05T23:40:00.014Z	INFO	Detecting Ubuntu vulnerabilities...
2023-09-05T23:40:00.097Z	INFO	Number of language-specific files: 3
2023-09-05T23:40:00.097Z	INFO	Detecting pip vulnerabilities...
2023-09-05T23:40:00.103Z	INFO	Detecting gomod vulnerabilities...

wdc2-jumphost (ubuntu 20.04)

Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)
```
当たり前だが、パッケージを最新版にしたので、対策できるものは全て取り込んでおり、検出できる脆弱性はゼロ件となった。

なお、手元にPhoton1.0(2019年リリース)があったので、試しにこちらでも実行してみた。
```s
2023-09-05T09:50:53.913Z	INFO	Detected OS: photon
2023-09-05T09:50:53.913Z	INFO	Detecting Photon Linux vulnerabilities...
2023-09-05T09:50:53.923Z	INFO	Number of language-specific files: 0
2023-09-05T09:50:53.960Z	WARN	This OS version is no longer supported by the distribution: photon 1.0
2023-09-05T09:50:53.960Z	WARN	The vulnerability detection may be insufficient because security updates are not provided
```
WARNの部分を見ると分かるが、このPhoton1.0はサポート期限が切れていることが分かる。
また、脆弱性としては以下の件数が報告された。
```sh
Total: 693 (UNKNOWN: 0, LOW: 26, MEDIUM: 312, HIGH: 287, CRITICAL: 68)
```
CRITICALが68件もある上、セキュリティアップデートが受けられないとなると結構ヤバい。
古いOSの利用は止めましょう。