
Auf eBPF basierender Laufzeitdetektor für Container-Escape-Schwachstellen in runc und Docker, der Syscalls und Docker-Daemon-Aufrufe überwacht, um die Ausnutzung von CVE-2024-21626, CVE-2024-23651, CVE-2024-23652 und CVE-2024-23653 während Builds und zur Laufzeit zu erkennen.
Dieses Repository ist jetzt archiviert.
Es werden keine weiteren Updates am Code vorgenommen, und er könnte zum Zeitpunkt, an dem Sie diesen Hinweis lesen, unsicher oder sogar defekt sein. Betrachten Sie es nur zu historischen Zwecken und behandeln Sie es mit Vorsicht.

In diesem Repository finden Sie eine Referenzimplementierung für eine eBPF-basierte Laufzeiterkennung für die runc- und Docker-Schwachstellen CVE-2024-21626, CVE-2024-23651, CVE-2024-23652 und CVE-2024-23653. Sie hakt in Linux-Syscalls (z. B. chdir, mount) und Funktionsaufrufe des Docker-Daemons ein und verknüpft diese mit Docker-Builds und Container-Prozessen, um Ausnutzungen dieser Schwachstellen zu identifizieren.
Für einen Ansatz auf Basis statischer Analyse siehe Repository.
CVE-2024-21626 ist eine Schwachstelle in der runc-Container-Laufzeitumgebung, die es einem Angreifer ermöglicht, aus der Container-Isolation auszubrechen und über ein präpariertes Image, das ein Problem in der Verarbeitung der WORKDIR-Anweisung ausnutzt, vollständige Root-RCE zu erlangen. Da es eine „Race“-Bedingung zwischen dem Öffnen und Schließen einiger Dateideskriptoren zum Host gibt, kann ein Angreifer eine Dockerfile mit der folgenden Anweisung WORKDIR /proc/self/fd/[ID] erstellen (wobei ID ein systemabhängiger Dateideskriptor ist), die auf das Dateisystem der zugrunde liegenden Host-Maschine verweist. Dies kann ausgenutzt werden bei:
docker build – In 2 Fällen:
FROM-Anweisung auf ein Basis-Image verweist, das einen ONBUILD-Befehl enthält, der den Exploit auslöst, z. B. ONBUILD WORKDIR /proc/self/fd/[ID]. Die ONBUILD-Anweisung injiziert den Befehl nicht in das Image, das ihn enthält, sondern in das Image, das es als Basis-Image verwendet. Das bedeutet, dass eine Ausnutzung möglich ist, selbst wenn sich nichts an dem Image ändert, das der docker build-Befehl tatsächlich erstellt, sofern ein Basis-Image kompromittiert oder absichtlich bösartig ist, z. B. auf Dockerhub oder anderen öffentlichen Container-Registries gehostet wird.docker runSomit kann diese Schwachstelle sowohl Build-Systeme als auch Produktionsumgebungen gefährden.
CVE-2024-23651 ist eine Schwachstelle in Docker, bei der ein RUN-Befehl das Flag --mount=cache verwendet. Es gibt eine Time-of-Check/Time-of-Use-Schwachstelle (TOCTOU) zwischen der Prüfung, ob ein source-Verzeichnis auf dem Host des Docker-Daemons existiert, und dem tatsächlichen Aufruf des mount-Syscalls. Ein Angreifer kann eine Dockerfile erstellen, die zwischen diesen beiden Aufrufen einen Symlink platziert, um einen beliebigen Bind-Mount zu induzieren, der zu vollständiger Root-RCE auf dem Host führt.
Diese Schwachstelle betrifft nur den Befehl docker build.
CVE-2024-23653 ist eine Schwachstelle in Docker, die auftritt, wenn ein benutzerdefinierter Buildkit-LLB-Generator mit der # syntax-Direktive verwendet wird. Der Generator kann die GRPC-Aufrufe Client.NewContainer und Container.Start verwenden, um während des Builds einen neuen Container auszuführen. Das Argument StartRequest.SecurityMode wird nicht angemessen gegen die Privilegien-Erwartungen des Docker-Daemons oder des docker build-Aufrufs geprüft, was es dem GRPC-Aufrufer ermöglicht, während des Builds einen privilegierten Container zu erstellen. Aus diesem neuen privilegierten Container kann anschließend ausgebrochen werden, um vollständige Root-RCE auf dem Build-Host zu erlangen.
Diese Schwachstelle betrifft nur den Befehl docker build.
CVE-2024-23652 ist eine Schwachstelle für beliebiges Löschen in Docker. Wenn RUN --mount in einer Dockerfile verwendet wird und das Ziel des Mounts nicht existiert, wird es für diese Umgebung erstellt. Wenn die Ausführung abgeschlossen ist, wird dieses erstellte Verzeichnis bereinigt. Wenn der ausgeführte Befehl den für den Mount verwendeten Pfad in einen symbolischen Link ändert, durchläuft die Bereinigungsprozedur diesen symbolischen Link und kann potenziell beliebige Verzeichnisse im Root-Dateisystem des Hosts bereinigen.
Diese Schwachstelle betrifft nur den Befehl docker build.
Die Erkennung zur Build-Zeit gilt für alle 4 Schwachstellen.
GOOS=linux GOARCH={{amd64/arm64}} go build.sudo (wie von eBPF gefordert) im Hintergrund in Ihrer Build-Umgebung aus (d. h. sudo ebpf-detector &).Leaky vessels vulnerability detected auf STDOUT ausgegeben, zusammen mit der jeweiligen CVE, dem Schwachstellennamen und zusätzlichen forensischen Informationen.Die Laufzeiterkennung gilt nur für die WORKDIR-Schwachstelle (CVE-2024-21626).
Dockerfile und pushen Sie es in eine Image-Registry.image in der detector.yaml aus (mit TODO markiert).kubectl apply -f detector.yml ausführen.Leaky Vessels vulnerability detected in den Pod-Logs des DaemonSets ausgegeben.Unit-Tests müssen mit sudo ausgeführt werden, da sie auf eBPF basieren: sudo go test ebpf-detector/....
WORKDIR (CVE-2024-21626) erfolgt während der Container-Initialisierung, daher wird sie bei laufenden Containern nicht erkannt. Die Erkennung setzt außerdem voraus, dass die Container-Laufzeitumgebung containerd ist.CVE-2024-23651) und Buildkit Build-time Container Teardown Arbitrary Delete (CVE-2024-23652) sind zeitbasiert und können aufgrund von Race Conditions falsch-negative Ergebnisse aufweisen.Eine aktualisierte Liste der Bugs und Probleme finden Sie in den Projekt-Issues.
Beiträge sind willkommen. Details finden Sie in CONTRIBUTING.md.
Der Leaky Vessels Dynamic Detector steht unter der Apache-2.0-Lizenz. Weitere Informationen finden Sie in LICENSE.