🔖

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イメージを作成するときにあまり意識がされないかもしれませんが、脆弱性を検知して危険なイメージを利用しないためにこのようなツールの採用をしてみたく、今回試してみました。

https://github.com/anchore/grype

使ってみた

インストール

インストール方法はこちらにあるとおりです。私の環境はmacbookなので、以下の方法でインストールしました。

brew tap anchore/grype
brew install grype

FastAPIサーバの脆弱性診断をしてみた

今回は検証用のイメージとして、以下の記事で実装したDockerイメージを対象に脆弱性検知をしてみました。

https://zenn.dev/akasan/articles/6618da4fe05367

まずはDockerイメージをビルドします。

docker build -t fastapi-grype:latest .

ビルドが完了したら、grypeを使って診断してみます。

grype fastapi-grype:latest

実行結果を見ると以下の項目について評価が表示されます。

  • NAME: インストールされている対象の名前
  • INSTALLED: インストールされているバージョン
  • FIXED IN: 脆弱性が修正されているバージョン(空欄の場合はまだ未修正)
  • TYPE: debbinなどインストールの種類
  • VULNERABILITY: CVE番号や脆弱性ID
  • SEVERITY: 脆弱性の重大度(Critical, High, Medium, Low, Negligible, Unknown)
  • EPSS %: 脆弱性が実際に悪用される確率を数値で表す指標
  • RISK: EPSSや脆弱性の影響範囲、攻撃コードの有無などを踏まえた grype独自のリスク評価

素人からするとVULNERABILITYの部分などはみてもパッとわからないですが、SEVERITYの部分を重点的にみた方がいいかなと思っています。特にCriticalHighになっているものは対応した方がいいということだと思います。実際、先ほどの例では以下の項目について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