CVE情報調査 docker編

# Dockerコンテナの脆弱性管理

さて今度はDocker。

~~ぐぐるとvulsでコンテナを検索する方法というのもヒットするのですが、現状docを見ると、「廃止したので、trivy別途使ってね」とあります。~~
https://vuls.io/docs/ja/tutorial-scan-docker-image.html

後日、訂正。
https://vuls.io/docs/ja/usage-scan.html

Vulsは「コンテナ」をスキャンすることはできるみたいです。
上記の記載は、Vulsはコンテナの雛形になる「イメージ」のスキャンはしない、という意味でしょうか。
（結果をtrivyから取り込む機能はあるようですが)

逆に、trivyはイメージのスキャンはできるけど、コンテナのスキャンはしない、と。

なるほど。。
用途によってコンテナとイメージとどっちがアクセスしやすいかや、コンテナとイメージで差分が出る運用をしているかでどちらを使うか目利きですね。

とりあえずこの記事ではTrivyしか選択肢がないと思ってまとめていたので、そのまままとめます。


# Trivyを使ってみる
https://github.com/aquasecurity/trivy
基本上記の公式サイトのinstall手順通りに実施で、ハマったりはしませんでした。

## まずは一回実行してみる

コンテナで導入する方法をとりましたが、今回
こんな感じに出力されます。

```
$ docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy image --scanners=vuln ubuntu
2023-04-22T10:46:06.017Z        INFO     Vulnerability scanning is enabled
2023-04-22T10:46:06.913Z        INFO     Detected OS: ubuntu
2023-04-22T10:46:06.913Z        INFO     Detecting Ubuntu vulnerabilities...
2023-04-22T10:46:06.917Z        INFO     Number of language-specific files: 0

ubuntu (ubuntu 22.04)
=====================
Total: 19 (UNKNOWN: 0, LOW: 19, MEDIUM: 0, HIGH: 0, CRITICAL: 0)

┌──────────────┬────────────────┬──────────┬──────────────────────────┬───────────────┬─────────────────────────────────────────────────────────────┐
│   Library    │ Vulnerability  │ Severity │    Installed Version     │ Fixed Version │                            Title                            │
├──────────────┼────────────────┼──────────┼──────────────────────────┼───────────────┼─────────────────────────────────────────────────────────────┤
│ bash         │ CVE-2022-3715  │ LOW      │ 5.1-6ubuntu1             │               │ bash: a heap-buffer-overflow in valid_parameter_transform   │
│              │                │          │                          │               │ https://avd.aquasec.com/nvd/cve-2022-3715                   │
├──────────────┼────────────────┤          ├──────────────────────────┼───────────────┼─────────────────────────────────────────────────────────────┤
│ coreutils    │ CVE-2016-2781  │          │ 8.32-4.1ubuntu1          │               │ coreutils: Non-privileged session can escape to the parent  │
│              │                │          │                          │               │ session in chroot                                           │
│              │                │          │                          │               │ https://avd.aquasec.com/nvd/cve-2016-2781                   │
├──────────────┼────────────────┤          ├──────────────────────────┼───────────────┼─────────────────────────────────────────────────────────────┤
│ gpgv         │ CVE-2022-3219  │          │ 2.2.27-3ubuntu2.1        │               │ gnupg: denial of service issue (resource consumption) using │
│              │                │          │                          │               │ compressed packets                                          │
│              │                │          │                          │               │ https://avd.aquasec.com/nvd/cve-2022-3219                   │
├──────────────┼────────────────┤          ├──────────────────────────┼───────────────┼─────────────────────────────────────────────────────────────┤
```

きれいに出してくれるんですけど、逆にスクリプトとかでは食えない形式ですね。。
出力フォーマット選べないか、見てみます。
公式サイトやgitより、-hしてしまうほうがわかりやすかったです。

```
$ docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy image -h
...
  -f, --format string          format (table, json, template, sarif, cyclonedx, spdx, spdx-json, github, cosign-vuln) (default "table")
...
```

みっけ。

```
$ docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy image --scanners=vuln --format json ubuntu 
```

出力は省略します。
後でvulsの結果と一緒に、CVEベースでソートするスクリプト作っておくことにしましょう。

## 使ってみての所感

特に問題なく、今回の用途ではコンテナ分はtrivyで調査するようにしようと思います。

一応、備忘をいくつか。

### コンテナの「イメージ」を調査するツールである。

調査するのはコンテナ「イメージ」であり、実施祭に動いているコンテナを見るわけではない点は、一応注意でしょうか。
運用フェイズに入っていればコンテナの構成＝イメージの構成でまず問題ないとは思うのですが、もしコンテナ生成後に追加でパッケージを入れる、という使い方をする場合は、要注意。

### OSの標準パッケージで導入している分以外のパッケージの脆弱性は見てくれない

これはVulsと一緒ですね。
コンテナでソフトを使う場合、ソフトのメインの部分は都度コンパイルしていたりと、OSの標準レポジトリ配布のパッケージを使うことはまずありませんので、メインのソフトはCPEを調べておいて、一括でVulsで検索でしょうか。
有償版のdocにはtrivyをVuls側から駆動するというような記載も見かけましたが、深堀はしてません。

### CVE情報はどのように更新している？

CVE情報をどの時点でダウンロードしているのかが調べきれてません。
うっかり古いDBをそのまま使っていて、脆弱性を見落として、となるとなんともです。
今回はワンショットで調査してそれっきりになる予定ですが、長期的に使うなら、更新方法をきちんと整理しておかないといけないですね。。

### ゴミコンテナがたくさん残る、、

docker型で実行する場合、実行時に-rmをつけないと、実行済みのゴミコンテナが大量に出来上がります。。
rmつけ忘れたら、以下で定期的にお掃除ですね。。

```
$ docker ps -a -f ancestor=aquasec/trivy --format "{{.ID}}" | xargs docker rm
```

# まとめ

dockerコンテナの脆弱性調査はtrivyで行こうと思います。