Amazon ECRのベーシックスキャンでdockerイメージを脆弱性スキャンした結果を分析してみた

2194
Amazon ECRのベーシックスキャンでdockerイメージを脆弱性スキャンした結果を分析してみた

この記事は、2022/08/31 時点で調査・分析した結果です。この結果そのものより、脆弱性を評価したステップが役に立てれば幸いです。

こんにちは。にしやまです。

私が携わっているプロジェクトでdockerイメージの脆弱性スキャンの結果の分析と対応を検討することになりました。こういう仕事は苦手ですが、一度しっかりやることで免疫がつきますので、みなさんも御付き合いください。

はじめに

dockerイメージの脆弱性スキャンについては、 Amazon ECRベーシックスキャン を使用しています。ベーシックスキャンは Clair プロジェクトの共通脆弱性識別子 (CVE) データベース を利用しています。
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/image-scanning-basic.html

今回スキャンしたdockerイメージの脆弱性のほとんどは、ベースイメージに使用した php-8.0-fpm-bullseye で見つかっているので、 php-8.0-fpm-bullseye のスキャン結果として分析を進めていきたいと思います。

DockerFileはこちらを参照してください。
https://github.com/docker-library/php/blob/9a7bde5a52f82ad62ebfd86c2292b8cb16ffb391/8.0/bullseye/fpm/Dockerfile

Debianのセキュリティ問題に対する対応

Debianは全てのセキュリティ問題に対応するわけではなく、問題によってトリアージするようです。

こちらは、Wikipediaからの引用です。

CVE があっても、すぐにパッケージの更新が行われるわけではありません。

  • 修正することが緊急ではないが、後で修正される可能性があるマイナーな問題である場合、「postponed」というタグを付けます。LTS にはポイントリリースがないので、これはより深刻な問題がある場合や、 小さな問題がたくさん積み重なっている場合を意味します。
  • 修正しない正当で強い理由がある場合 (例: ソースが未コンパイル、未出荷である、重要でなくバックポートが難しい、重要でなく逆依存に影響する API 変更が必要)、「ignored」タグを付けます。
  • LTS リリースのバージョンが影響を受けない場合(通常、脆弱性のあるコードがそのバージョンに存在しないため)、"not-affected" のタグを付けます。関連コミットを参照するのは良い習慣であり、良いテストです(cf. data/CVE/list の "NOTE: Introduced" )、脆弱性コードはしばしば上流のリリース間で名前が変更されたり分割されています。
  • そのパッケージが LTS リリースでサポートされていない場合、「終了」タグを付けます (Stretch のサポートされていないパッケージの一覧は、現在 debian-security-support:security-support-ended.deb9 で見ることができます。このファイルを更新し、必要なら dla-needed.txt に debian-security-support を追加してください -- README.source を参照してください)。
  • 重要度(severity)が「重要でない(unimportant)」に設定されている(これはめったに使われないはずで、通常セキュリティチームによって行われます)。
  • no-dsa" は "postponed" と "ignored" を含む、より曖昧なタグです。Debian セキュリティチームは、インターネットに面していない脆弱性を 「minor」 とマークする傾向があります。これは、直接悪用されることはないものの、 攻撃者が被害者のインフラに片足を踏み入れたときに、より大きな侵入を許してしまうからです。
https://wiki.debian.org/LTS/Development

ざっくりいうと

  • postponed
    • 緊急ではなく、後で修正されるかもしれないマイナーな問題。ただし、LTSはポイントリリースがないので小さな問題が積み重なっている場合や深刻な問題がある場合もある
  • ignored
    • 修正しない正当で強い理由がある
  • not-affected
    • LTSリリースバージョンとは関係ない問題
  • no-dsa
    • 直接悪用されにくい問題。インフラに介入されないと起きない問題

です。

今回の脆弱性と見解・結論

結論から言うと脆弱性に対してはこのような対応としました。この後、脆弱性一つ一つを見ていきます。

名前パッケージ重要度Debianトリアージ見解・結論ステータス
CVE-2019-19814linux:5.10.127-1CRITICALno-dsa / Minor issue対応しないクローズ
CVE-2019-8457db5.3:5.3.28+dfsg1-0.8HIGHno-dsa / Minor issue対応しないクローズ
CVE-2022-24765git:1:2.30.2-1HIGHno-dsa / Minor issue対応しないクローズ
CVE-2022-29187git:1:2.30.2-1HIGHno-dsa / Minor issue対応しないクローズ
CVE-2022-1679linux:5.10.127-1HIGHなし対応しない(特定のワイヤレス製品に関する問題なため影響が小さい)クローズ
CVE-2013-7445linux:5.10.127-1HIGHignored / Minor issue, requires invasive changes対応しないクローズ
CVE-2021-3847linux:5.10.127-1HIGHなし対応しない(アーキテクチャ的に影響が小さい)クローズ
CVE-2019-15794linux:5.10.127-1HIGHなし(fixed bookworm)対応しない(アーキテクチャ的に影響が小さい)クローズ
CVE-2021-39686linux:5.10.127-1HIGHなし(fixed buster,bookworm)bullseyeがkernel 5.15系を採用しないと解決しないのかも。オープン

今回の脆弱性を一つ一つ見ていく

では、脆弱性を見ていきましょう。

  • 発見された脆弱性の説明
  • devian security trackerのチェックとその内容
  • 結論

という構成で見ていきます。

CVE-2019-8457

脆弱性スキャンの結果

名前パッケージ重要度説明説明(日本語訳)
CVE-2019-19814linux:5.10.127-1CRITICALIn the Linux kernel 5.0.21, mounting a crafted f2fs filesystem image can cause __remove_dirty_segment slab-out-of-bounds write access because an array is bounded by the number of dirty types (8) but the array index can exceed this.Linux カーネル 5.0.21 では、巧妙に細工された f2fs ファイルシステム イメージをマウントすると、__remove_dirty_segment slab-out-of-bounds 書き込みアクセスが発生する可能性があります。これは、配列がダーティ タイプの数 (8) によって制限されているにもかかわらず、配列インデックスがこれを超える可能性があるためです。

debian security tracker

https://security-tracker.debian.org/tracker/CVE-2019-19814
  • 対応状況(bullseye)
    • vulnerable(脆弱性)
  • Notes
    • [bullseye] - linux <no-dsa> (Minor issue)

結論

Debianはbullseyeは本脆弱性に関して未対応。しかし、no-dsa(直接悪用されにくい問題。インフラに介入されないと起きない問題)なのでマイナー問題と判断しました。対応は未定です。

CVE-2019-8457

脆弱性スキャンの結果

名前パッケージ重要度説明説明(日本語訳)
CVE-2019-8457db5.3:5.3.28+dfsg1-0.8HIGHSQLite3 from 3.6.0 to and including 3.27.2 is vulnerable to heap out-of-bound read in the rtreenode() function when handling invalid rtree tables.3.6.0 から 3.27.2 までの SQLite3 は、無効な rtree テーブルを処理するときに、rtreenode() 関数でヒープ範囲外読み取りに対して脆弱です。

debian security tracker

https://security-tracker.debian.org/tracker/CVE-2019-8457
  • 対応状況(bullseye)
    • vulnerable(脆弱性)
  • Notes
    • [bullseye] - db5.3 <no-dsa> (Minor issue)

結論

Debianはbullseyeは本脆弱性に関して未対応。しかし、no-dsa(直接悪用されにくい問題。インフラに介入されないと起きない問題)なのでマイナー問題と判断しました。対応は未定です。

CVE-2022-24765

脆弱性スキャンの結果

名前パッケージ重要度説明説明(日本語訳)
CVE-2022-24765git:1:2.30.2-1HIGHGit for Windows is a fork of Git containing Windows-specific patches. This vulnerability affects users working on multi-user machines, where untrusted parties have write access to the same hard disk. Those untrusted parties could create the folder C:\.git, which would be picked up by Git operations run supposedly outside a repository while searching for a Git directory. Git would then respect any config in said Git directory. Git Bash users who set GIT_PS1_SHOWDIRTYSTATEare vulnerable as well. Users who installed posh-gitare vulnerable simply by starting a PowerShell. Users of IDEs such as Visual Studio are vulnerable: simply creating a new project would already read and respect the config specified in C:\.git\config. Users of the Microsoft fork of Git are vulnerable simply by starting a Git Bash. The problem has been patched in Git for Windows v2.35.2. Users unable to upgrade may create the folder .git on all drives where Git commands are run, and remove read/write access from those folders as a workaround. Alternatively, define or extend GIT_CEILING_DIRECTORIESto cover the parentdirectory of the user profile, e.g. C:\Users if the user profile is located in C:\Users\my-user-name.Git for Windows は、Windows 固有のパッチを含む Git のフォークです。この脆弱性は、信頼されていない関係者が同じハード ディスクへの書き込みアクセス権を持つマルチユーザー マシンで作業しているユーザーに影響を与えます。これらの信頼できない関係者は、Git ディレクトリを検索しているときに、おそらくリポジトリの外部で実行される Git 操作によって取得されるフォルダ「C:.git」を作成する可能性があります。 Git は、その Git ディレクトリ内のすべての構成を尊重します。 「GIT_PS1_SHOWDIRTYSTATE」を設定した Git Bash ユーザーも脆弱です。 posh-git をインストールしたユーザーは、PowerShell を起動するだけで脆弱になります。 Visual Studio などの IDE のユーザーは脆弱です。単に新しいプロジェクトを作成するだけで、C:\.git\config で指定された構成が既に読み取られ、尊重されます。 Git の Microsoft フォークのユーザーは、Git Bash を開始するだけで脆弱になります。この問題は、Git for Windows v2.35.2 で修正されています。アップグレードできないユーザーは、回避策として、Git コマンドが実行されるすべてのドライブにフォルダー「.git」を作成し、それらのフォルダーから読み取り/書き込みアクセスを削除することができます。または、 GIT_CEILING_DIRECTORIES を定義または拡張して、ユーザー プロファイルの parent ディレクトリをカバーします。ユーザープロファイルが「C:\Users\my-user-name」にある場合は「C:\Users」。

debian security tracker

https://security-tracker.debian.org/tracker/CVE-2022-24765
  • 対応状況(bullseye)
    • vulnerable(脆弱性)
  • Notes
    • [bullseye] - git <no-dsa> (Minor issue)

結論

Debianはbullseyeは本脆弱性に関して未対応。しかし、no-dsa(直接悪用されにくい問題。インフラに介入されないと起きない問題)なのでマイナー問題と判断しました。対応は未定です。

CVE-2022-29187

脆弱性スキャンの結果

名前パッケージ重要度説明説明(日本語訳)
CVE-2022-29187git:1:2.30.2-1HIGHGit is a distributed revision control system. Git prior to versions 2.37.1, 2.36.2, 2.35.4, 2.34.4, 2.33.4, 2.32.3, 2.31.4, and 2.30.5, is vulnerable to privilege escalation in all platforms. An unsuspecting user could still be affected by the issue reported in CVE-2022-24765, for example when navigating as root into a shared tmp directory that is owned by them, but where an attacker could create a git repository. Versions 2.37.1, 2.36.2, 2.35.4, 2.34.4, 2.33.4, 2.32.3, 2.31.4, and 2.30.5 contain a patch for this issue. The simplest way to avoid being affected by the exploit described in the example is to avoid running git as root (or an Administrator in Windows), and if needed to reduce its use to a minimum. While a generic workaround is not possible, a system could be hardened from the exploit described in the example by removing any such repository if it exists already and creating one as root to block any future attacks.Git は分散リビジョン管理システムです。 バージョン 2.37.1、2.36.2、2.35.4、2.34.4、2.33.4、2.32.3、2.31.4、および 2.30.5 より前の Git は、すべてのプラットフォームで権限昇格に対して脆弱です。 疑いを持たないユーザーは、CVE-2022-24765 で報告された問題の影響を受ける可能性があります。たとえば、ユーザーが所有する共有 tmp ディレクトリに root として移動すると、攻撃者が git リポジトリを作成する可能性があります。 バージョン 2.37.1、2.36.2、2.35.4、2.34.4、2.33.4、2.32.3、2.31.4、および 2.30.5 には、この問題に対するパッチが含まれています。 例で説明されているエクスプロイトの影響を受けないようにする最も簡単な方法は、root (または Windows では管理者) として git を実行することを避け、必要に応じてその使用を最小限に抑えることです。 一般的な回避策は不可能ですが、そのようなリポジトリが既に存在する場合は削除し、将来の攻撃をブロックするためにルートとして作成することで、例で説明したエクスプロイトからシステムを強化することができます。

debian security tracker

https://security-tracker.debian.org/tracker/CVE-2022-29187
  • 対応状況(bullseye)
    • vulnerable(脆弱性)
  • Notes
    • [bullseye] - git <no-dsa> (Minor issue)

結論

Debianはbullseyeは本脆弱性に関して未対応。しかし、no-dsa(直接悪用されにくい問題。インフラに介入されないと起きない問題)なのでマイナー問題と判断しました。対応は未定です。

CVE-2022-1679

脆弱性スキャンの結果

名前パッケージ重要度説明説明(日本語訳)
CVE-2022-1679linux:5.10.127-1HIGHA use-after-free flaw was found in the Linux kernel’s Atheros wireless adapter driver in the way a user forces the ath9k_htc_wait_for_target function to fail with some input messages. This flaw allows a local user to crash or potentially escalate their privileges on the system.ユーザーが ath9k_htc_wait_for_target 関数をいくつかの入力メッセージで強制的に失敗させる方法で、Linux カーネルの Atheros ワイヤレス アダプター ドライバーに解放後の使用の欠陥が見つかりました。 この欠陥により、ローカル ユーザーがクラッシュしたり、システム上で権限を昇格させたりする可能性があります。

debian security tracker

https://security-tracker.debian.org/tracker/CVE-2022-1679
  • 対応状況(bullseye)
    • vulnerable(脆弱性)
  • Notes
    • なし

結論

Debianは脆弱性の対応は各ディストリビューションに対して行なっていない。また、トリアージ情報はない。
本脆弱性は、特定のワイヤレス製品に関する問題なので、ECS上で動かしている分には影響は小さいと判断しました。

CVE-2013-7445

脆弱性スキャンの結果

名前パッケージ重要度説明説明(日本語訳)
CVE-2013-7445linux:5.10.127-1HIGHThe Direct Rendering Manager (DRM) subsystem in the Linux kernel through 4.x mishandles requests for Graphics Execution Manager (GEM) objects, which allows context-dependent attackers to cause a denial of service (memory consumption) via an application that processes graphics data, as demonstrated by JavaScript code that creates many CANVAS elements for rendering by Chrome or Firefox.4.x までの Linux カーネルの Direct Rendering Manager (DRM) サブシステムは、Graphics Execution Manager (GEM) オブジェクトの要求を誤って処理します。これにより、コンテキスト依存の攻撃者が、グラフィック データを処理するアプリケーションを介してサービス拒否 (メモリ消費) を引き起こすことができます。 、Chrome または Firefox でレンダリングするための多くの CANVAS 要素を作成する JavaScript コードによって示されます。

debian security tracker

https://security-tracker.debian.org/tracker/CVE-2013-7445
  • 対応状況(bullseye)
    • vulnerable(脆弱性)
  • Notes
    • [bullseye] - linux <ignored> (Minor issue, requires invasive changes)

結論

Debianはbullseyeは本脆弱性に関して未対応。しかし、ignored(修正しない正当で強い理由がある場合)としており、対応の予定はありません。理由としては、マイナー問題かつ侵襲的な変更を必要とするため、ということです。

CVE-2021-3847

脆弱性スキャンの結果

名前パッケージ重要度説明説明(日本語訳)
CVE-2021-3847linux:5.10.127-1HIGHAn unauthorized access to the execution of the setuid file with capabilities flaw in the Linux kernel OverlayFS subsystem was found in the way user copying a capable file from a nosuid mount into another mount. A local user could use this flaw to escalate their privileges on the system.ユーザーが nosuid マウントから別のマウントに対応ファイルをコピーする方法で、Linux カーネル OverlayFS サブシステムの機能の欠陥を伴う setuid ファイルの実行への不正アクセスが発見されました。 ローカル ユーザーはこの欠陥を利用して、システム上での権限を昇格させることができました。

debian security tracker

https://security-tracker.debian.org/tracker/CVE-2021-3847
  • 対応状況(bullseye)
    • vulnerable(脆弱性)
  • Notes
    • なし

結論

Debianは脆弱性の対応は各ディストリビューションに対して行なっていない。また、トリアージ情報はない。
本脆弱性は、ファイルシステムマウント時の脆弱性であり、ECS上で動かしているアプリケーションはs3及びデータベースマネージドサービスを利用しておりファイルシステムマウントは行なっていないため影響は小さいと判断しました。

CVE-2019-15794

脆弱性スキャンの結果

名前パッケージ重要度説明説明(日本語訳)
CVE-2019-15794linux:5.10.127-1HIGHOverlayfs in the Linux kernel and shiftfs, a non-upstream patch to the Linux kernel included in the Ubuntu 5.0 and 5.3 kernel series, both replace vma->vm_file in their mmap handlers. On error the original value is not restored, and the reference is put for the file to which vm_file points. On upstream kernels this is not an issue, as no callers dereference vm_file following after call_mmap() returns an error. However, the aufs patchs change mmap_region() to replace the fput() using a local variable with vma_fput(), which will fput() vm_file, leading to a refcount underflow.Linux カーネルの Overlayfs と、Ubuntu 5.0 および 5.3 カーネル シリーズに含まれる Linux カーネルへの非アップストリーム パッチである shiftfs は、どちらも mmap ハンドラの vma->vm_file を置き換えます。 エラーが発生すると、元の値は復元されず、参照は vm_file が指すファイルに置かれます。 アップストリーム カーネルでは、call_mmap() がエラーを返した後、呼び出し元が vm_file を逆参照しないため、これは問題ではありません。 ただし、aufs パッチは mmap_region() を変更して、ローカル変数を使用する fput() を vma_fput() に置き換えます。これにより、fput() vm_file が実行され、refcount アンダーフローが発生します。

debian security tracker

https://security-tracker.debian.org/tracker/CVE-2019-15794
  • 対応状況(bullseye)
    • vulnerable(脆弱性)
    • 次期バージョン(bookworm)はfixed(解決済)
  • Notes
    • [stretch] - linux <not-affected> (overlayfs passes through mmap)
    • [jessie] - linux <not-affected> (overlayfs not present)

結論

Debianはbullseyeは本脆弱性に関して未対応。次期バージョン(bookworm)では解決済み。また、トリアージ情報はない。本脆弱性は、ファイルシステムマウント時の脆弱性であり、ECS上で動かしているアプリケーションはs3及びデータベースマネージドサービスを利用しておりファイルシステムマウントは行なっていないため影響は小さいと判断しました。

CVE-2021-39686

脆弱性スキャンの結果

名前パッケージ重要度説明説明(日本語訳)
CVE-2021-39686linux:5.10.127-1HIGHIn several functions of binder.c, there is a possible way to represent the wrong domain to SELinux due to a race condition. This could lead to local escalation of privilege with no additional execution privileges needed. User interaction is not needed for exploitation.Product: AndroidVersions: Android kernelAndroid ID: A-200688826References: Upstream kernelbind.c のいくつかの関数では、競合状態が原因で SELinux に対して間違ったドメインを表す可能性があります。 これにより、追加の実行権限を必要とせずに、ローカルで権限が昇格する可能性があります。 悪用にユーザーの介入は必要ありません。製品: Androidバージョン: Android カーネルAndroid ID: A-200688826参照: アップストリーム カーネル

debian security tracker

https://security-tracker.debian.org/tracker/CVE-2021-39686
  • 対応状況(bullseye)
    • vulnerable(脆弱性)
    • buster、及び、次期バージョン(bookworm)はfixed(解決済)
  • Notes(トリアージ情報)
    • なし
  • その他
    • bullseyeが採用しているカーネルは5.10系
    • 5系で対応しているバージョンは5.15.15-1

結論

Debianはbullseyeは本脆弱性に関して未対応。buster及び次期バージョン(bookworm)では解決済み。また、トリアージ情報はない。bullseyeがkernel 5.15系を採用しないと解決しないのかもしれません。

dockerイメージの脆弱性は日々チェックする。そのためのCI/CD運用

CVEなどの脆弱性データベースは日々更新されているため、同じコンテナイメージてあっても、新しいデータベースで定期的に脆弱性スキャンが必要です。また、コンテナイメージが変わる場合も脆弱性スキャンが必要です。ただし、頻度としては非常に低いため、リリースプロセスに脆弱性スキャンを組み込むか、任意のタイミングでの実行にするかはプロジェクトによると思います。例えば、

  • リリースビルド時に脆弱性スキャンを実行する
  • 月1回、脆弱性スキャンを実行する

にするなどです。

脆弱性スキャンツールとしては非常に導入が簡単なTrivyを採用すれば、CircleCIのプロセスに組み込見やすいです。Trivyの実行オプションについては、重要度をCRITICAL、HIGHに絞るため --severity CRITICAL,HIGH を指定すれば良い。また、アップストリームプロジェクトでパッチが適用されていないものはこちらでも解決ができないので予め非表示になるように --ignore-unfixed をつけると不要なチェックはしなくて良くなります。

ignore-unfixedの使い方については下記のような理解で利用すればよさそうです。

  • ignore-unfixedはアップストリームプロジェクトでパッチ未適用の問題(ようは解決されておらず、こちらでも対処しようがない問題)
  • ignore-unfixedをつけて検出された問題はアップストリームプロジェクトでパッチ適用されている問題で、何らかのコンテナイメージが公開されている可能性がある
  • よって、新たに公開されたコンテナイメージを脆弱性スキャンし、脆弱性が解決するようなら、コンテナイメージをバージョンアップを提案検討する

今回の脆弱性に対する対応

今回対象にしたコンテナイメージは、 php-8.0-fpm-bullseye でした。このコンテナイメージはphpのバージョンアップが含まれた php-8.0.22-fpm-bullseye が公開されていました。

php-8.0-fpm-bullseyeの場合、 ignore-unfixed を指定すると、検出される脆弱性は0件になりました。
php-8.0.22-fpm-bullseyeの場合、 ignore-unfixed を指定すると、検出される脆弱性は1件になりました。

調査している間に、8.0.23 や 8.1系のコンテナイメージも公開されていました。

ignore-unfixed でスキャンした場合、

  • php-8.0-fpm-bullseye 0件
  • php-8.0.22-fpm-bullseye 1件
  • php-8.0.23-fpm-bullseye 0件
  • php-8.1-fpm-bullseye 0件
  • php-8.1.10-fpm-bullseye 0件

従って、8.0系ならphp-8.0.23-fpm-bullseye、8.1系ならphp-8.1.10-fpm-bullseye(DIGESTは8.1と同じ) のどちらかが選択肢になると思います。

まとめ

今回は、Amazon ECRのベーシックスキャンでdockerイメージの脆弱性スキャンした結果を通じて、脆弱性に関する分析、脆弱性に対する対応、CIによる脆弱性の検知について学んだことを書きました。こういった脆弱性に関する問題はプロジェクト当初は優先順位が低くされがちですが、最終的には避けることができない問題です。そんな時はこの記事をあらためて読んでみてください。