
eBPFベースのランタイム検出器で、runcおよびDockerにおけるコンテナエスケープの脆弱性を検出します。ビルド時およびランタイム中に、システムコールとDockerデーモン呼び出しを監視して、CVE-2024-21626、CVE-2024-23651、CVE-2024-23652、CVE-2024-23653の悪用を検出します。
このリポジトリはアーカイブされました。
コードへの更新は今後行われず、この通知を読む頃にはセキュリティ上の問題が発生していたり、動作しなくなっている可能性があります。 歴史的な目的のみでご利用いただき、取り扱いには十分注意してください。

このリポジトリには、runc および Docker の脆弱性 CVE-2024-21626、CVE-2024-23651、CVE-2024-23652、CVE-2024-23653 を対象とした eBPF ベースのランタイム検出のリファレンス実装が含まれています。これは Linux のシステムコール(例: chdir、mount)や Docker デーモンの関数呼び出しをフックし、それらを Docker ビルドやコンテナプロセスと関連付けて、これらの脆弱性の悪用を特定します。
静的解析ベースのアプローチについては、こちら を参照してください。
CVE-2024-21626 は runc コンテナランタイムの脆弱性であり、攻撃者がコンテナの隔離を突破し、WORKDIR 命令の処理における問題を悪用した細工済みイメージを介して完全な root RCE を達成できるものです。ホストへのファイルディスクリプタが開閉されるタイミングには「競合」状態が存在するため、攻撃者は WORKDIR /proc/self/fd/[ID](ID はシステム依存のファイルディスクリプタ)という命令を含む Dockerfile を作成でき、これが基盤となるホストマシンのファイルシステムを指すことになります。これは以下の実行時に悪用される可能性があります:
docker build - 以下の2つのケース:
FROM 命令で参照するベースイメージに、悪用をトリガーする ONBUILD コマンド(例: ONBUILD WORKDIR /proc/self/fd/[ID])が含まれている場合。ONBUILD 命令は、その命令を含むイメージ自体ではなく、それをベースイメージとして使用するイメージにコマンドを注入します。つまり、ベースイメージが侵害されていたり、意図的に悪意のあるもの(Dockerhub やその他の公開コンテナレジストリにホストされているものなど)である場合、docker build コマンドが実際にビルドするイメージに何も変更がなくても悪用が可能です。docker runしたがって、この脆弱性はビルドシステムと本番環境の両方を危険にさらす可能性があります。
CVE-2024-23651 は Docker の脆弱性であり、RUN コマンドが --mount=cache フラグを使用している場合に発生します。Docker デーモンのホスト上に source ディレクトリが存在するかのチェックと、実際の mount システムコールの呼び出しとの間には、time-of-check/time-of-use(TOCTOU)の脆弱性が存在します。攻撃者は、これら2つの呼び出しの間にシンボリックリンクを仕掛ける Dockerfile を作成でき、任意のバインドマウントを誘発してホスト上で完全な root RCE を達成できます。
この脆弱性は docker build コマンドのみに影響します。
CVE-2024-23653 は Docker の脆弱性であり、カスタムの Buildkit LLB ジェネレータが # syntax ディレクティブとともに使用される場合に発生します。このジェネレータは Client.NewContainer および Container.Start GRPC 呼び出しを使用して、ビルド中に新しいコンテナを実行できます。StartRequest.SecurityMode 引数は、docker デーモンまたは docker build 呼び出しの権限期待値に対して適切にチェックされないため、GRPC 呼び出し元がビルド中に特権コンテナを作成できます。この新しい特権コンテナはその後脱出され、ビルドホスト上で完全な root RCE を獲得できます。
この脆弱性は docker build コマンドのみに影響します。
CVE-2024-23652 は Docker の任意削除の脆弱性です。Dockerfile で RUN --mount が使用される場合、マウントのターゲットが存在しないと、その環境用に作成されます。実行が完了すると、この作成されたディレクトリはクリーンアップされます。実行中のコマンドがマウントに使用されるパスをシンボリックリンクに変更した場合、クリーンアップ手順はこのシンボリックリンクをたどり、ホストのルートファイルシステム内の任意のディレクトリをクリーンアップする可能性があります。
この脆弱性は docker build コマンドのみに影響します。
ビルド時検出は4つの脆弱性すべてに適用されます。
GOOS=linux GOARCH={{amd64/arm64}} go build。sudo を使用してバックグラウンドで実行します(eBPF に必要)(例: sudo ebpf-detector &)。Leaky vessels vulnerability detected が STDOUT に出力され、対応する CVE、脆弱性名、追加のフォレンジック情報も表示されます。ランタイム検出は WORKDIR の脆弱性(CVE-2024-21626)のみに適用されます。
Dockerfile を使用して検出器のコンテナイメージをビルドし、イメージレジストリにプッシュします。detector.yaml の image 値(TODO とマークされている箇所)を入力します。kubectl apply -f detector.yml を実行して、Kubernetes クラスタで検出器を DaemonSet として実行します。Leaky Vessels vulnerability detected が出力されます。ユニットテストは eBPF に依存するため、sudo で実行する必要があります: sudo go test ebpf-detector/...。
WORKDIR 悪用(CVE-2024-21626)はコンテナ初期化中に発生するため、実行中のコンテナでは検出されません。また、この検出はコンテナランタイムが containerd であることを前提としています。CVE-2024-23651)および Buildkit ビルド時コンテナ破棄による任意削除(CVE-2024-23652)の検出はタイミングベースであり、競合状態により偽陰性が発生する可能性があります。バグと問題の最新リストについては、プロジェクトの issues を参照してください。
貢献は歓迎します。詳細は CONTRIBUTING.md を参照してください。
Leaky Vessels Dynamic Detector は Apache-2.0 ライセンスの下で提供されています。詳細は LICENSE を参照してください。