release_agent exploit - Relative Paths to PIDs
Für weitere Details überprüfen Sie den Blogbeitrag von https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html. Dies ist nur eine Zusammenfassung:
Die Technik beschreibt eine Methode zum Ausführen von Host-Code aus einem Container, die Herausforderungen durch Speicher-Driver-Konfigurationen überwindet, die den Dateisystempfad des Containers auf dem Host verschleiern, wie Kata Containers oder spezifische devicemapper
-Einstellungen.
Wichtige Schritte:
Prozess-IDs (PIDs) lokalisieren: Mit dem symbolischen Link
/proc/<pid>/root
im Linux-Pseudo-Dateisystem kann jede Datei innerhalb des Containers relativ zum Dateisystem des Hosts zugegriffen werden. Dies umgeht die Notwendigkeit, den Dateisystempfad des Containers auf dem Host zu kennen.PID-Bashing: Ein Brute-Force-Ansatz wird verwendet, um durch PIDs auf dem Host zu suchen. Dies geschieht, indem sequenziell auf das Vorhandensein einer bestimmten Datei unter
/proc/<pid>/root/<file>
überprüft wird. Wenn die Datei gefunden wird, zeigt dies an, dass die entsprechende PID zu einem Prozess gehört, der im Zielcontainer läuft.Ausführung auslösen: Der erratene PID-Pfad wird in die Datei
cgroups release_agent
geschrieben. Diese Aktion löst die Ausführung desrelease_agent
aus. Der Erfolg dieses Schrittes wird durch die Überprüfung der Erstellung einer Ausgabedatei bestätigt.
Ausbeutungsprozess
Der Ausbeutungsprozess umfasst eine detailliertere Reihe von Aktionen, die darauf abzielen, ein Payload auf dem Host auszuführen, indem die korrekte PID eines Prozesses, der im Container läuft, erraten wird. So verläuft es:
Umgebung initialisieren: Ein Payload-Skript (
payload.sh
) wird auf dem Host vorbereitet, und ein einzigartiges Verzeichnis wird für die cgroup-Manipulation erstellt.Payload vorbereiten: Das Payload-Skript, das die auszuführenden Befehle auf dem Host enthält, wird geschrieben und ausführbar gemacht.
Cgroup einrichten: Die cgroup wird gemountet und konfiguriert. Das Flag
notify_on_release
wird gesetzt, um sicherzustellen, dass das Payload ausgeführt wird, wenn die cgroup freigegeben wird.Brute Force PID: Eine Schleife iteriert durch potenzielle PIDs und schreibt jede erratene PID in die Datei
release_agent
. Dies setzt das Payload-Skript effektiv alsrelease_agent
.Ausführung auslösen und überprüfen: Für jede PID wird in die
cgroup.procs
der cgroup geschrieben, was die Ausführung desrelease_agent
auslöst, wenn die PID korrekt ist. Die Schleife wird fortgesetzt, bis die Ausgabe des Payload-Skripts gefunden wird, was auf eine erfolgreiche Ausführung hinweist.
PoC aus dem Blogbeitrag:
Last updated