kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Trivy の VM image scanning で AMI / EBS スナップショットのセキュリティスキャンをしよう

Trivy の「VM image scanning」を使うと AWS の Amazon Machine Image (AMI)Amazon Elastic Block Store (Amazon EBS) スナップショットに対してセキュリティスキャンを実行できる❗️サーバーにエージェントをセットアップする必要がなく(エージェントレス),スキャンのために Amazon EC2 インスタンスを一時的に起動する必要もなく,便利だ〜 \( 'ω')/

ドキュメントにも書いてあるけど現在はまだ EXPERIMENTAL として提供されているため,今後仕様変更になる可能性はある🔥

aquasecurity.github.io

さっそく試す

Trivy v0.45.0 を使ってさっそく試す❗️

$ trivy --version
Version: 0.45.0

今回は検証用の Amazon EC2 インスタンス(Amazon Linux 2023 AMI)で 9/16 に取得した Amazon EBS スナップショットに対して Trivy の VM image scanning を実行する.Amazon EBS スナップショットの場合は trivy vm ebs:xxx コマンド・AMI の場合は trivy vm ami:xxx コマンドを使う.実行時間はそれなりに長かったけど,少し待つと結果が表示された👏

  • snap-xxxxxxxxxxxxxxxxx: MEDIUM 8件 🛑
  • etc/ssh/ssh_host_ecdsa_key: HIGH 1件 🛑
  • etc/ssh/ssh_host_ed25519_key: HIGH 1件 🛑
$ trivy vm ebs:snap-xxxxxxxxxxxxxxxxx

(中略)

snap-xxxxxxxxxxxxxxxxx (amazon 2023 (Amazon Linux))

Total: 8 (UNKNOWN: 0, LOW: 0, MEDIUM: 8, HIGH: 0, CRITICAL: 0)

┌──────────────┬────────────────┬──────────┬────────┬────────────────────────┬────────────────────────┬─────────────────────────────────────────────────────────────┐
│   Library    │ Vulnerability  │ Severity │ Status │   Installed Version    │     Fixed Version      │                            Title                            │
├──────────────┼────────────────┼──────────┼────────┼────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────┤
│ kernel       │ CVE-2023-21264 │ MEDIUM   │ fixed  │ 6.1.49-69.116.amzn2023 │ 6.1.52-71.125.amzn2023 │ In multiple functions of mem_protect.c, there is a possible │
│              │                │          │        │                        │                        │ way to acc...                                               │
│              │                │          │        │                        │                        │ https://avd.aquasec.com/nvd/cve-2023-21264                  │
│              ├────────────────┤          │        │                        │                        ├─────────────────────────────────────────────────────────────┤
│              │ CVE-2023-2430  │          │        │                        │                        │ missing lock in io_uring/msg_ring.c for IOPOLL in io_uring  │
│              │                │          │        │                        │                        │ cause denial of service...                                  │
│              │                │          │        │                        │                        │ https://avd.aquasec.com/nvd/cve-2023-2430                   │
├──────────────┼────────────────┤          │        │                        │                        ├─────────────────────────────────────────────────────────────┤
│ kernel-tools │ CVE-2023-21264 │          │        │                        │                        │ In multiple functions of mem_protect.c, there is a possible │
│              │                │          │        │                        │                        │ way to acc...                                               │
│              │                │          │        │                        │                        │ https://avd.aquasec.com/nvd/cve-2023-21264                  │
│              ├────────────────┤          │        │                        │                        ├─────────────────────────────────────────────────────────────┤
│              │ CVE-2023-2430  │          │        │                        │                        │ missing lock in io_uring/msg_ring.c for IOPOLL in io_uring  │
│              │                │          │        │                        │                        │ cause denial of service...                                  │
│              │                │          │        │                        │                        │ https://avd.aquasec.com/nvd/cve-2023-2430                   │
├──────────────┼────────────────┤          │        ├────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────┤
│ libgcc       │ CVE-2023-4039  │          │        │ 11.3.1-4.amzn2023.0.311.4.1-2.amzn2023.0.2-fstack-protector fails to guard dynamic stack allocations  │
│              │                │          │        │                        │                        │ on ARM64                                                    │
│              │                │          │        │                        │                        │ https://avd.aquasec.com/nvd/cve-2023-4039                   │
├──────────────┤                │          │        │                        │                        │                                                             │
│ libgomp      │                │          │        │                        │                        │                                                             │
│              │                │          │        │                        │                        │                                                             │
│              │                │          │        │                        │                        │                                                             │
├──────────────┤                │          │        │                        │                        │                                                             │
│ libstdc++    │                │          │        │                        │                        │                                                             │
│              │                │          │        │                        │                        │                                                             │
│              │                │          │        │                        │                        │                                                             │
├──────────────┼────────────────┤          │        ├────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────┤
│ libxml2      │ CVE-2023-39615 │          │        │ 2.10.4-1.amzn2023.0.32.10.4-1.amzn2023.0.4  │ crafted xml can cause global buffer overflow                │
│              │                │          │        │                        │                        │ https://avd.aquasec.com/nvd/cve-2023-39615                  │
└──────────────┴────────────────┴──────────┴────────┴────────────────────────┴────────────────────────┴─────────────────────────────────────────────────────────────┘

etc/ssh/ssh_host_ecdsa_key (secrets)

Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 1, CRITICAL: 0)

HIGH: AsymmetricPrivateKey (private-key)
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Asymmetric Private Key
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 etc/ssh/ssh_host_ecdsa_key:1
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1 [ -----BEGIN OPENSSH PRIVATE KEY-----********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************-----END OPENSSH PRIVATE KEY-----
   2
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

etc/ssh/ssh_host_ed25519_key (secrets)

Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 1, CRITICAL: 0)

HIGH: AsymmetricPrivateKey (private-key)
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Asymmetric Private Key
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 etc/ssh/ssh_host_ed25519_key:1
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1 [ -----BEGIN OPENSSH PRIVATE KEY-----***********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************-----END OPENSSH PRIVATE KEY-----
   2
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

スキャナー(スキャン対象)

Trivy の VM image scanning は「4種類」のスキャナーをサポートしている.

  • Vulnerabilities (vuln) ✔️ デフォルト
  • Misconfigurations (config)
  • Secrets (secret) ✔️ デフォルト
  • Licenses (license)

デフォルトで実行されるスキャナーは VulnerabilitiesSecrets で,もしスキャン速度を速くするなら --scanners vuln オプションを指定するべし!と書いてあった.

If your scanning is slow, please try '--scanners vuln' to disable secret scanning

vuln に限定して再度実行してみる💡

$ trivy vm --scanners vuln ebs:snap-xxxxxxxxxxxxxxxxx

(中略)

snap-xxxxxxxxxxxxxxxxx (amazon 2023 (Amazon Linux))

Total: 8 (UNKNOWN: 0, LOW: 0, MEDIUM: 8, HIGH: 0, CRITICAL: 0)

┌──────────────┬────────────────┬──────────┬────────┬────────────────────────┬────────────────────────┬─────────────────────────────────────────────────────────────┐
│   Library    │ Vulnerability  │ Severity │ Status │   Installed Version    │     Fixed Version      │                            Title                            │
├──────────────┼────────────────┼──────────┼────────┼────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────┤
│ kernel       │ CVE-2023-21264 │ MEDIUM   │ fixed  │ 6.1.49-69.116.amzn2023 │ 6.1.52-71.125.amzn2023 │ In multiple functions of mem_protect.c, there is a possible │
│              │                │          │        │                        │                        │ way to acc...                                               │
│              │                │          │        │                        │                        │ https://avd.aquasec.com/nvd/cve-2023-21264                  │
│              ├────────────────┤          │        │                        │                        ├─────────────────────────────────────────────────────────────┤
│              │ CVE-2023-2430  │          │        │                        │                        │ missing lock in io_uring/msg_ring.c for IOPOLL in io_uring  │
│              │                │          │        │                        │                        │ cause denial of service...                                  │
│              │                │          │        │                        │                        │ https://avd.aquasec.com/nvd/cve-2023-2430                   │
├──────────────┼────────────────┤          │        │                        │                        ├─────────────────────────────────────────────────────────────┤
│ kernel-tools │ CVE-2023-21264 │          │        │                        │                        │ In multiple functions of mem_protect.c, there is a possible │
│              │                │          │        │                        │                        │ way to acc...                                               │
│              │                │          │        │                        │                        │ https://avd.aquasec.com/nvd/cve-2023-21264                  │
│              ├────────────────┤          │        │                        │                        ├─────────────────────────────────────────────────────────────┤
│              │ CVE-2023-2430  │          │        │                        │                        │ missing lock in io_uring/msg_ring.c for IOPOLL in io_uring  │
│              │                │          │        │                        │                        │ cause denial of service...                                  │
│              │                │          │        │                        │                        │ https://avd.aquasec.com/nvd/cve-2023-2430                   │
├──────────────┼────────────────┤          │        ├────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────┤
│ libgcc       │ CVE-2023-4039  │          │        │ 11.3.1-4.amzn2023.0.311.4.1-2.amzn2023.0.2-fstack-protector fails to guard dynamic stack allocations  │
│              │                │          │        │                        │                        │ on ARM64                                                    │
│              │                │          │        │                        │                        │ https://avd.aquasec.com/nvd/cve-2023-4039                   │
├──────────────┤                │          │        │                        │                        │                                                             │
│ libgomp      │                │          │        │                        │                        │                                                             │
│              │                │          │        │                        │                        │                                                             │
│              │                │          │        │                        │                        │                                                             │
├──────────────┤                │          │        │                        │                        │                                                             │
│ libstdc++    │                │          │        │                        │                        │                                                             │
│              │                │          │        │                        │                        │                                                             │
│              │                │          │        │                        │                        │                                                             │
├──────────────┼────────────────┤          │        ├────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────┤
│ libxml2      │ CVE-2023-39615 │          │        │ 2.10.4-1.amzn2023.0.32.10.4-1.amzn2023.0.4  │ crafted xml can cause global buffer overflow                │
│              │                │          │        │                        │                        │ https://avd.aquasec.com/nvd/cve-2023-39615                  │
└──────────────┴────────────────┴──────────┴────────┴────────────────────────┴────────────────────────┴─────────────────────────────────────────────────────────────┘

CVE を減らす

次に Amazon EBS スナップショットを取得した Amazon EC2 インスタンスで dnf upgrade --releasever=2023.2.20230920 コマンドを実行した.そしてもう一度 Amazon EBS スナップショットを取得してから Trivy の VM image scanning を実行したところ該当する CVE が減っていた✌

  • snap-xxxxxxxxxxxxxxxxx: MEDIUM 2件 🛑
$ trivy vm --scanners vuln ebs:snap-xxxxxxxxxxxxxxxxx

(中略)

snap-xxxxxxxxxxxxxxxxx (amazon 2023 (Amazon Linux))

Total: 2 (UNKNOWN: 0, LOW: 0, MEDIUM: 2, HIGH: 0, CRITICAL: 0)

┌─────────┬────────────────┬──────────┬────────┬────────────────────────┬────────────────────────┬─────────────────────────────────────────────────────────────┐
│ Library │ Vulnerability  │ Severity │ Status │   Installed Version    │     Fixed Version      │                            Title                            │
├─────────┼────────────────┼──────────┼────────┼────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────┤
│ kernel  │ CVE-2023-21264 │ MEDIUM   │ fixed  │ 6.1.49-69.116.amzn2023 │ 6.1.52-71.125.amzn2023 │ In multiple functions of mem_protect.c, there is a possible │
│         │                │          │        │                        │                        │ way to acc...                                               │
│         │                │          │        │                        │                        │ https://avd.aquasec.com/nvd/cve-2023-21264                  │
│         ├────────────────┤          │        │                        │                        ├─────────────────────────────────────────────────────────────┤
│         │ CVE-2023-2430  │          │        │                        │                        │ missing lock in io_uring/msg_ring.c for IOPOLL in io_uring  │
│         │                │          │        │                        │                        │ cause denial of service...                                  │
│         │                │          │        │                        │                        │ https://avd.aquasec.com/nvd/cve-2023-2430                   │
└─────────┴────────────────┴──────────┴────────┴────────────────────────┴────────────────────────┴─────────────────────────────────────────────────────────────┘

Vulnerabilities (vuln) 以外のスキャナーも試す

Misconfigurations (config)

--scanners config オプションはドキュメントに以下のように書かれていて特に使う必要性はなさそうだった.

It is supported, but it is not useful in most cases.

実際に実行しても Detected config files: 0 で何も検出されなかった.

$ trivy vm --scanners config ebs:snap-xxxxxxxxxxxxxxxxx

Secrets (secret)

デフォルトで有効化されている --scanners secret オプションは AWS のアクセスキーや GitHub の Personal Access Tokens (PAT) などの存在を検出できる.以下のドキュメントに詳しく載っていて,細かくカスタマイズできるようになっている👌

aquasecurity.github.io

ドキュメントの Recommendation に載っているけど,--skip-dirs オプションを使ってスキャン範囲を狭めることで Secrets のスキャン速度を速くできる.Secrets の実行時間は結構長く,実際に使うときには必要になりそう.

$ trivy vm --scanners secret ebs:snap-xxxxxxxxxxxxxxxxx

(中略)

etc/ssh/ssh_host_ecdsa_key (secrets)

Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 1, CRITICAL: 0)

HIGH: AsymmetricPrivateKey (private-key)
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Asymmetric Private Key
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 etc/ssh/ssh_host_ecdsa_key:1
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1 [ -----BEGIN OPENSSH PRIVATE KEY-----********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************-----END OPENSSH PRIVATE KEY-----
   2
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

etc/ssh/ssh_host_ed25519_key (secrets)

Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 1, CRITICAL: 0)

HIGH: AsymmetricPrivateKey (private-key)
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Asymmetric Private Key
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 etc/ssh/ssh_host_ed25519_key:1
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1 [ -----BEGIN OPENSSH PRIVATE KEY-----***********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************-----END OPENSSH PRIVATE KEY-----
   2
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Licenses (license)

--scanners license オプションを指定するとライセンスに関するリスクを検出できる.以下のドキュメントに詳しく載っていて,細かくカスタマイズできるようになっている👌

aquasecurity.github.io

特にオプションは指定せず実行すると大量に(466件も)出力される❗️1個1個ライセンスを確認するのは大変だから自動的に一覧を取得できるのは便利〜

$ trivy vm --scanners license ebs:snap-xxxxxxxxxxxxxxxxx

(中略)

OS Packages (license)

Total: 466 (UNKNOWN: 466, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)

┌─────────────────────────────────┬──────────────────────────────────────────────────────────────┬────────────────┬──────────┐
│             Package             │                           License                            │ Classification │ Severity │
├─────────────────────────────────┼──────────────────────────────────────────────────────────────┼────────────────┼──────────┤
│ acl                             │ GPLv2+                                                       │ Non Standard   │ UNKNOWN  │
├─────────────────────────────────┤                                                              │                │          │
│ acpid                           │                                                              │                │          │
├─────────────────────────────────┼──────────────────────────────────────────────────────────────┤                │          │
│ alternatives                    │ GPLv2                                                        │                │          │
├─────────────────────────────────┤                                                              │                │          │
│ amazon-chrony-config            │                                                              │                │          │
├─────────────────────────────────┼──────────────────────────────────────────────────────────────┤                │          │
│ amazon-cloudwatch-agent         │ MIT                                                          │                │          │
├─────────────────────────────────┼──────────────────────────────────────────────────────────────┤                │          │

(中略)

├─────────────────────────────────┼──────────────────────────────────────────────────────────────┤                │          │
│ yum                             │ GPLv2+                                                       │                │          │
├─────────────────────────────────┼──────────────────────────────────────────────────────────────┤                │          │
│ zip                             │ BSD                                                          │                │          │
├─────────────────────────────────┼──────────────────────────────────────────────────────────────┤                │          │
│ zlib                            │ zlib and Boost                                               │                │          │
├─────────────────────────────────┼──────────────────────────────────────────────────────────────┤                │          │
│ zstd                            │ BSD and GPLv2                                                │                │          │
└─────────────────────────────────┴──────────────────────────────────────────────────────────────┴────────────────┴──────────┘

仕組み

最後に Trivy の VM image scanning の仕組みに関して調べたことをまとめておく📝 まず Aqua Blog の記事「Trivy Now Scans Amazon Machine Images (AMIs)」に Trivy でどのように AMI や Amazon EBS スナップショットに対してスキャンを実行しているのかという仕組みが詳しく載っている.Trivy では Amazon EC2 インスタンスの中にエージェントをセットアップする必要はなく,直接ボリュームのブロックを取得してスキャンをしているとのこと💡

blog.aquasec.com

そして,Trivy ドキュメントでは以下のアクションに対して権限が必要と書いてあった.よって Amazon EBS スナップショットのボリュームから直接ブロックを取得するために「EBS Direct API」を使っていて良い感じ❗️逆に言えば,実行時間がそれなりに長くなってしまうのはこういう背景があるからだと思う(あくまで予想).

  • ec2:DescribeImages
  • ebs:ListSnapshotBlocks
  • ebs:GetSnapshotBlock

aquasecurity.github.io

docs.aws.amazon.com

関連情報

Aqua の YouTube に Trivy の VM image scanning をリリースしたときの紹介動画が公開されていた👀

www.youtube.com

今後

今後は AMI もしくは Amazon EBS スナップショットを取得したら自動的に Trivy を実行する仕組みを考えたくて,今のところ Amazon EventBridge で以下のドキュメントを参考に EC2 AMI State Change (available) もしくは EBS Volume Notification (available) をトリガーして Amazon ECS Task もしくは AWS CodeBuild で Trivy を実行するのはどうかな〜なんて考えているところ \( 'ω')/ プロトタイプを構築したらまたまとめるぞー

docs.aws.amazon.com

docs.aws.amazon.com

Trivy 関連

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com