release_agent exploit - Relative Paths to PIDs
Für weitere Details überprüfen Sie den Blog-Beitrag von https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html. Hier ist nur eine Zusammenfassung:
Die Technik beschreibt eine Methode zum Ausführen von Host-Code innerhalb eines Containers, die Herausforderungen durch Storage-Driver-Konfigurationen überwindet, die den Dateisystempfad des Containers auf dem Host verschleiern, wie z.B. Kata Containers oder spezifische devicemapper
-Einstellungen.
Wichtige Schritte:
Auffinden von Prozess-IDs (PIDs): Mit dem symbolischen Link
/proc/<pid>/root
im Linux-Pseudodateisystem kann auf jede Datei innerhalb des Containers relativ zum Dateisystem des Hosts zugegriffen werden. Dadurch entfällt die Notwendigkeit, den Dateisystempfad des Containers auf dem Host zu kennen.PID-Bashing: Es wird eine Brute-Force-Methode verwendet, um PIDs auf dem Host zu durchsuchen. Dies geschieht durch sequenzielle Überprüfung auf das Vorhandensein einer bestimmten Datei unter
/proc/<pid>/root/<file>
. Wenn die Datei gefunden wird, bedeutet dies, dass die entsprechende PID zu einem im Zielcontainer ausgeführten Prozess gehört.Auslösen der Ausführung: Der geratene PID-Pfad wird in die Datei
cgroups release_agent
geschrieben. Diese Aktion löst die Ausführung desrelease_agent
aus. Der Erfolg dieses Schritts wird durch Überprüfung auf die Erstellung einer Ausgabedatei bestätigt.
Ausbeutungsprozess
Der Ausbeutungsprozess umfasst eine detailliertere Reihe von Aktionen, die darauf abzielen, eine Nutzlast auf dem Host auszuführen, indem die richtige PID eines im Container ausgeführten Prozesses geraten wird. So läuft es ab:
Umgebung initialisieren: Ein Nutzlast-Skript (
payload.sh
) wird auf dem Host vorbereitet und ein eindeutiges Verzeichnis für die cgroup-Manipulation erstellt.Nutzlast vorbereiten: Das Nutzlast-Skript, das die auf dem Host auszuführenden Befehle enthält, wird geschrieben und ausführbar gemacht.
Cgroup einrichten: Die cgroup wird eingebunden und konfiguriert. Die
notify_on_release
-Flagge wird gesetzt, um sicherzustellen, dass die Nutzlast ausgeführt wird, wenn die cgroup freigegeben wird.Brute-Force-PID: Eine Schleife durchläuft potenzielle PIDs und schreibt jeden geratenen PID in die Datei
release_agent
. Dadurch wird das Nutzlast-Skript effektiv alsrelease_agent
festgelegt.Auslösen und Überprüfen der Ausführung: Für jeden PID wird
cgroup.procs
der cgroup beschrieben, wodurch die Ausführung desrelease_agent
ausgelöst wird, wenn der PID korrekt ist. Die Schleife wird fortgesetzt, bis die Ausgabe des Nutzlast-Skripts gefunden wird, was auf eine erfolgreiche Ausführung hinweist.
PoC aus dem Blog-Beitrag:
Last updated