■ECR+ECS+Codeシリーズで自動デプロイ: ベースイメージのセキュリティチェックについて考察
イメージの脆弱性スキャンを行うと、Criticalの「CVE-2019-19814」が現れた
何とかしようとして何とかならなかったときのメモ
■試したこと
「apt-get update」を行なったイメージでも同様の結果になった
update に続けて upgrade もすればいいかと思ったが、それは非推奨らしい
Linux Ubuntu - apt-get update / upgrade の違い - Qiita
https://qiita.com/YumaInaura/items/dd50ba59c245a0a5f3f1
Dockerfileで`apt-get upgrade`をつかってはいけない。注:古い日本語版だと誤訳されています。 - Qiita
https://qiita.com/aimof/items/8f08671c5ab356b01e2b
イメージを作る環境(WSLのUbuntu)をアップデートすればいいかと思ったが、スキャン結果には影響が無かった
$ sudo apt-get update
$ sudo apt-get upgrade
php:7.3.27-apache Critical Issue in ECR Scan - Issue #1143 - docker-library/php - GitHub
https://github.com/docker-library/php/issues/1143
以下は参考になるか
CVE-2019-19814 detected by AWS ECR scanner in a Docker image created by BentoML - Issue #2140 - bentoml/BentoML - GitHub
https://github.com/bentoml/BentoML/issues/2140
GitHub - docker-library/faq: Frequently Asked Questions
https://github.com/docker-library/faq#why-does-my-security-scanner-show-that-an-image-has-so-many-cv...
■調査
軽量Dockerイメージに安易にAlpineを使うのはやめたほうがいいという話 - inductor's blog
https://blog.inductor.me/entry/alpine-not-recommended
Docker image(イメージ)の違い:alpine,bullseye, buster, slim, stretch, jessie, slim-buster, windowsservercore, latestどれを選ぶべきか?
https://prograshi.com/platform/docker/docker-image-tags-difference/
Dockerの公式PHPのDockerfileを頑張って読んで理解しようとしてみた | Unskilled?
https://unskilled.site/docker%E3%81%AE%E5%85%AC%E5%BC%8Fphp%E3%81%AEdockerfile%E3%82%92%E9%A0%91%E5%...
Debian - Wikipedia
https://ja.wikipedia.org/wiki/Debian#%E6%AD%B4%E5%8F%B2
Dockerイメージ alpine,slim,stretch,buster,jessie等の違いと使い分け - 行けたら行く
https://www.ted027.com/post/docker-debian-difference/
DockerでRUNをまとめた方が良いとは限らない | フューチャー技術ブログ
https://future-architect.github.io/articles/20210121/
PHPの公式Dockerfileを読み解く - Qiita
https://qiita.com/hareku/items/d44c5c08ef586e0efa43
php/Dockerfile at 1eb2c0ab518d874ab8c114c514e16aa09394de14 - docker-library/php - GitHub
https://github.com/docker-library/php/blob/1eb2c0ab518d874ab8c114c514e16aa09394de14/7.3/stretch/apac...
Dockerの公式PHPのDockerfileを頑張って読んで理解しようとしてみた | Unskilled?
https://unskilled.site/docker%E3%81%AE%E5%85%AC%E5%BC%8Fphp%E3%81%AEdockerfile%E3%82%92%E9%A0%91%E5%...
php/Dockerfile at 0d23b3d08770889c6cb31e8e5374334879103f92 - docker-library/php - GitHub
https://github.com/docker-library/php/blob/0d23b3d08770889c6cb31e8e5374334879103f92/7.0/apache/Docke...
Debianは「Debian 11.0(bullseye)」が新しいみたい?
それなら以下をスタートにするか
FROM debian:bullseye
■リポジトリ作成
Elastic Container Registry → リポジトリを作成
以下の内容でリポジトリを作成
可視性設定: プライベート
リポジトリ名: debian_php81_apache
タグのイミュータビリティ: 有効
「リポジトリを作成」ボタンを押すとリポジトリが作成される
引き続き、リポジトリにプッシュするイメージを作成する
■イメージ作成1
docker\debian_php81_apache\Dockerfile
FROM debian:bullseye
$ docker image build -t php:debian_php81_apache docker/debian_php81_apache
$ docker image ls
タグ「1.0.0」を付けてプッシュする
$ cd docker/debian_php81_apache
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker image build -t debian_php81_apache .
$ docker image tag debian_php81_apache:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/debian_php81_apache:1.0.0
$ docker image push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/debian_php81_apache:1.0.0
ECRでリポジトリ名 debian_php81_apache をクリックし、イメージタグとして「1.0.0」が現れていることを確認する
上記イメージに対してスキャンを実行すると、44件の警告が表示された。内訳は以下のとおり
Critical ... 0
High ... 3
Medium ... 3
Low ... 5
Informational ... 30
Undefined ... 3
Highの内容は以下のとおり
名前: CVE-2021-33574
パッケージ: glibc:2.31-13+deb11u2
重要度: HIGH
説明: The mq_notify function in the GNU C Library (aka glibc) versions 2.32 and 2.33 has a use-after-free. It may use the notification thread attributes object (passed through its struct sigevent parameter) after it has been freed by the caller, leading to a denial of service (application crash) or possibly unspecified other impact.
名前: CVE-2022-23218
パッケージ: glibc:2.31-13+deb11u2
重要度: HIGH
説明: The deprecated compatibility function svcunix_create in the sunrpc module of the GNU C Library (aka glibc) through 2.34 copies its path argument on the stack without validating its length, which may result in a buffer overflow, potentially resulting in a denial of service or (if an application is not built with a stack protector enabled) arbitrary code execution.
名前: CVE-2022-23219
パッケージ: glibc:2.31-13+deb11u2
重要度: HIGH
説明: The deprecated compatibility function clnt_create in the sunrpc module of the GNU C Library (aka glibc) through 2.34 copies its hostname argument on the stack without validating its length, which may result in a buffer overflow, potentially resulting in a denial of service or (if an application is not built with a stack protector enabled) arbitrary code execution.
■イメージ作成2
docker\debian_php81_apache\Dockerfile
FROM debian:bullseye-slim
$ docker image build -t php:debian_php81_apache docker/debian_php81_apache
$ docker image ls
タグ「1.1.0」を付けてプッシュする
$ cd docker/debian_php81_apache
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker image build -t debian_php81_apache .
$ docker image tag debian_php81_apache:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/debian_php81_apache:1.1.0
$ docker image push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/debian_php81_apache:1.1.0
ECRでリポジトリ名 debian_php81_apache をクリックし、イメージタグとして「1.1.0」が現れていることを確認する
上記イメージに対してスキャンを実行すると、44件の警告が表示された
つまり変化せず
■イメージ作成3
以下をもとに Dockerfile とその関連ファイルを調整
https://github.com/docker-library/php/tree/master/8.1/bullseye/apache
$ docker image build -t php:debian_php81_apache docker/debian_php81_apache
$ docker image ls
タグ「1.2.0」を付けてプッシュする
$ cd docker/debian_php81_apache
$ chmod +x apache2-foreground
$ chmod +x docker-php-entrypoint
$ chmod +x docker-php-ext-configure
$ chmod +x docker-php-ext-enable
$ chmod +x docker-php-ext-install
$ chmod +x docker-php-source
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker image build -t debian_php81_apache .
$ docker image tag debian_php81_apache:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/debian_php81_apache:1.2.0
$ docker image push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/debian_php81_apache:1.2.0
ECRでリポジトリ名 debian_php81_apache をクリックし、イメージタグとして「1.2.0」が現れていることを確認する
上記イメージに対してスキャンを実行すると、Criticalの「CVE-2019-19814」が現れた
つまり変化なしなので、解決せず
補足:
ビルド中に以下で止まったので、
+ export CFLAGS=-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 CPPFLAGS=-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 LDFLAGS=-Wl,-O1 -pie
+ docker-php-source extract
/bin/sh: 1: docker-php-source: Permission denied
7.1.8-fpm-alpine does not build - Issue #490 - docker-library/php - GitHub
https://github.com/docker-library/php/issues/490
をもとに「chmod +x」を実行している
■2022年10月に追加で調査したメモ
dockerの脆弱性スキャンの結果を分析する
https://zenn.dev/starnishi/scraps/f1578f26951399
「CVE-2019-19814」についての見解が記載されている
どうやら
・CVE-2019-19814 の問題は存在している
・Debian/bullseye ではこの問題に対応はされていない
・対応しない理由としては
「no-dsa(直接悪用されにくい問題。インフラに介入されないと起きない問題)なのでマイナー問題と判断」となっている
ということらしい
インターネットに面していない脆弱性で、直接悪用されることはなく、攻撃者が被害者のインフラに片足を踏み入れたときに大きな問題となるもの
…だから対応しないとのこと
つまりは基本的には対応不要な脆弱性がリストに挙がっているだけのようだが、それはそれで
「対応不要な脆弱性警告が毎回挙げられる」ことになる
「以降はこの脆弱性を無視する」のような機能が無いと、実質脆弱性チェックは使い物にならないのでは
AWS CDKでECS on FargateのCI/CDを実現する際の理想と現実 / ideal-and-reality-when-implementing-cicd-for-ecs-on-fargate-with-aws-cdk - Speaker Deck
https://speakerdeck.com/tomoki10/ideal-and-reality-when-implementing-cicd-for-ecs-on-fargate-with-aw...
AWS CDKでECS on FargateのCI/CDを実現する際の理想と現実 / ideal-and-reality-when-implementing-cicd-for-ecs-on-fargate-with-aws-cdk - Speaker Deck
https://speakerdeck.com/tomoki10/ideal-and-reality-when-implementing-cicd-for-ecs-on-fargate-with-aw...
「パッケージによる脆弱性や脆弱性対応の負担を最小化するため、最低限のパッケージのみが含まれるalpineやslim、distrolessなどのイメージを選択することが良いとされている」
とあるが、実際のところデバッグの手間は増えて大変らしい
現状明確な対処方法は無いようなので、
・定期的に手動で実行し、毎回結果は控えておく
・前回と異なる警告があれば、都度調査して対応を考える
とするくらいだと思われる