Docker Scoutによる脆弱性・依存性のスキャニング

今日のデジタル時代において、アプリケーションの設計が複雑になるにつれ、相互接続された依存関係の複雑な網を形成することが多くなっています。その結果、依存関係ツリーが膨大になり、監視と保守が困難になリつつあります

2017年9月に発生したEquifaxのデータ漏洩を例にとると、次のようになります。米国の大手信用調査機関の一つであるEquifaxは、JavaによるWebアプリケーションの開発に広く利用されているApache Strutフレームワークの依存関係の脆弱性（CVE-2017–5638）によりデータ漏洩に至りました。アップロードされたファイルの取り扱いを誤ったことで、ハッカーがリモートでコードを実行し、1億4700万人分の個人情報などが流出したのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477222/f0b476f5-078b-cdd1-f6ab-45664dc7bc2d.png)

Dockerでは、依存関係は一般的に、コンテナ化されたアプリケーションが適切に機能するために必要なサービスやライブラリと関連付けられます。これらの依存関係は、イメージの作成段階でDockerfileに概要を記述します。例えば、次のような要件を持つPythonアプリケーションを例にとると、以下のようになります：
    
    Flask==1.1.2
    NumPy==1.19.2
    pandas==1.1.3
    SQLAlchemy==1.3.19

そのDockerfileは、そのDockerfileでコンテナが実行されたときに、これらの要件をインストールするようにエンジンに指示します。

    FROM ubuntu:20.04
    RUN apt-get update && apt-get install -y python3.8 python3-pip
    WORKDIR /app
    COPY requirements.txt .
    RUN pip3 install -r requirements.txt
    COPY . .
    CMD [ "python3", "./app.py" ]

このようなアプリケーションは、そのシンプルさにもかかわらず、下記のような副次的な依存関係が組み込まれることによって、複雑さと潜在的な脆弱性のポイントが追加されることになります。

    $ sudo docker scan gtrekter/training:1.0 --dependency-tree 
    docker-image|training @ 1.0
       ├─ adduser @ 3.118ubuntu2
       │  └─ shadow/passwd @ 1:4.8.1-1ubuntu5.20.04.4
       │     ├─ libsemanage/libsemanage1 @ 3.0-1build2
       │     │  ├─ libsemanage/libsemanage-common @ 3.0-1build2
       │     │  └─ libsepol/libsepol1 @ 3.0-1ubuntu0.1
       │     ├─ pam/libpam-modules @ 1.3.1-5ubuntu4.6
       │     │  ├─ db5.3/libdb5.3 @ 5.3.28+dfsg1-0.6ubuntu2
       │     │  ├─ pam/libpam-modules-bin @ 1.3.1-5ubuntu4.6
       │     │  │  └─ pam/libpam0g @ 1.3.1-5ubuntu4.6
       │     │  └─ pam/libpam0g @ 1.3.1-5ubuntu4.6
       │     └─ pam/libpam0g @ 1.3.1-5ubuntu4.6
       ├─ apt @ 2.0.9
       │  ├─ adduser @ 3.118ubuntu2
       │  ├─ apt/libapt-pkg6.0 @ 2.0.9
       │  │  ├─ gcc-10/libstdc++6 @ 10.3.0-1ubuntu1~20.04
       │  │  ├─ libgcrypt20 @ 1.8.5-5ubuntu1.1
       │  │  ├─ lz4/liblz4-1 @ 1.9.2-2ubuntu0.20.04.1
       │  │  ├─ systemd/libsystemd0 @ 245.4-4ubuntu3.21
       │  │  │  ├─ libgcrypt20 @ 1.8.5-5ubuntu1.1
       │  │  │  └─ lz4/liblz4-1 @ 1.9.2-2ubuntu0.20.04.1
       │  │  └─ systemd/libudev1 @ 245.4-4ubuntu3.21
       │  ├─ gcc-10/libstdc++6 @ 10.3.0-1ubuntu1~20.04
       │  ├─ gnupg2/gpgv @ 2.2.19-3ubuntu2.2
       │  │  └─ libgcrypt20 @ 1.8.5-5ubuntu1.1
       │  ├─ gnutls28/libgnutls30 @ 3.6.13-2ubuntu1.8
       │  │  ├─ libidn2/libidn2-0 @ 2.2.0-2
       │  │  │  └─ libunistring/libunistring2 @ 0.9.10-2
       │  │  ├─ libtasn1-6 @ 4.16.0-2
       │  │  ├─ libunistring/libunistring2 @ 0.9.10-2
       │  │  ├─ nettle/libhogweed5 @ 3.5.1+really3.5.1-2ubuntu0.2
       │  │  │  └─ nettle/libnettle7 @ 3.5.1+really3.5.1-2ubuntu0.2
       │  │  ├─ nettle/libnettle7 @ 3.5.1+really3.5.1-2ubuntu0.2
       │  │  └─ p11-kit/libp11-kit0 @ 0.23.20-1ubuntu0.1
       │  │     └─ libffi/libffi7 @ 3.3-4
       │  ├─ libseccomp/libseccomp2 @ 2.5.1-1ubuntu1~20.04.2
       │  ├─ systemd/libsystemd0 @ 245.4-4ubuntu3.21
       │  └─ ubuntu-keyring @ 2020.02.11.4
       ├─ apt/libapt-pkg6.0 @ 2.0.9
       ├─ attr/libattr1 @ 1:2.4.48-5
       ├─ base-files @ 11ubuntu5.7
       │  └─ mawk @ 1.3.4.20200120-2
       ├─ base-passwd @ 3.5.47
       │  └─ cdebconf/libdebconfclient0 @ 0.251ubuntu1
       ├─ bash @ 5.0-6ubuntu1.2
       │  ├─ base-files @ 11ubuntu5.7
       │  └─ debianutils @ 4.9.1
       ├─ binutils @ 2.34-6ubuntu1.5
       │  ├─ binutils/binutils-common @ 2.34-6ubuntu1.5
       │  ├─ binutils/binutils-x86-64-linux-gnu @ 2.34-6ubuntu1.5
       │  │  ├─ binutils/binutils-common @ 2.34-6ubuntu1.5
       │  │  ├─ binutils/libbinutils @ 2.34-6ubuntu1.5
       │  │  ├─ binutils/libctf-nobfd0 @ 2.34-6ubuntu1.5
       │  │  ├─ binutils/libctf0 @ 2.34-6ubuntu1.5
       │  │  │  └─ binutils/libbinutils @ 2.34-6ubuntu1.5
       │  │  └─ gcc-10/libstdc++6 @ 10.3.0-1ubuntu1~20.04
       │  └─ binutils/libbinutils @ 2.34-6ubuntu1.5
       │     └─ binutils/binutils-common @ 2.34-6ubuntu1.5
       ├─ binutils/binutils-common @ 2.34-6ubuntu1.5
       ├─ binutils/binutils-x86-64-linux-gnu @ 2.34-6ubuntu1.5
       ├─ binutils/libbinutils @ 2.34-6ubuntu1.5
       ├─ binutils/libctf-nobfd0 @ 2.34-6ubuntu1.5
       ├─ binutils/libctf0 @ 2.34-6ubuntu1.5
       ├─ build-essential @ 12.8ubuntu1.1
       │  ├─ dpkg/dpkg-dev @ 1.19.7ubuntu3.2
       │  │  ├─ binutils @ 2.34-6ubuntu1.5
       │  │  ├─ bzip2 @ 1.0.8-2
       │  │  ├─ dpkg/libdpkg-perl @ 1.19.7ubuntu3.2
       │  │  ├─ make-dfsg/make @ 4.2.1-1.2
       │  │  ├─ patch @ 2.7.6-6
       │  │  └─ xz-utils @ 5.2.4-1ubuntu1.1
       │  ├─ gcc-defaults/g++ @ 4:9.3.0-1ubuntu2
       │  │  ├─ gcc-9 @ 9.4.0-1ubuntu1~20.04.1
       │  │  ├─ gcc-9/g++-9 @ 9.4.0-1ubuntu1~20.04.1
       │  │  │  ├─ gcc-9 @ 9.4.0-1ubuntu1~20.04.1
       │  │  │  ├─ gcc-9/gcc-9-base @ 9.4.0-1ubuntu1~20.04.1
       │  │  │  ├─ gcc-9/libstdc++-9-dev @ 9.4.0-1ubuntu1~20.04.1
       │  │  │  │  ├─ gcc-10/libstdc++6 @ 10.3.0-1ubuntu1~20.04
       │  │  │  │  ├─ gcc-9/gcc-9-base @ 9.4.0-1ubuntu1~20.04.1
       │  │  │  │  ├─ gcc-9/libgcc-9-dev @ 9.4.0-1ubuntu1~20.04.1
       │  │  │  │  └─ glibc/libc6-dev @ 2.31-0ubuntu9.9
       │  │  │  ├─ isl/libisl22 @ 0.22.1-1
       │  │  │  ├─ mpclib3/libmpc3 @ 1.1.0-1
       │  │  │  └─ mpfr4/libmpfr6 @ 4.0.2-1
       │  │  ├─ gcc-defaults/cpp @ 4:9.3.0-1ubuntu2
       │  │  └─ gcc-defaults/gcc @ 4:9.3.0-1ubuntu2
       │  ├─ gcc-defaults/gcc @ 4:9.3.0-1ubuntu2
       │  │  ├─ gcc-9 @ 9.4.0-1ubuntu1~20.04.1
       │  │  │  ├─ binutils @ 2.34-6ubuntu1.5
       │  │  │  ├─ gcc-10/libcc1-0 @ 10.3.0-1ubuntu1~20.04
       │  │  │  │  └─ gcc-10/libstdc++6 @ 10.3.0-1ubuntu1~20.04
       │  │  │  ├─ gcc-10/libstdc++6 @ 10.3.0-1ubuntu1~20.04
       │  │  │  ├─ gcc-9/cpp-9 @ 9.4.0-1ubuntu1~20.04.1
       │  │  │  ├─ gcc-9/gcc-9-base @ 9.4.0-1ubuntu1~20.04.1
       │  │  │  ├─ gcc-9/libgcc-9-dev @ 9.4.0-1ubuntu1~20.04.1
       │  │  │  │  ├─ gcc-10/libatomic1 @ 10.3.0-1ubuntu1~20.04
       │  │  │  │  ├─ gcc-10/libgomp1 @ 10.3.0-1ubuntu1~20.04
       │  │  │  │  ├─ gcc-10/libitm1 @ 10.3.0-1ubuntu1~20.04
       │  │  │  │  ├─ gcc-10/liblsan0 @ 10.3.0-1ubuntu1~20.04
       │  │  │  │  ├─ gcc-10/libquadmath0 @ 10.3.0-1ubuntu1~20.04
       │  │  │  │  ├─ gcc-10/libtsan0 @ 10.3.0-1ubuntu1~20.04
       │  │  │  │  ├─ gcc-10/libubsan1 @ 10.3.0-1ubuntu1~20.04
       │  │  │  │  │  └─ gcc-10/libstdc++6 @ 10.3.0-1ubuntu1~20.04
       │  │  │  │  ├─ gcc-9/gcc-9-base @ 9.4.0-1ubuntu1~20.04.1
       │  │  │  │  └─ gcc-9/libasan5 @ 9.4.0-1ubuntu1~20.04.1
       │  │  │  │     └─ gcc-9/gcc-9-base @ 9.4.0-1ubuntu1~20.04.1
       │  │  │  ├─ isl/libisl22 @ 0.22.1-1
       │  │  │  ├─ mpclib3/libmpc3 @ 1.1.0-1
       │  │  │  └─ mpfr4/libmpfr6 @ 4.0.2-1
       │  │  └─ gcc-defaults/cpp @ 4:9.3.0-1ubuntu2
       │  │     └─ gcc-9/cpp-9 @ 9.4.0-1ubuntu1~20.04.1
       │  │        ├─ gcc-9/gcc-9-base @ 9.4.0-1ubuntu1~20.04.1
       │  │        ├─ isl/libisl22 @ 0.22.1-1
       │  │        ├─ mpclib3/libmpc3 @ 1.1.0-1
       │  │        │  └─ mpfr4/libmpfr6 @ 4.0.2-1
       │  │        └─ mpfr4/libmpfr6 @ 4.0.2-1
       │  ├─ glibc/libc6-dev @ 2.31-0ubuntu9.9
       │  │  ├─ glibc/libc-dev-bin @ 2.31-0ubuntu9.9
       │  │  ├─ libxcrypt/libcrypt-dev @ 1:4.4.10-10ubuntu4
       │  │  └─ linux/linux-libc-dev @ 5.4.0-150.167
       │  └─ make-dfsg/make @ 4.2.1-1.2
       ├─ bzip2 @ 1.0.8-2
       ├─ cdebconf/libdebconfclient0 @ 0.251ubuntu1
       ├─ coreutils @ 8.30-3ubuntu2
       │  └─ attr/libattr1 @ 1:2.4.48-5
       ├─ cyrus-sasl2/libsasl2-2 @ 2.1.27+dfsg-2ubuntu0.1
       ├─ cyrus-sasl2/libsasl2-modules @ 2.1.27+dfsg-2ubuntu0.1
       │  └─ openssl/libssl1.1 @ 1.1.1f-1ubuntu2.19
       ├─ cyrus-sasl2/libsasl2-modules-db @ 2.1.27+dfsg-2ubuntu0.1
       ├─ dash @ 0.5.10.2-6
       │  └─ debianutils @ 4.9.1
       ├─ db5.3/libdb5.3 @ 5.3.28+dfsg1-0.6ubuntu2
       ├─ debianutils @ 4.9.1
       ├─ diffutils @ 1:3.7-3
       ├─ dpkg/dpkg-dev @ 1.19.7ubuntu3.2
       ├─ dpkg/libdpkg-perl @ 1.19.7ubuntu3.2
       ├─ e2fsprogs @ 1.45.5-2ubuntu1.1
       │  ├─ e2fsprogs/libext2fs2 @ 1.45.5-2ubuntu1.1
       │  ├─ e2fsprogs/libss2 @ 1.45.5-2ubuntu1.1
       │  ├─ e2fsprogs/logsave @ 1.45.5-2ubuntu1.1
       │  ├─ util-linux/libblkid1 @ 2.34-0.1ubuntu9.3
       │  └─ util-linux/libuuid1 @ 2.34-0.1ubuntu9.3
       ├─ e2fsprogs/libext2fs2 @ 1.45.5-2ubuntu1.1
       ├─ e2fsprogs/libss2 @ 1.45.5-2ubuntu1.1
       ├─ e2fsprogs/logsave @ 1.45.5-2ubuntu1.1
       ├─ expat/libexpat1-dev @ 2.2.9-1ubuntu0.6
       │  ├─ expat/libexpat1 @ 2.2.9-1ubuntu0.6
       │  └─ glibc/libc6-dev @ 2.31-0ubuntu9.9
       ├─ fakeroot @ 1.24-1
       │  └─ fakeroot/libfakeroot @ 1.24-1
       ├─ fakeroot/libfakeroot @ 1.24-1
       ├─ file @ 1:5.38-4
       │  └─ file/libmagic1 @ 1:5.38-4
       │     └─ file/libmagic-mgc @ 1:5.38-4
       ├─ file/libmagic-mgc @ 1:5.38-4
       ├─ file/libmagic1 @ 1:5.38-4
       ├─ findutils @ 4.7.0-1ubuntu1
       ├─ gcc-10/libatomic1 @ 10.3.0-1ubuntu1~20.04
       ├─ gcc-10/libcc1-0 @ 10.3.0-1ubuntu1~20.04
       ├─ gcc-10/libgomp1 @ 10.3.0-1ubuntu1~20.04
       ├─ gcc-10/libitm1 @ 10.3.0-1ubuntu1~20.04
       ├─ gcc-10/liblsan0 @ 10.3.0-1ubuntu1~20.04
       ├─ gcc-10/libquadmath0 @ 10.3.0-1ubuntu1~20.04
       ├─ gcc-10/libstdc++6 @ 10.3.0-1ubuntu1~20.04
       ├─ gcc-10/libtsan0 @ 10.3.0-1ubuntu1~20.04
       ├─ gcc-10/libubsan1 @ 10.3.0-1ubuntu1~20.04
       ├─ gcc-9 @ 9.4.0-1ubuntu1~20.04.1
       ├─ gcc-9/cpp-9 @ 9.4.0-1ubuntu1~20.04.1
       ├─ gcc-9/g++-9 @ 9.4.0-1ubuntu1~20.04.1
       ├─ gcc-9/gcc-9-base @ 9.4.0-1ubuntu1~20.04.1
       ├─ gcc-9/libasan5 @ 9.4.0-1ubuntu1~20.04.1
       ├─ gcc-9/libgcc-9-dev @ 9.4.0-1ubuntu1~20.04.1
       ├─ gcc-9/libstdc++-9-dev @ 9.4.0-1ubuntu1~20.04.1
       ├─ gcc-defaults/cpp @ 4:9.3.0-1ubuntu2
       ├─ gcc-defaults/g++ @ 4:9.3.0-1ubuntu2
       ├─ gcc-defaults/gcc @ 4:9.3.0-1ubuntu2
       ├─ gdbm/libgdbm-compat4 @ 1.18.1-5
       ├─ gdbm/libgdbm6 @ 1.18.1-5
       ├─ glibc/libc-bin @ 2.31-0ubuntu9.9
       ├─ glibc/libc-dev-bin @ 2.31-0ubuntu9.9
       ├─ glibc/libc6-dev @ 2.31-0ubuntu9.9
       ├─ gnupg2/dirmngr @ 2.2.19-3ubuntu2.2
       │  ├─ adduser @ 3.118ubuntu2
       │  ├─ gnupg2/gpgconf @ 2.2.19-3ubuntu2.2
       │  │  ├─ libassuan/libassuan0 @ 2.5.3-7ubuntu2
       │  │  ├─ libgcrypt20 @ 1.8.5-5ubuntu1.1
       │  │  └─ readline/libreadline8 @ 8.0-4
       │  ├─ gnutls28/libgnutls30 @ 3.6.13-2ubuntu1.8
       │  ├─ init-system-helpers @ 1.57
       │  ├─ libassuan/libassuan0 @ 2.5.3-7ubuntu2
       │  ├─ libgcrypt20 @ 1.8.5-5ubuntu1.1
       │  ├─ libksba/libksba8 @ 1.3.5-2ubuntu0.20.04.2
       │  ├─ lsb/lsb-base @ 11.1.0ubuntu2
       │  ├─ npth/libnpth0 @ 1.6-1
       │  └─ openldap/libldap-2.4-2 @ 2.4.49+dfsg-2ubuntu1.9
       │     ├─ cyrus-sasl2/libsasl2-2 @ 2.1.27+dfsg-2ubuntu0.1
       │     │  └─ cyrus-sasl2/libsasl2-modules-db @ 2.1.27+dfsg-2ubuntu0.1
       │     │     └─ db5.3/libdb5.3 @ 5.3.28+dfsg1-0.6ubuntu2
       │     ├─ gnutls28/libgnutls30 @ 3.6.13-2ubuntu1.8
       │     ├─ heimdal/libgssapi3-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  ├─ heimdal/libasn1-8-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  ├─ heimdal/libhcrypto4-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  │  ├─ heimdal/libasn1-8-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  │  └─ heimdal/libheimbase1-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  ├─ heimdal/libheimntlm0-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  │  ├─ heimdal/libhcrypto4-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  │  ├─ heimdal/libkrb5-26-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  │  │  ├─ heimdal/libasn1-8-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  │  │  ├─ heimdal/libhcrypto4-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  │  │  ├─ heimdal/libheimbase1-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  │  │  ├─ heimdal/libhx509-5-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  │  │  │  ├─ heimdal/libasn1-8-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  │  │  │  ├─ heimdal/libhcrypto4-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  │  │  │  ├─ heimdal/libheimbase1-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  │  │  │  └─ heimdal/libwind0-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  │  │  ├─ heimdal/libwind0-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  │  │  └─ sqlite3/libsqlite3-0 @ 3.31.1-4ubuntu0.5
       │     │  │  └─ heimdal/libwind0-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     │  └─ heimdal/libkrb5-26-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │     └─ openldap/libldap-common @ 2.4.49+dfsg-2ubuntu1.9
       ├─ gnupg2/gnupg @ 2.2.19-3ubuntu2.2
       │  ├─ gnupg2/dirmngr @ 2.2.19-3ubuntu2.2
       │  ├─ gnupg2/gnupg-l10n @ 2.2.19-3ubuntu2.2
       │  ├─ gnupg2/gnupg-utils @ 2.2.19-3ubuntu2.2
       │  │  ├─ libassuan/libassuan0 @ 2.5.3-7ubuntu2
       │  │  ├─ libgcrypt20 @ 1.8.5-5ubuntu1.1
       │  │  ├─ libksba/libksba8 @ 1.3.5-2ubuntu0.20.04.2
       │  │  └─ readline/libreadline8 @ 8.0-4
       │  ├─ gnupg2/gpg @ 2.2.19-3ubuntu2.2
       │  │  ├─ gnupg2/gpgconf @ 2.2.19-3ubuntu2.2
       │  │  ├─ libassuan/libassuan0 @ 2.5.3-7ubuntu2
       │  │  ├─ libgcrypt20 @ 1.8.5-5ubuntu1.1
       │  │  ├─ readline/libreadline8 @ 8.0-4
       │  │  └─ sqlite3/libsqlite3-0 @ 3.31.1-4ubuntu0.5
       │  ├─ gnupg2/gpg-agent @ 2.2.19-3ubuntu2.2
       │  │  ├─ gnupg2/gpgconf @ 2.2.19-3ubuntu2.2
       │  │  ├─ init-system-helpers @ 1.57
       │  │  ├─ libassuan/libassuan0 @ 2.5.3-7ubuntu2
       │  │  ├─ libgcrypt20 @ 1.8.5-5ubuntu1.1
       │  │  ├─ npth/libnpth0 @ 1.6-1
       │  │  └─ pinentry/pinentry-curses @ 1.1.0-3build1
       │  │     ├─ libassuan/libassuan0 @ 2.5.3-7ubuntu2
       │  │     └─ ncurses/libncursesw6 @ 6.2-0ubuntu2
       │  ├─ gnupg2/gpg-wks-client @ 2.2.19-3ubuntu2.2
       │  │  ├─ gnupg2/dirmngr @ 2.2.19-3ubuntu2.2
       │  │  ├─ gnupg2/gpg @ 2.2.19-3ubuntu2.2
       │  │  ├─ gnupg2/gpg-agent @ 2.2.19-3ubuntu2.2
       │  │  ├─ libassuan/libassuan0 @ 2.5.3-7ubuntu2
       │  │  └─ libgcrypt20 @ 1.8.5-5ubuntu1.1
       │  ├─ gnupg2/gpg-wks-server @ 2.2.19-3ubuntu2.2
       │  │  ├─ gnupg2/gpg @ 2.2.19-3ubuntu2.2
       │  │  ├─ gnupg2/gpg-agent @ 2.2.19-3ubuntu2.2
       │  │  └─ libgcrypt20 @ 1.8.5-5ubuntu1.1
       │  ├─ gnupg2/gpgsm @ 2.2.19-3ubuntu2.2
       │  │  ├─ gnupg2/gpgconf @ 2.2.19-3ubuntu2.2
       │  │  ├─ libassuan/libassuan0 @ 2.5.3-7ubuntu2
       │  │  ├─ libgcrypt20 @ 1.8.5-5ubuntu1.1
       │  │  ├─ libksba/libksba8 @ 1.3.5-2ubuntu0.20.04.2
       │  │  └─ readline/libreadline8 @ 8.0-4
       │  └─ gnupg2/gpgv @ 2.2.19-3ubuntu2.2
       ├─ gnupg2/gnupg-l10n @ 2.2.19-3ubuntu2.2
       ├─ gnupg2/gnupg-utils @ 2.2.19-3ubuntu2.2
       ├─ gnupg2/gpg @ 2.2.19-3ubuntu2.2
       ├─ gnupg2/gpg-agent @ 2.2.19-3ubuntu2.2
       ├─ gnupg2/gpg-wks-client @ 2.2.19-3ubuntu2.2
       ├─ gnupg2/gpg-wks-server @ 2.2.19-3ubuntu2.2
       ├─ gnupg2/gpgconf @ 2.2.19-3ubuntu2.2
       ├─ gnupg2/gpgsm @ 2.2.19-3ubuntu2.2
       ├─ gnupg2/gpgv @ 2.2.19-3ubuntu2.2
       ├─ gnutls28/libgnutls30 @ 3.6.13-2ubuntu1.8
       ├─ grep @ 3.4-1
       │  └─ pcre3/libpcre3 @ 2:8.39-12ubuntu0.1
       ├─ gzip @ 1.10-0ubuntu4.1
       ├─ heimdal/libasn1-8-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       ├─ heimdal/libgssapi3-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       ├─ heimdal/libhcrypto4-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       ├─ heimdal/libheimbase1-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       ├─ heimdal/libheimntlm0-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       ├─ heimdal/libhx509-5-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       ├─ heimdal/libkrb5-26-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       ├─ heimdal/libwind0-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       ├─ hostname @ 3.23
       ├─ init-system-helpers @ 1.57
       ├─ isl/libisl22 @ 0.22.1-1
       ├─ libalgorithm-diff-perl @ 1.19.03-2
       │  └─ perl @ 5.30.0-9ubuntu0.4
       │     ├─ perl/libperl5.30 @ 5.30.0-9ubuntu0.4
       │     │  ├─ db5.3/libdb5.3 @ 5.3.28+dfsg1-0.6ubuntu2
       │     │  ├─ gdbm/libgdbm-compat4 @ 1.18.1-5
       │     │  │  └─ gdbm/libgdbm6 @ 1.18.1-5
       │     │  ├─ gdbm/libgdbm6 @ 1.18.1-5
       │     │  └─ perl/perl-modules-5.30 @ 5.30.0-9ubuntu0.4
       │     └─ perl/perl-modules-5.30 @ 5.30.0-9ubuntu0.4
       ├─ libalgorithm-diff-xs-perl @ 0.04-6
       │  ├─ libalgorithm-diff-perl @ 1.19.03-2
       │  └─ perl @ 5.30.0-9ubuntu0.4
       ├─ libalgorithm-merge-perl @ 0.08-3
       │  ├─ libalgorithm-diff-perl @ 1.19.03-2
       │  └─ perl @ 5.30.0-9ubuntu0.4
       ├─ libassuan/libassuan0 @ 2.5.3-7ubuntu2
       ├─ libffi/libffi7 @ 3.3-4
       ├─ libfile-fcntllock-perl @ 0.22-3build4
       │  └─ perl @ 5.30.0-9ubuntu0.4
       ├─ libgcrypt20 @ 1.8.5-5ubuntu1.1
       ├─ libidn2/libidn2-0 @ 2.2.0-2
       ├─ libksba/libksba8 @ 1.3.5-2ubuntu0.20.04.2
       ├─ liblocale-gettext-perl @ 1.07-4
       ├─ libseccomp/libseccomp2 @ 2.5.1-1ubuntu1~20.04.2
       ├─ libsemanage/libsemanage-common @ 3.0-1build2
       ├─ libsemanage/libsemanage1 @ 3.0-1build2
       ├─ libsepol/libsepol1 @ 3.0-1ubuntu0.1
       ├─ libtasn1-6 @ 4.16.0-2
       ├─ libunistring/libunistring2 @ 0.9.10-2
       ├─ libxcrypt/libcrypt-dev @ 1:4.4.10-10ubuntu4
       ├─ linux/linux-libc-dev @ 5.4.0-150.167
       ├─ lsb/lsb-base @ 11.1.0ubuntu2
       ├─ lz4/liblz4-1 @ 1.9.2-2ubuntu0.20.04.1
       ├─ make-dfsg/make @ 4.2.1-1.2
       ├─ manpages @ 5.05-1
       ├─ manpages/manpages-dev @ 5.05-1
       │  └─ manpages @ 5.05-1
       ├─ mawk @ 1.3.4.20200120-2
       ├─ meta-common-packages @ meta
       │  ├─ acl/libacl1 @ 2.2.53-6
       │  ├─ audit/libaudit-common @ 1:2.8.5-2ubuntu6
       │  ├─ audit/libaudit1 @ 1:2.8.5-2ubuntu6
       │  ├─ bzip2/libbz2-1.0 @ 1.0.8-2
       │  ├─ debconf @ 1.5.73
       │  ├─ dpkg @ 1.19.7ubuntu3.2
       │  ├─ e2fsprogs/libcom-err2 @ 1.45.5-2ubuntu1.1
       │  ├─ gcc-10/gcc-10-base @ 10.3.0-1ubuntu1~20.04
       │  ├─ gcc-10/libgcc-s1 @ 10.3.0-1ubuntu1~20.04
       │  ├─ glibc/libc6 @ 2.31-0ubuntu9.9
       │  ├─ gmp/libgmp10 @ 2:6.2.0+dfsg-4ubuntu0.1
       │  ├─ heimdal/libroken18-heimdal @ 7.7.0+dfsg-1ubuntu1.4
       │  ├─ libcap-ng/libcap-ng0 @ 0.7.9-2.1build1
       │  ├─ libgpg-error/libgpg-error0 @ 1.37-1
       │  ├─ libselinux/libselinux1 @ 3.0-1build2
       │  ├─ libxcrypt/libcrypt1 @ 1:4.4.10-10ubuntu4
       │  ├─ libzstd/libzstd1 @ 1.4.4+dfsg-3ubuntu0.1
       │  ├─ ncurses/libtinfo6 @ 6.2-0ubuntu2
       │  ├─ pcre2/libpcre2-8-0 @ 10.34-7ubuntu0.1
       │  ├─ perl/perl-base @ 5.30.0-9ubuntu0.4
       │  ├─ tar @ 1.30+dfsg-7ubuntu0.20.04.3
       │  ├─ xz-utils/liblzma5 @ 5.2.4-1ubuntu1.1
       │  └─ zlib/zlib1g @ 1:1.2.11.dfsg-2ubuntu1.5
       ├─ mpclib3/libmpc3 @ 1.1.0-1
       ├─ mpfr4/libmpfr6 @ 4.0.2-1
       ├─ ncurses/libncurses6 @ 6.2-0ubuntu2
       ├─ ncurses/libncursesw6 @ 6.2-0ubuntu2
       ├─ ncurses/ncurses-base @ 6.2-0ubuntu2
       ├─ ncurses/ncurses-bin @ 6.2-0ubuntu2
       ├─ netbase @ 6.1
       ├─ nettle/libhogweed5 @ 3.5.1+really3.5.1-2ubuntu0.2
       ├─ nettle/libnettle7 @ 3.5.1+really3.5.1-2ubuntu0.2
       ├─ npth/libnpth0 @ 1.6-1
       ├─ openldap/libldap-2.4-2 @ 2.4.49+dfsg-2ubuntu1.9
       ├─ openldap/libldap-common @ 2.4.49+dfsg-2ubuntu1.9
       ├─ p11-kit/libp11-kit0 @ 0.23.20-1ubuntu0.1
       ├─ pam/libpam-modules @ 1.3.1-5ubuntu4.6
       ├─ pam/libpam-modules-bin @ 1.3.1-5ubuntu4.6
       ├─ pam/libpam-runtime @ 1.3.1-5ubuntu4.6
       │  └─ pam/libpam-modules @ 1.3.1-5ubuntu4.6
       ├─ pam/libpam0g @ 1.3.1-5ubuntu4.6
       ├─ patch @ 2.7.6-6
       ├─ pcre3/libpcre3 @ 2:8.39-12ubuntu0.1
       ├─ perl @ 5.30.0-9ubuntu0.4
       ├─ perl/libperl5.30 @ 5.30.0-9ubuntu0.4
       ├─ perl/perl-modules-5.30 @ 5.30.0-9ubuntu0.4
       ├─ pinentry/pinentry-curses @ 1.1.0-3build1
       ├─ procps @ 2:3.3.16-1ubuntu2.3
       │  ├─ init-system-helpers @ 1.57
       │  ├─ lsb/lsb-base @ 11.1.0ubuntu2
       │  ├─ ncurses/libncurses6 @ 6.2-0ubuntu2
       │  ├─ ncurses/libncursesw6 @ 6.2-0ubuntu2
       │  └─ procps/libprocps8 @ 2:3.3.16-1ubuntu2.3
       ├─ procps/libprocps8 @ 2:3.3.16-1ubuntu2.3
       │  └─ systemd/libsystemd0 @ 245.4-4ubuntu3.21
       ├─ python-pip/python3-pip @ 20.0.2-5ubuntu1.8
       │  ├─ ca-certificates @ 20230311ubuntu0.20.04.1
       │  │  └─ openssl @ 1.1.1f-1ubuntu2.19
       │  │     └─ openssl/libssl1.1 @ 1.1.1f-1ubuntu2.19
       │  ├─ python-pip/python-pip-whl @ 20.0.2-5ubuntu1.8
       │  │  └─ ca-certificates @ 20230311ubuntu0.20.04.1
       │  ├─ python3-stdlib-extensions/python3-distutils @ 3.8.10-0ubuntu1~20.04
       │  │  └─ python3-stdlib-extensions/python3-lib2to3 @ 3.8.10-0ubuntu1~20.04
       │  ├─ setuptools/python3-setuptools @ 45.2.0-1ubuntu0.1
       │  │  ├─ python3-stdlib-extensions/python3-distutils @ 3.8.10-0ubuntu1~20.04
       │  │  └─ setuptools/python3-pkg-resources @ 45.2.0-1ubuntu0.1
       │  └─ wheel/python3-wheel @ 0.34.2-1ubuntu0.1
       ├─ python3-defaults/libpython3-dev @ 3.8.2-0ubuntu2
       │  └─ python3.8/libpython3.8-dev @ 3.8.10-0ubuntu1~20.04.8
       │     ├─ expat/libexpat1-dev @ 2.2.9-1ubuntu0.6
       │     ├─ python3.8/libpython3.8 @ 3.8.10-0ubuntu1~20.04.8
       │     │  ├─ expat/libexpat1 @ 2.2.9-1ubuntu0.6
       │     │  └─ python3.8/libpython3.8-stdlib @ 3.8.10-0ubuntu1~20.04.8
       │     └─ python3.8/libpython3.8-stdlib @ 3.8.10-0ubuntu1~20.04.8
       ├─ python3-defaults/libpython3-stdlib @ 3.8.2-0ubuntu2
       │  └─ python3.8/libpython3.8-stdlib @ 3.8.10-0ubuntu1~20.04.8
       ├─ python3-defaults/python3 @ 3.8.2-0ubuntu2
       │  ├─ python3-defaults/libpython3-stdlib @ 3.8.2-0ubuntu2
       │  ├─ python3-defaults/python3-minimal @ 3.8.2-0ubuntu2
       │  │  └─ python3.8/python3.8-minimal @ 3.8.10-0ubuntu1~20.04.8
       │  └─ python3.8 @ 3.8.10-0ubuntu1~20.04.8
       ├─ python3-defaults/python3-dev @ 3.8.2-0ubuntu2
       │  ├─ python3-defaults/libpython3-dev @ 3.8.2-0ubuntu2
       │  ├─ python3-defaults/python3 @ 3.8.2-0ubuntu2
       │  ├─ python3-stdlib-extensions/python3-distutils @ 3.8.10-0ubuntu1~20.04
       │  └─ python3.8/python3.8-dev @ 3.8.10-0ubuntu1~20.04.8
       │     ├─ expat/libexpat1-dev @ 2.2.9-1ubuntu0.6
       │     ├─ python3.8 @ 3.8.10-0ubuntu1~20.04.8
       │     ├─ python3.8/libpython3.8 @ 3.8.10-0ubuntu1~20.04.8
       │     ├─ python3.8/libpython3.8-dev @ 3.8.10-0ubuntu1~20.04.8
       │     └─ zlib/zlib1g-dev @ 1:1.2.11.dfsg-2ubuntu1.5
       │        └─ glibc/libc6-dev @ 2.31-0ubuntu9.9
       ├─ python3-defaults/python3-minimal @ 3.8.2-0ubuntu2
       ├─ python3.8 @ 3.8.10-0ubuntu1~20.04.8
       │  ├─ mime-support @ 3.64ubuntu1
       │  ├─ python3.8/libpython3.8-stdlib @ 3.8.10-0ubuntu1~20.04.8
       │  │  ├─ db5.3/libdb5.3 @ 5.3.28+dfsg1-0.6ubuntu2
       │  │  ├─ libffi/libffi7 @ 3.3-4
       │  │  ├─ mime-support @ 3.64ubuntu1
       │  │  ├─ mpdecimal/libmpdec2 @ 2.4.2-3
       │  │  ├─ ncurses/libncursesw6 @ 6.2-0ubuntu2
       │  │  ├─ python3.8/libpython3.8-minimal @ 3.8.10-0ubuntu1~20.04.8
       │  │  ├─ readline/libreadline8 @ 8.0-4
       │  │  │  └─ readline/readline-common @ 8.0-4
       │  │  ├─ sqlite3/libsqlite3-0 @ 3.31.1-4ubuntu0.5
       │  │  └─ util-linux/libuuid1 @ 2.34-0.1ubuntu9.3
       │  └─ python3.8/python3.8-minimal @ 3.8.10-0ubuntu1~20.04.8
       │     ├─ expat/libexpat1 @ 2.2.9-1ubuntu0.6
       │     └─ python3.8/libpython3.8-minimal @ 3.8.10-0ubuntu1~20.04.8
       │        └─ openssl/libssl1.1 @ 1.1.1f-1ubuntu2.19
       ├─ python3.8/libpython3.8 @ 3.8.10-0ubuntu1~20.04.8
       ├─ python3.8/libpython3.8-dev @ 3.8.10-0ubuntu1~20.04.8
       ├─ python3.8/python3.8-dev @ 3.8.10-0ubuntu1~20.04.8
       ├─ sed @ 4.7-1
       ├─ sensible-utils @ 0.0.12+nmu1
       ├─ shadow/login @ 1:4.8.1-1ubuntu5.20.04.4
       │  ├─ pam/libpam-modules @ 1.3.1-5ubuntu4.6
       │  ├─ pam/libpam-runtime @ 1.3.1-5ubuntu4.6
       │  └─ pam/libpam0g @ 1.3.1-5ubuntu4.6
       ├─ shadow/passwd @ 1:4.8.1-1ubuntu5.20.04.4
       ├─ systemd/libsystemd0 @ 245.4-4ubuntu3.21
       ├─ systemd/libudev1 @ 245.4-4ubuntu3.21
       ├─ sysvinit/sysvinit-utils @ 2.96-2.1ubuntu1
       │  ├─ init-system-helpers @ 1.57
       │  ├─ lsb/lsb-base @ 11.1.0ubuntu2
       │  └─ util-linux @ 2.34-0.1ubuntu9.3
       ├─ ubuntu-keyring @ 2020.02.11.4
       ├─ util-linux @ 2.34-0.1ubuntu9.3
       ├─ util-linux/bsdutils @ 1:2.34-0.1ubuntu9.3
       │  └─ systemd/libsystemd0 @ 245.4-4ubuntu3.21
       ├─ util-linux/fdisk @ 2.34-0.1ubuntu9.3
       │  ├─ ncurses/libncursesw6 @ 6.2-0ubuntu2
       │  ├─ util-linux/libfdisk1 @ 2.34-0.1ubuntu9.3
       │  │  ├─ util-linux/libblkid1 @ 2.34-0.1ubuntu9.3
       │  │  └─ util-linux/libuuid1 @ 2.34-0.1ubuntu9.3
       │  ├─ util-linux/libmount1 @ 2.34-0.1ubuntu9.3
       │  │  └─ util-linux/libblkid1 @ 2.34-0.1ubuntu9.3
       │  └─ util-linux/libsmartcols1 @ 2.34-0.1ubuntu9.3
       ├─ util-linux/libblkid1 @ 2.34-0.1ubuntu9.3
       ├─ util-linux/libfdisk1 @ 2.34-0.1ubuntu9.3
       ├─ util-linux/libmount1 @ 2.34-0.1ubuntu9.3
       ├─ util-linux/libsmartcols1 @ 2.34-0.1ubuntu9.3
       ├─ util-linux/libuuid1 @ 2.34-0.1ubuntu9.3
       ├─ util-linux/mount @ 2.34-0.1ubuntu9.3
       │  ├─ util-linux @ 2.34-0.1ubuntu9.3
       │  │  ├─ pam/libpam0g @ 1.3.1-5ubuntu4.6
       │  │  ├─ shadow/login @ 1:4.8.1-1ubuntu5.20.04.4
       │  │  ├─ systemd/libsystemd0 @ 245.4-4ubuntu3.21
       │  │  ├─ systemd/libudev1 @ 245.4-4ubuntu3.21
       │  │  ├─ util-linux/libblkid1 @ 2.34-0.1ubuntu9.3
       │  │  ├─ util-linux/libmount1 @ 2.34-0.1ubuntu9.3
       │  │  ├─ util-linux/libsmartcols1 @ 2.34-0.1ubuntu9.3
       │  │  └─ util-linux/libuuid1 @ 2.34-0.1ubuntu9.3
       │  ├─ util-linux/libblkid1 @ 2.34-0.1ubuntu9.3
       │  ├─ util-linux/libmount1 @ 2.34-0.1ubuntu9.3
       │  └─ util-linux/libsmartcols1 @ 2.34-0.1ubuntu9.3
       ├─ xz-utils @ 5.2.4-1ubuntu1.1
       └─ zlib/zlib1g-dev @ 1:1.2.11.dfsg-2ubuntu1.5

これらの依存関係のどれもが、あなたのソフトウェアに脆弱性を持ち込まないことを保証することができますか？

# 依存性・脆弱性スキャン

依存関係や脆弱性をスキャンするツールは、これまでかなり前から存在しており、オープンソースやプレミアムなオプションも含まれています。例えば、GitHubのDependabotは、定期的な脆弱性チェックを行い、より安全なアップデートを自動的に提案しています。同じくWhiteSourceは、オープンソースの脆弱性をリアルタイムで特定し、ライセンスに関するコンプライアンスやガバナンスツールを提供しています。こうした機能の重要性に注目したDockerは、2020年後半にSnykと提携し、docker scanコマンドによるDockerイメージの脆弱性スキャンを可能にしました。

# スキャニングからスカウティングへの移行

Dockerの最新製品に飛び込む前に、以前紹介した機能をもう一度見直し、その進化を理解するのがよいでしょう。問題の機能は、ボストンに拠点を置くサイバーセキュリティ企業であるSnykが開発したセキュリティプラットフォームに依存しています。Snykの脆弱性データベースは、National Vulnerability Database（NVD）や同社の調査など、さまざまなソースからのデータで継続的に更新されています。

この機能を使用するには、Snykを利用するためのDockerの同意が必要となります。docker scanコマンドを初めて起動したときに、その同意を得るように要求されます。

    $ docker scan
    Docker Scan relies upon access to Snyk, a third party provider, do you consent to proceed using Snyk? (y/N)

同意が得られると、DockerはSnykイメージをお客様のマシンにダウンロードし、Dockerのスキャンプロセスでこのイメージを実行します。

    gtrekter@vm-uks-01:~$ sudo docker image ls -a
    REPOSITORY          TAG       IMAGE ID       CREATED        SIZE
    gtrekter/training   1.0       76b54e901ebd   3 hours ago    585MB
    nginx               <none>    f9c14fe76d50   2 weeks ago    143MB
    snyk/snyk           <none>    4db3fcadc7e4   6 months ago   213MB

ただし、このイメージにはSNYK_TOKENという環境変数に格納されたSnyk APIトークンが必要なため、最初にDocker Hubにログインしておく必要があります。

    $ docker login
    Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
    Username: xxxxxxx
    Password: 
    
    Login Succeeded

その後、スキャンを開始することで、DockerはSnykのイメージを使用して新しい容器を実行し、Snykの使用のためにSNYK_DOCKER_TOKENという環境変数を渡します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477222/f565dc2c-fcad-67be-4034-d01f7dc3487b.png)

出力は、Snyk によって提供される合理化された結果です。

    $ sudo docker scan gtrekter/training:1.0
    
    Testing gtrekter/training:1.0...
    
    ✗ Low severity vulnerability found in systemd/libsystemd0
      Description: CVE-2023-26604
      Info: https://security.snyk.io/vuln/SNYK-UBUNTU2004-SYSTEMD-3339226
      Introduced through: systemd/libsystemd0@245.4-4ubuntu3.21, apt@2.0.9, procps/libprocps8@2:3.3.16-1ubuntu2.3, util-linux/bsdutils@1:2.34-0.1ubuntu9.3, util-linux/mount@2.34-0.1ubuntu9.3, systemd/libudev1@245.4-4ubuntu3.21
      From: systemd/libsystemd0@245.4-4ubuntu3.21
      From: apt@2.0.9 > systemd/libsystemd0@245.4-4ubuntu3.21
      From: procps/libprocps8@2:3.3.16-1ubuntu2.3 > systemd/libsystemd0@245.4-4ubuntu3.21
      and 6 more...
      Image layer: Introduced by your base image (ubuntu:20.04)
    
    ✗ Medium severity vulnerability found in gcc-defaults/cpp
      Description: Information Exposure
      Info: https://security.snyk.io/vuln/SNYK-UBUNTU2004-GCCDEFAULTS-584255
      Introduced through: gcc-defaults/cpp@4:9.3.0-1ubuntu2, build-essential@12.8ubuntu1.1, gcc-defaults/gcc@4:9.3.0-1ubuntu2, gcc-defaults/g++@4:9.3.0-1ubuntu2
      From: gcc-defaults/cpp@4:9.3.0-1ubuntu2
      From: build-essential@12.8ubuntu1.1 > gcc-defaults/g++@4:9.3.0-1ubuntu2 > gcc-defaults/cpp@4:9.3.0-1ubuntu2
      From: build-essential@12.8ubuntu1.1 > gcc-defaults/gcc@4:9.3.0-1ubuntu2 > gcc-defaults/cpp@4:9.3.0-1ubuntu2
      and 5 more...
      Image layer: Introduced by your base image (ubuntu:20.04)
    
    ✗ Medium severity vulnerability found in gcc-9
      Description: Information Exposure
      Info: https://security.snyk.io/vuln/SNYK-UBUNTU2004-GCC9-584247
      Introduced through: gcc-9@9.4.0-1ubuntu1~20.04.1, build-essential@12.8ubuntu1.1, gcc-9/gcc-9-base@9.4.0-1ubuntu1~20.04.1, gcc-9/libgcc-9-dev@9.4.0-1ubuntu1~20.04.1, gcc-9/libstdc++-9-dev@9.4.0-1ubuntu1~20.04.1, gcc-9/g++-9@9.4.0-1ubuntu1~20.04.1, gcc-9/cpp-9@9.4.0-1ubuntu1~20.04.1, gcc-9/libasan5@9.4.0-1ubuntu1~20.04.1
      From: gcc-9@9.4.0-1ubuntu1~20.04.1
      From: build-essential@12.8ubuntu1.1 > gcc-defaults/g++@4:9.3.0-1ubuntu2 > gcc-9@9.4.0-1ubuntu1~20.04.1
      From: build-essential@12.8ubuntu1.1 > gcc-defaults/gcc@4:9.3.0-1ubuntu2 > gcc-9@9.4.0-1ubuntu1~20.04.1
      and 20 more...
      Image layer: Introduced by your base image (ubuntu:20.04)
    
    Package manager:   deb
    Project name:      docker-image|gtrekter/training
    Docker image:      gtrekter/training:1.0
    Platform:          linux/amd64
    Base image:        ubuntu:20.04
    
    Tested 206 dependencies for known vulnerabilities, found 3 vulnerabilities.
    
    According to our scan, you are currently using the most secure version of the selected base image
    
    For more free scans that keep your images secure, sign up to Snyk at https://dockr.ly/3ePqVc

しかし、ライセンスには大きな欠点がありました。 Snykとの連携により、プレミアムアカウントをお持ちでない限り、この機能は月に100回しかスキャンできませんでした。 この制限は、バージョン4.17.0（2023年2月27日にリリース）でDocker Scoutが導入され、その後「Docker scan」機能が削除されるなど、Docker独自の脆弱性データベースを作成する決定に貢献した可能性が高い。

# Docker Scout

前任者とは異なり、Docker Scoutはサードパーティ製ソフトウェアを使用せず、同意を要求したり追加の画像を取得したりしません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477222/df653043-33a8-7b03-c078-c4c5888aa5c7.png)

Docker Scoutはまだ「早期アクセス」の段階にあり、利用するには以下の手順を実行してプラグインをインストールする必要があります:

    $ curl -fsSL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh -o install-scout.sh
    $ sh install-scout.sh

シェルスクリプトを検査すると、Dockerの公式GitHubリポジトリから私たちのマシンのOSとアーキテクチャに従ってzipファイルがダウンロードされることがわかります。

    PROJECT_NAME="docker-scout"
    OWNER=docker
    REPO="scout-cli"
    GITHUB_DOWNLOAD_PREFIX=https://github.com/${OWNER}/${REPO}/releases/download
    INSTALL_SH_BASE_URL=https://raw.githubusercontent.com/${OWNER}/${REPO}
    ....
    version=$(tag_to_version "${tag}")
    os=$(uname_os)
    arch=$(uname_arch)
    format=$(get_format_name "${os}" "${arch}" "tar.gz")
    binary=$(get_binary_name "${os}" "${arch}" "${BINARY}")
    download_url="${GITHUB_DOWNLOAD_PREFIX}/${tag}"
    ...
    download_and_install_asset "${download_url}" "${download_dir}" "${install_dir}" "${PROJECT_NAME}" "${os}" "${arch}" "${version}" "${format}" "${binary}"

プラグインをインストールしたら、コマンド CVE を実行して、イメージのすべての脆弱性をスキャンして表示できます。

    gtrekter@vm-uks-01:~$ docker scout cves gtrekter/training:1.0
        ✓ Pulled
        ✓ SBOM of image already cached, 276 packages indexed
        ✗ Detected 9 vulnerable packages with a total of 10 vulnerabilities
    
       0C     1H     0M     0L  wheel 0.34.2
    pkg:pypi/wheel@0.34.2
    
        ✗ HIGH CVE-2022-40898
          https://dso.docker.com/cve/CVE-2022-40898
          Affected range : <=0.37.1                                      
          Fixed version  : 0.38.1                                        
          CVSS Score     : 7.5                                           
          CVSS Vector    : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
    
       0C     1H     0M     0L  flask 1.1.2
    pkg:pypi/flask@1.1.2
    
        ✗ HIGH CVE-2023-30861 [Use of Persistent Cookies Containing Sensitive Information]
          https://dso.docker.com/cve/CVE-2023-30861
          Affected range : <2.2.5                                        
          Fixed version  : 2.2.5                                         
          CVSS Score     : 7.5                                           
          CVSS Vector    : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
    
       0C     0H     1M     0L  setuptools 45.2.0
    pkg:pypi/setuptools@45.2.0
    
        ✗ MEDIUM CVE-2022-40897
          https://dso.docker.com/cve/CVE-2022-40897
          Affected range : <65.5.1                                       
          Fixed version  : 65.5.1                                        
          CVSS Score     : 5.9                                           
          CVSS Vector    : CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H
    
       0C     0H     1M     0L  pip 20.0.2
    pkg:pypi/pip@20.0.2
    
        ✗ MEDIUM CVE-2021-3572
          https://dso.docker.com/cve/CVE-2021-3572
          Affected range : <21.1                                         
          Fixed version  : 21.1                                          
          CVSS Score     : 5.7                                           
          CVSS Vector    : CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:N
    
       0C     0H     1M     0L  python3.8 3.8.10-0ubuntu1~20.04.8
    pkg:deb/ubuntu/python3.8@3.8.10-0ubuntu1~20.04.8?os_distro=focal&os_name=ubuntu&os_version=20.04
    
        ✗ MEDIUM CVE-2023-27043 [Improper Input Validation]
          https://dso.docker.com/cve/CVE-2023-27043
          Affected range : >=0                                           
          Fixed version  : not fixed                                     
          CVSS Score     : 5.3                                           
          CVSS Vector    : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N
    
       0C     0H     1M     0L  numpy 1.19.2
    pkg:pypi/numpy@1.19.2
    
        ✗ MEDIUM CVE-2021-34141 [Incorrect Comparison]
          https://dso.docker.com/cve/CVE-2021-34141
          Affected range : <1.22                                         
          Fixed version  : 1.22                                          
          CVSS Score     : 5.3                                           
          CVSS Vector    : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
    
       0C     0H     0M     2L  shadow 1:4.8.1-1ubuntu5.20.04.4
    pkg:deb/ubuntu/shadow@1:4.8.1-1ubuntu5.20.04.4?os_distro=focal&os_name=ubuntu&os_version=20.04
    
        ✗ LOW CVE-2013-4235 [Time-of-check Time-of-use (TOCTOU) Race Condition]
          https://dso.docker.com/cve/CVE-2013-4235
          Affected range : >=0                                           
          Fixed version  : not fixed                                     
          CVSS Score     : 4.7                                           
          CVSS Vector    : CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:H/A:N  
        
        ✗ LOW CVE-2023-29383 [Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection')]
          https://dso.docker.com/cve/CVE-2023-29383
          Affected range : >=0                                           
          Fixed version  : not fixed                                     
          CVSS Score     : 3.3                                           
          CVSS Vector    : CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N
    
       0C     0H     0M     1L  pcre3 2:8.39-12ubuntu0.1
    pkg:deb/ubuntu/pcre3@2:8.39-12ubuntu0.1?os_distro=focal&os_name=ubuntu&os_version=20.04
    
        ✗ LOW CVE-2017-11164 [Uncontrolled Recursion]
          https://dso.docker.com/cve/CVE-2017-11164
          Affected range : >=0                                           
          Fixed version  : not fixed                                     
          CVSS Score     : 7.5                                           
          CVSS Vector    : CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
    
       0C     0H     0M     1L  glibc 2.31-0ubuntu9.9
    pkg:deb/ubuntu/glibc@2.31-0ubuntu9.9?os_distro=focal&os_name=ubuntu&os_version=20.04
    
        ✗ LOW CVE-2016-20013 [Allocation of Resources Without Limits or Throttling]
          https://dso.docker.com/cve/CVE-2016-20013
          Affected range : >=0                                           
          Fixed version  : not fixed                                     
          CVSS Score     : 7.5                                           
          CVSS Vector    : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
    
    
    10 vulnerabilities found in 9 packages
      LOW       4 
      MEDIUM    4 
      HIGH      2   
      CRITICAL  0   
    
    What's Next?
      Know more about base image update recommendations → docker scout recommendations gtrekter/training:1.0
    
この場合、出力には Snyk Vulnerability Database へのリンクではなく、Docker Image Vulnerability Database へのリンクが表示されます。これには次の内容が含まれます:
    
- National Vulnerability Database（NVD; 国家脆弱性データベース）に関するカテゴリ。
- 脆弱性の説明。
- 脆弱性を含むパッケージのリストと、考えられる不正利用へのリンク。
- 可能な修正のリスト。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477222/9fb25490-ff2d-82ee-2491-411cb9f4325e.png)

# Docker Hub とのデフォルト統合

機能をサードパーティ製ソフトウェアに依存せずに内部で移動することで、Docker は Docker Hub との強力な統合を開発することができました。 特定のリポジトリに対してAdvanced Image Analysisを有効にすることで、Docker Scoutはイメージをそのリポジトリにプッシュすると自動的に分析します。 高度なイメージ分析を有効にするには、次の作業を行う必要があります:

- Docker Hub を参照してログインします。
- [Repositories] をクリックし、高度なイメージ分析を許可するリポジトリを選択します。
- 設定をクリックして、Docker Scoutが提供する高度なイメージ分析を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477222/9bc558a7-6521-ff7d-e4a2-8f95a8e0a98d.png)

- [Save] をクリックします。

この時点から、イメージをこのリポジトリにプッシュするたびに、Docker Scout はイメージを分析し、結果を Docker Hub の Web サイトに直接読み取り可能な形式で公開します。 結果は、スキャンをトリガーしたタグに関連付けられ、脆弱性の概要が [Tags] ページに表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477222/f997d30f-486f-8e9b-c703-9e18743ff331.png)

各脆弱性の詳細を表示するには、タグ名または任意のイメージ詳細（ダイジェスト、OS、脆弱性の概要、または圧縮サイズ）をクリックします。 このリンクは、イメージの詳細ページにリダイレクトします。このページにはすべての脆弱性がリストされ、脆弱性とレイヤの関係を簡単に確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477222/92230aaf-f2f3-9366-42a5-ce805267d665.png)

# まとめ

Docker Scout は、ソフトウェアサプライチェーンの統合ビューを提供し、セキュリティに対する可視性と制御を大幅に向上させます。 レイヤごとに依存関係を分類する独自の機能を備えているため、潜在的な脆弱性を特定するだけでなく、修復も推奨します。 この統合アプローチにより、コンテナ型アプリケーション内の複雑な依存関係の中でセキュリティを維持するプロセスが合理化されます。

さらに、未来はさらに有望に見えます。 Docker製品設計者との簡単なチャットの後、Docker Scoutにより、SDLC内のアーティファクトを評価するカスタムポリシーを作成できるようになることが明らかになりました。 この新機能により、パーソナライズとセキュリティのさらなるレイヤが追加され、ソフトウェアサプライチェーン管理における重要なツールとしての Docker Scout の地位がさらに強化されます。

# 参考資料

- Equifax データ侵害: https://www.ftc.gov/enforcement/refunds/equifax-data-breach-settlement
- Equifax の脆弱性: https://nvd.nist.gov/vuln/detail/CVE-2017-5638
- 公式文書: https://docs.docker.com/scout/
- Docker scan プラグインソースコード: https://github.com/docker/scan-cli-plugin/blob/main/cmd/docker-scan
- Docker Scout プラグインソースコード: https://github.com/docker/scout-cli