grypeを使ってdockerイメージの脆弱性診断してみた
今回はgrypeを使って、dockerイメージの脆弱性を検知してみました。
grypeとは?
公式GitHubによると、
A vulnerability scanner for container images and filesystems. Easily install the binary to try it out. Works with Syft, the powerful SBOM (software bill of materials) tool for container images and filesystems.
ということで、コンテナイメージとファイルシステムの脆弱性スキャナーだということです。バイナリを簡単にインストールして試すことができ、コンテナイメージとファイルシステム用の強力なSBOM(ソフトウェア部品表)ツールであるSyftと連携できるようです(詳しく全然わからない、、、)。
普段Dockerイメージを作成するときにあまり意識がされないかもしれませんが、脆弱性を検知して危険なイメージを利用しないためにこのようなツールの採用をしてみたく、今回試してみました。
使ってみた
インストール
インストール方法はこちらにあるとおりです。私の環境はmacbookなので、以下の方法でインストールしました。
brew tap anchore/grype
brew install grype
FastAPIサーバの脆弱性診断をしてみた
今回は検証用のイメージとして、以下の記事で実装したDockerイメージを対象に脆弱性検知をしてみました。
まずはDockerイメージをビルドします。
docker build -t fastapi-grype:latest .
ビルドが完了したら、grype
を使って診断してみます。
grype fastapi-grype:latest
実行結果を見ると以下の項目について評価が表示されます。
-
NAME
: インストールされている対象の名前 -
INSTALLED
: インストールされているバージョン -
FIXED IN
: 脆弱性が修正されているバージョン(空欄の場合はまだ未修正) -
TYPE
:deb
やbin
などインストールの種類 -
VULNERABILITY
: CVE番号や脆弱性ID -
SEVERITY
: 脆弱性の重大度(Critical, High, Medium, Low, Negligible, Unknown) -
EPSS %
: 脆弱性が実際に悪用される確率を数値で表す指標 -
RISK
: EPSSや脆弱性の影響範囲、攻撃コードの有無などを踏まえた grype独自のリスク評価
素人からするとVULNERABILITY
の部分などはみてもパッとわからないですが、SEVERITY
の部分を重点的にみた方がいいかなと思っています。特にCritical
やHigh
になっているものは対応した方がいいということだと思います。実際、先ほどの例では以下の項目についてLow
以上を出してみました(出力結果をレベルごとに手動で並び替えました)。結果を見ると、修正されていない脆弱性も多数含まれていそうなので、本番環境に導入する場合は注意する必要がありそうです。
NAME INSTALLED FIXED IN TYPE VULNERABILITY SEVERITY EPSS % RISK
perl-base 5.36.0-7+deb12u2 (won't fix) deb CVE-2023-31484 High 79.51 1.1
dpkg 1.21.22 (won't fix) deb CVE-2025-6297 High 18.01 < 0.1
libpam-modules 1.5.2-6+deb12u1 deb CVE-2025-6020 High 4.61 < 0.1
libpam-modules-bin 1.5.2-6+deb12u1 deb CVE-2025-6020 High 4.61 < 0.1
libpam-runtime 1.5.2-6+deb12u1 deb CVE-2025-6020 High 4.61 < 0.1
libpam0g 1.5.2-6+deb12u1 deb CVE-2025-6020 High 4.61 < 0.1
libc-bin 2.36-9+deb12u10 (won't fix) deb CVE-2025-4802 High 0.56 < 0.1
libc6 2.36-9+deb12u10 (won't fix) deb CVE-2025-4802 High 0.56 < 0.1
libpam-modules 1.5.2-6+deb12u1 (won't fix) deb CVE-2024-22365 Medium 24.32 < 0.1
libpam-modules-bin 1.5.2-6+deb12u1 (won't fix) deb CVE-2024-22365 Medium 24.32 < 0.1
libpam-runtime 1.5.2-6+deb12u1 (won't fix) deb CVE-2024-22365 Medium 24.32 < 0.1
libpam0g 1.5.2-6+deb12u1 (won't fix) deb CVE-2024-22365 Medium 24.32 < 0.1
libncursesw6 6.4-4 (won't fix) deb CVE-2023-50495 Medium 15.47 < 0.1
libtinfo6 6.4-4 (won't fix) deb CVE-2023-50495 Medium 15.47 < 0.1
ncurses-base 6.4-4 (won't fix) deb CVE-2023-50495 Medium 15.47 < 0.1
ncurses-bin 6.4-4 (won't fix) deb CVE-2023-50495 Medium 15.47 < 0.1
libsqlite3-0 3.40.1-2+deb12u1 (won't fix) deb CVE-2025-29088 Medium 14.59 < 0.1
python 3.12.11 3.14.0b3 binary CVE-2025-6069 Medium 16.09 < 0.1
libpam-modules 1.5.2-6+deb12u1 (won't fix) deb CVE-2024-10041 Medium 6.37 < 0.1
libpam-modules-bin 1.5.2-6+deb12u1 (won't fix) deb CVE-2024-10041 Medium 6.37 < 0.1
libpam-runtime 1.5.2-6+deb12u1 (won't fix) deb CVE-2024-10041 Medium 6.37 < 0.1
libpam0g 1.5.2-6+deb12u1 (won't fix) deb CVE-2024-10041 Medium 6.37 < 0.1
libgssapi-krb5-2 1.20.1-2+deb12u3 (won't fix) deb CVE-2025-3576 Medium 4.18 < 0.1
libk5crypto3 1.20.1-2+deb12u3 (won't fix) deb CVE-2025-3576 Medium 4.18 < 0.1
libkrb5-3 1.20.1-2+deb12u3 (won't fix) deb CVE-2025-3576 Medium 4.18 < 0.1
libkrb5support0 1.20.1-2+deb12u3 (won't fix) deb CVE-2025-3576 Medium 4.18 < 0.1
perl-base 5.36.0-7+deb12u2 (won't fix) deb CVE-2025-40909 Medium 2.57 < 0.1
libncursesw6 6.4-4 (won't fix) deb CVE-2025-6141 Low 1.83 < 0.1
libtinfo6 6.4-4 (won't fix) deb CVE-2025-6141 Low 1.83 < 0.1
ncurses-base 6.4-4 (won't fix) deb CVE-2025-6141 Low 1.83 < 0.1
ncurses-bin 6.4-4 (won't fix) deb CVE-2025-6141 Low 1.83 < 0.1
gpgv 2.2.40-1.1 (won't fix) deb CVE-2025-30258 Low 1.22 < 0.1
login 1:4.13+dfsg1-1+deb12u1 (won't fix) deb CVE-2024-56433 Low 85.75 0.9
passwd 1:4.13+dfsg1-1+deb12u1 (won't fix) deb CVE-2024-56433 Low 85.75 0.9
coreutils 9.1-1 (won't fix) deb CVE-2016-2781 Low 26.01 < 0.1
出力形式を変更するには?
先ほどの例ではテーブル形式でしたが、ほかのフォーマットでも取得することができます。フォーマットの変更は-o <FORMAT>
のようにすることで対応できます。例えばJSONで取得したい場合は以下のようにすることでJSONフォーマットで取得できます。
grype fastapi-grype:latest | jq '.' > result.
実行すると以下のようなフォーマットで取得できます。
{
"matches": [
{
"vulnerability": {
"id": "CVE-2023-31484",
"dataSource": "https://security-tracker.debian.org/tracker/CVE-2023-31484",
"namespace": "debian:distro:debian:12",
"severity": "High",
"urls": [],
"description": "CPAN.pm before 2.35 does not verify TLS certificates when downloading distributions over HTTPS.",
"cvss": [
{
"source": "nvd@nist.gov",
"type": "Primary",
"version": "3.1",
"vector": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H",
"metrics": {
"baseScore": 8.1,
"exploitabilityScore": 2.3,
"impactScore": 5.9
},
"vendorMetadata": {}
}
],
"epss": [
{
"cve": "CVE-2023-31484",
"epss": 0.01385,
"percentile": 0.79512,
"date": "2025-07-02"
... 以下省略
まとめ
今回は脆弱性診断ツールであるgrype
を使ってみました。自分が開発している環境がどれほど脆弱性を含んでいるかを確認するために、ぜひ皆さんも使ってみてください。
Discussion