Trivyでコンテナイメージの脆弱性を調査

## 概要
Trivyは、次の3種類のセキュリティ問題を検出が可能。

参考：https://aquasecurity.github.io/trivy/

- 脆弱性
  - OSパッケージ（Alpine、Red Hat Universal Base Image、Red Hat Enterprise Linux、CentOS、AlmaLinux、Rocky Linux、CBL-Mariner、Oracle Linux、Debian、Ubuntu、Amazon Linux、openSUSE Leap、SUSE Enterprise Linux、Photon OS、Distroless）
  - 言語固有のパッケージ（Bundler、Composer、Pipenv、Poetry、npm、yarn、Cargo、NuGet、Maven、Go）
- 設定ミス
  - Kubernetes
  - Docker
  - terraform
  - CloudFormation
- シークレットキー
  - AWSアクセスキー
  - GCPサービスアカウント
  - GitHubパーソナルアクセストークン


## コンテナイメージの脆弱性スキャン手順
### イメージ名を指定してスキャン
- TrivyイメージをPull
```
docker pull aquasec/trivy
```

- スキャン実行
```
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
    -v [YOUR_CACHE_DIR]:/root/.cache/ aquasec/trivy image [YOUR_IMAGE_NAME]
```

例

```
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
    -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy image python:3.6-alpine
```



### 全てのイメージをスキャン

- 検査対象のコンテナリストを環境変数に入れる

全てのコンテナを対象とする
```
LIST="`docker images --format '{{.Repository}}:{{.Tag}}' | sed -e 's/[\r\n]\+//g'`"
    
export CON_LIST="${LIST//$'\n'/ }"
    
printenv | grep CON_LIST
```
一部のコンテナを対象とする
```
LIST="`docker images --format '{{.Repository}}:{{.Tag}}' '<コンテナ名>/*' | sed -e 's/[\r\n]\+//g'`"

export CON_LIST="${LIST//$'\n'/ }"

printenv | grep CON_LIST
```
- スキャン用スクリプト作成

```
vi scan.sh
```

```
#!/bin/sh
LENGTH=`echo $CON_LIST | tr ' ' '\n' | wc -l`
d=`date +%Y%m%d`
mkdir -p /app/trivy_result/${d}
if [ "$1" = "-j" -o "$1" = "--json" ]; then
  for i in `seq $LENGTH`
  do
    ELEMENT=`echo $CON_LIST | cut -d ' ' -f $i`
    trivy image --timeout 10m -f json $ELEMENT > app/trivy_result/${d}/${ELEMENT##*/}.json
  done
else
  for i in `seq $LENGTH`
  do
    ELEMENT=`echo $CON_LIST | cut -d ' ' -f $i`
    trivy image --timeout 10m $ELEMENT > app/trivy_result/${d}/${ELEMENT##*/}.txt
  done
fi
```

- 実行権限の付与
```
chmod +x scan.sh
```

- スキャン実行
以下のコマンドを実行してスキャンを実行する。 結果は、コマンドを実行したディレクトリの./trivy_result/yyyymmddに出力される
```
docker run -v /var/run/docker.sock:/var/run/docker.sock  \  
  -v /tmp/Caches:/root/.cache/ \ # 脆弱性DB等キャッシュ保存先
  -v $PWD:/app \                 # scan.shをマウントする
  -e CON_LIST \                  # 検査対象のコンテナ一覧を環境変数として渡す
  --entrypoint "" \
  aquasec/trivy sh -c "app/scan.sh"
```

例　結果をTable形式で出力
```
docker run -v /var/run/docker.sock:/var/run/docker.sock  \
  -v /tmp/Caches:/root/.cache/ \
  -v $PWD:/app \
  -e CON_LIST \
  --entrypoint "" \
  aquasec/trivy sh -c "app/scan.sh"
```

例　結果をJson形式で出力
```
docker run -v /var/run/docker.sock:/var/run/docker.sock  \
  -v /tmp/Caches:/root/.cache/ \
  -v $PWD:/app \
  -e CON_LIST \
  --entrypoint "" \
  aquasec/trivy sh -c "app/scan.sh -j"
```


## 結果
python:3.6-alpineをスキャンした際の結果は以下の通り
```
python:3.6-alpine (alpine 3.15.0)
=================================
Total: 23 (UNKNOWN: 0, LOW: 0, MEDIUM: 2, HIGH: 11, CRITICAL: 10)

┌──────────────┬────────────────┬──────────┬───────────────────┬───────────────┬────────────────────────────────────────────────────────────┐
│   Library    │ Vulnerability  │ Severity │ Installed Version │ Fixed Version │                           Title                            │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────────┤
│ busybox      │ CVE-2022-28391 │ CRITICAL │ 1.34.1-r3         │ 1.34.1-r5     │ busybox: remote attackers may execute arbitrary code if    │
│              │                │          │                   │               │ netstat is used                                            │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-28391                 │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────────┤
│ expat        │ CVE-2022-22822 │ CRITICAL │ 2.4.1-r0          │ 2.4.3-r0      │ expat: Integer overflow in addBinding in xmlparse.c        │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-22822                 │
│              ├────────────────┤          │                   │               ├────────────────────────────────────────────────────────────┤
│              │ CVE-2022-22823 │          │                   │               │ expat: Integer overflow in build_model in xmlparse.c       │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-22823                 │
│              ├────────────────┤          │                   │               ├────────────────────────────────────────────────────────────┤
│              │ CVE-2022-22824 │          │                   │               │ expat: Integer overflow in defineAttribute in xmlparse.c   │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-22824                 │
│              ├────────────────┤          │                   ├───────────────┼────────────────────────────────────────────────────────────┤
│              │ CVE-2022-23852 │          │                   │ 2.4.4-r0      │ expat: Integer overflow in function XML_GetBuffer          │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-23852                 │
│              ├────────────────┤          │                   │               ├────────────────────────────────────────────────────────────┤
│              │ CVE-2022-23990 │          │                   │               │ expat: integer overflow in the doProlog function           │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-23990                 │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────────┤
│ expat        │ CVE-2022-25235 │ CRITICAL │ 2.4.1-r0          │ 2.4.5-r0      │ expat: Malformed 2- and 3-byte UTF-8 sequences can lead to │
│              │                │          │                   │               │ arbitrary code...                                          │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-25235                 │
│              ├────────────────┤          │                   │               ├────────────────────────────────────────────────────────────┤
│              │ CVE-2022-25236 │          │                   │               │ expat: Namespace-separator characters in "xmlns[:prefix]"  │
│              │                │          │                   │               │ attribute values can lead to arbitrary code...             │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-25236                 │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────────┤
│ expat        │ CVE-2022-25315 │ CRITICAL │ 2.4.1-r0          │ 2.4.5-r0      │ expat: Integer overflow in storeRawNames()                 │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-25315                 │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────────┤
│ expat        │ CVE-2021-45960 │ HIGH     │ 2.4.1-r0          │ 2.4.3-r0      │ expat: Large number of prefixed XML attributes on a single │
│              │                │          │                   │               │ tag can...                                                 │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2021-45960                 │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────────┤
│ expat        │ CVE-2021-46143 │ HIGH     │ 2.4.1-r0          │ 2.4.3-r0      │ expat: Integer overflow in doProlog in xmlparse.c          │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2021-46143                 │
│              ├────────────────┤          │                   │               ├────────────────────────────────────────────────────────────┤
│              │ CVE-2022-22825 │          │                   │               │ expat: Integer overflow in lookup in xmlparse.c            │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-22825                 │
│              ├────────────────┤          │                   │               ├────────────────────────────────────────────────────────────┤
│              │ CVE-2022-22826 │          │                   │               │ expat: Integer overflow in nextScaffoldPart in xmlparse.c  │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-22826                 │
│              ├────────────────┤          │                   │               ├────────────────────────────────────────────────────────────┤
│              │ CVE-2022-22827 │          │                   │               │ expat: Integer overflow in storeAtts in xmlparse.c         │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-22827                 │
│              ├────────────────┤          │                   ├───────────────┼────────────────────────────────────────────────────────────┤
│              │ CVE-2022-25314 │          │                   │ 2.4.5-r0      │ expat: integer overflow in copyString()                    │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-25314                 │
│              ├────────────────┼──────────┤                   │               ├────────────────────────────────────────────────────────────┤
│              │ CVE-2022-25313 │ MEDIUM   │                   │               │ expat: stack exhaustion in doctype parsing                 │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-25313                 │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────────┤
│ krb5-libs    │ CVE-2021-37750 │ MEDIUM   │ 1.19.2-r4         │ 1.19.3-r0     │ krb5: NULL pointer dereference in process_tgs_req() in     │
│              │                │          │                   │               │ kdc/do_tgs_req.c via a FAST inner...                       │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2021-37750                 │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────────┤
│ libcrypto1.1 │ CVE-2022-0778  │ HIGH     │ 1.1.1l-r7         │ 1.1.1n-r0     │ openssl: Infinite loop in BN_mod_sqrt() reachable when     │
│              │                │          │                   │               │ parsing certificates                                       │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-0778                  │
├──────────────┤                │          ├───────────────────┼───────────────┤                                                            │
│ libretls     │                │          │ 3.3.4-r2          │ 3.3.4-r3      │                                                            │
│              │                │          │                   │               │                                                            │
│              │                │          │                   │               │                                                            │
├──────────────┤                │          ├───────────────────┼───────────────┤                                                            │
│ libssl1.1    │                │          │ 1.1.1l-r7         │ 1.1.1n-r0     │                                                            │
│              │                │          │                   │               │                                                            │
│              │                │          │                   │               │                                                            │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────────┤
│ ssl_client   │ CVE-2022-28391 │ CRITICAL │ 1.34.1-r3         │ 1.34.1-r5     │ busybox: remote attackers may execute arbitrary code if    │
│              │                │          │                   │               │ netstat is used                                            │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-28391                 │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────────┤
│ xz-libs      │ CVE-2022-1271  │ HIGH     │ 5.2.5-r0          │ 5.2.5-r1      │ gzip: arbitrary-file-write vulnerability                   │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-1271                  │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────────┤
│ zlib         │ CVE-2018-25032 │ HIGH     │ 1.2.11-r3         │ 1.2.12-r0     │ zlib: A flaw found in zlib when compressing (not           │
│              │                │          │                   │               │ decompressing) certain inputs...                           │
│              │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2018-25032                 │
└──────────────┴────────────────┴──────────┴───────────────────┴───────────────┴────────────────────────────────────────────────────────────┘

Python (python-pkg)
===================
Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)
```