
Proof-of-concept für CVE-2024-21626, eine runc-Container-Escape-Schwachstelle. Enthält Verifikationsskripte, zwei Ausnutzungsmethoden (Cron-Reverse-Shell und Befehlsersetzung) sowie eine Analyse der Grundursache und des Patches.
| Schwachstellenname | Docker runc Escape-Schwachstelle |
|---|---|
| Schwachstellennummer | CVE-2024-21626 |
| Veröffentlichungsdatum | 2024-01-31 |
| Merkmal | / |
| Betroffene Versionen | runc @ [v1.0.0-rc93,1.1.11] |
Ausnutzungsbedingungen sind etwas streng, erfordern Interaktion des Opfers, persönlich etwas unspektakulär:
Überprüfung der Existenz der Schwachstelle und Abrufen des Dateideskriptors:
git clone https://github.com/V0WKeep3r/CVE-2024-21626-runcPOC.git
cd CVE-2024-21626-runcPOC
bash verify.sh
Wie unten abgebildet, existiert die Schwachstelle und der Dateideskriptor ist /proc/self/fd8
verify.sh kann den spezifischen fd-Wert in der aktuellen Maschinenumgebung ermitteln. Wenn fd nicht 8 ist, muss der WORKDIR im Dockerfile auf den entsprechenden Wert geändert oder bei docker run mit -w angegeben werden.
Escape/Privilege-Escalation-Überprüfung: Hier bin ich näher an der Praxis, poc.sh verwendet einen Cron-Job, um eine Reverse-Shell zu erhalten. poc2.sh verwendet eine Methode zum Ersetzen von Befehlen (Hinweis: Bei dieser Methode müssen vorher Sicherungskopien der Dateien erstellt werden, um eine Wiederherstellung zu ermöglichen).
# Es muss bestätigt werden, dass die Cron-Job-Datei existiert. Falls nicht, kann sie erstellt und beschrieben werden, aber dann wird der Cron-Job nicht ausgelöst.
# Nur Dateien, die mit 'crontab -e' erstellt wurden und in der crontab-Gruppe liegen, werden zeitgesteuert ausgeführt.
docker build . -t poc1
docker run -it --rm poc1 bash /poc.sh

POC2:
docker build . -t poc2
docker run -it --rm poc2 bash /poc.sh
# In einem anderen Terminal starten
/bin/bash.copy

Nicht vollständig verstanden, aber mit dem Patch lässt sich das Grobe nachvollziehen.
Im Prozess von docker exec oder docker run wird die execve-Funktion von runc aufgerufen. Während des runc exec-Vorgangs werden jedoch die fd-Dateideskriptoren nicht geschlossen, was dazu führt, dass die Dateideskriptoren des Hosts gleichzeitig in die Container-Umgebung durchsickern. Ein Benutzer kann diese Dateideskriptoren nutzen, um Dateien des Hosts zu lesen/schreiben und so einen Container-Escape durchzuführen.
Behebungsplan Aktualisieren Sie runc auf Version 1.12 oder höher. Offizieller runc-Link: https://github.com/opencontainers/runc/releases
Patch-Analyse
Diff-Commit: https://github.com/opencontainers/runc/commit/2a4ed3e75b9e80d93d1836a9c4c1ebfa2b78870e
Schließen der internen fds rechtzeitig vor dem execve-Aufruf.
init_linux.go: Nach dem chdir wird überprüft, ob sich das cwd (aktuelles Arbeitsverzeichnis) innerhalb des Containers befindet.
