脆弱性: runc process.cwd と漏洩した fds コンテナブレイクアウト (CVE-2024-21626)
2024年1月31日
0 分で読めますSnyk は、Docker エンジンや Kubernetes など他のコンテナ化テクノロジで使用されるバージョン 1.1.11 以前のすべての runc に脆弱性を発見しました。この問題が悪用されると、悪意のあるイメージの実行や、悪意のある Dockerfile またはアップストリームイメージ (FROM
を使用する場合) を使用したイメージのビルドによって、基盤となるホスト OS にコンテナがエスケープされる可能性があります。この問題には CVE-2024-21626 が割り当てられています。
CVE-2024-21626 の仕組み
デモ 1:docker build
を介したコンテナブレイクアウト。これは、docker build
を悪用してコンテナからブレイクアウトし、任意の読み取り (この例では、ホストの「/etc/shadow
」ファイル) および書き込み (この例では、「DOCKER_BUILD_BREAKOUT
」ファイルの作成) を介してホストファイルシステムにアクセスする例です。
デモ 2:docker run
を介したコンテナブレイクアウト。この例は、同じ脆弱性に基づく悪意のある Docker イメージを実行することで、同様に Docker コンテナからホスト OS へのブレイクアウトが生じる可能性があることを示しています。
この脆弱性は、Dockerfile で定義された WORKDIR
ディレクティブを適用するときの操作順序が原因で発生します。WORKDIR
は、RUN
ディレクティブを使用してビルド時に実行されるプロセスや、CMD
または ENTRYPOINT
ディレクティブを使用してランタイムに実行されるプロセスなど、Dockerfile によって作成されるすべてのプロセスの初期作業ディレクトリを定義します。指定されたディレクトリは、特定の特権ホストディレクトリファイル記述子が閉じられる前に、chdir
を使用して入力されます。「/proc/self/fd/
」ディレクトリを介してこれらの特権ファイル記述子の 1 つを chdir
への引数として指定することが可能です。これにより、通常の操作中にファイル記述子自体が閉じた後も、ビルド時または実行時に Dockerfile 定義のコマンドにハンドオフされるまで、特権ファイル記述子がアクセスできる状態のままになります。
攻撃が成功すると、現在実行中のプロセスは、現在のディレクトリがホストディレクトリであることを確認し、ホストディレクトリ構造を横断して完全なホストルートファイルシステムにアクセスします。デフォルトでは、アクセス特権は、Docker Engine や Kubernetes など、使用中のコンテナ化ソリューションのアクセス特権と同じになります。通常、これは root ユーザーであるため、ディスクアクセスからエスカレーションしてホストの root コマンドを完全に実行することが可能です。
CVE-2024-21626 への対応方法
runc は、WORKDIR
ディレクティブで指定されたディレクトリがコンテナのルートファイルシステムに存在するようにすることで、この脆弱性を軽減しました。また、特権ホストディレクトリファイル記述子を使用直後に適切に閉じるようにするための追加のセキュリティ強化手順も実装しました。
runc アドバイザリに従って直ちに措置を講じることで、このセキュリティ脆弱性を軽減することをお勧めします。runc 1.1.12 リリースには、この問題に対するパッチが含まれています。runc をバンドルするテクノロジも、それぞれのパッチ適用済みバージョンにアップデートする必要があります。ホスト型ソリューション (一般的なクラウドプロバイダーのマネージド Kubernetes サービスなど) が使用されている場合は、ベンダーアドバイザリに従うか、それを実装する必要があります。
リスクの評価
この脆弱性は、脆弱なインフラストラクチャ内で実行またはビルドされている悪意のあるコンテナに依存します。この脆弱性の性質上、検出は困難であり、検出の正確度を最大限に高めるためにはランタイムが必要です。既存の Snyk 製品はアプリケーションランタイムで動作しないため、この脆弱性の検出を可能にするための 2 つのツールをビルドしました。
ランタイム検出
Snyk に新設された Helios チームは、この脆弱性に対する eBPF ベースのランタイム検出ツールをビルドしました。このツールは Apache-2.0 ライセンスに基づいてリリースされたもので、「leaky-vessels-runtime-detector」にあります。eBPF は、一般的に使用されるインストルメンテーション メカニズムであり、多くの最新型 Linux カーネルに組み込まれています。
このツールは、基盤となるインフラストラクチャでこの脆弱性を悪用して、基盤となるホストを危険にさらそうとしている実行中のコンテナを特定できます。このツールは危険を警告するだけで、この脆弱性の悪用を防ぐことはできないことに注意してください。
コンテナインフラストラクチャをアップデートすることを強くお勧めしますが、すぐにアップデートできない場合は、このツールを使用してリスクとその影響度合いを評価できる場合があります。組織は、インフラストラクチャにパッチが適用されているかどうかをコンテナインフラストラクチャプロバイダーに確認する必要があります。
インストールと使用
静的検出ツールをインストールして使用するには、次の手順を実行してください。
「https://github.com/snyk/leaky-vessels-dynamic-detector」でリポジトリのクローンを作成します。
「
go build
」を使用して Go バイナリをビルドします。「
sudo ./ebpf-detector
」を使用して、CI 環境でディテクターを実行します。
詳細については、「README.md」ファイルをご確認ください。
静的解析
ホストまたは CI/CD パイプラインで外部バイナリを実行したくないときのために、静的解析ディテクターもビルドしました。このディテクターは、「https://github.com/snyk/leaky-vessels-static-detector」にあり、Dockerfile を分析して潜在的な悪用の試みにフラグを立てます。
このツールは、FROM
命令を解析するか、ローカルの Docker デーモンまたはパブリックコンテナレジストリ (Dockerhub や GCR など) に直接クエリを実行することにより、イメージを検査します。イメージ履歴は、完全な Dockerfile に含まれるすべての命令を含んでいるわけではありませんが、親イメージの WORKDIR
および ONBUILD
命令が表示され、潜在的に悪質なイメージであることを示している可能性があります。
これは、侵害されたサードパーティ基本イメージによって、子イメージの run
コマンドまたは build
コマンドが悪用されるのを防ぐのに役立ちます。静的アプローチでは、特に --mount
フラグを使用したエクスプロイトの場合に誤検知 (ノイズ) 率が高くなりますが、さらに調査すべきイメージを見つけることができます。
Snyk チームは、最も頻繁に使用されているイメージに基づいて、パブリックレジストリからの Dockerfile のアドホックチェックを実行しました。網羅的ではありませんが、この調査では、これらの脆弱性が悪用されたことを示す証拠は見つかりませんでした。パッチが利用可能になってデプロイされるまで、ご自分の環境を継続的に監視し、コンテナをチェックすることをお勧めします。
通常と同様に、ビルドキャッシュのクリアや親イメージの出所の確認などを行って、信頼できるソースからの適切に管理された親イメージを使用し、最新バージョンを常に最新の状態に保つことは、優れたベストプラクティスです。
インストールと使用
静的検出ツールをインストールして使用するには、次の手順を実行してください。
「https://github.com/snyk/leaky-vessels-static-detector」でリポジトリのクローンを作成します。
「
go build
」を使用して Go バイナリをビルドします。「
./static-detector dockerfile -f [Dockerfile のパス]
」を使用してディテクターを実行します。追加の実行オプションについては、「README.md」ファイルをご確認ください。
CVE-2024-21626:まとめとアドバイス
このコンテナブレイクアウトの脆弱性は深刻で、コンテナを実行またはビルドしている基盤ホストインフラストラクチャに損害を引き起こす可能性があります。
runc のすべてのインスタンスと runc に依存するすべてのソフトウェアをバージョン 1.1.12 以降にアップデートすることをお勧めします。これに加えて、コンテナホスティングサービスとインフラストラクチャが影響を受ける可能性があるため、この問題に関連するベンダーアドバイザリにも従ってください。
Snyk は、これ以外のコンテナブレイクアウトの脆弱性も調査を通じていくつかを明らかにし、CVE-2024-23652、CVE-2024-23651、CVE-2024-23653 という CVE を割り当てています。すべての CVE にわたる調査結果の概要はこちらでご確認いただけます。
この記事は情報提供のみを目的として提供されています。Snyk は、この情報のいかなる誤りや欠落、あるいは情報の使用から得られた結果についても責任を負いません。