概要
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)