
Preuve de concept pour CVE-2024-21626, une vulnérabilité d'évasion de conteneur dans runc. Inclut des scripts de vérification, deux méthodes d'exploitation (reverse shell via cron et remplacement de commande) et une analyse de la cause racine et du correctif.
| Nom de la vulnérabilité | Vulnérabilité d'évasion de docker runc |
|---|---|
| Identifiant de la vulnérabilité | CVE-2024-21626 |
| Date de divulgation | 2024-01-31 |
| Caractéristique | / |
| Versions concernées | runc @ [v1.0.0-rc93,1.1.11] |
Conditions d'exploitation un peu strictes : une interaction de la victime est requise ; personnellement, je trouve cela un peu anecdotique :
Vérification de l'existence de la vulnérabilité et obtention du descripteur de fichier :
git clone https://github.com/V0WKeep3r/CVE-2024-21626-runcPOC.git
cd CVE-2024-21626-runcPOC
bash verify.sh
Comme le montre la figure ci-dessous, la vulnérabilité existe et le descripteur de fichier est /proc/self/fd8
verify.sh peut déterminer la valeur fd précise correspondant à l'environnement de la machine actuelle ; si fd n'est pas 8, il faut modifier WORKDIR dans le Dockerfile pour y mettre la valeur correspondante, ou la spécifier avec -w dans docker run.
Vérification de l'évasion / élévation de privilèges : Ici, je me rapproche davantage des conditions réelles : poc.sh utilise une tâche planifiée pour obtenir un reverse shell. poc2.sh utilise la méthode de remplacement de commande (remarque : avec cette méthode, il faut sauvegarder les fichiers à l'avance afin d'éviter les difficultés de restauration).
# 需要确认定时任务文件存在,不存在可以创建写,但是那样不能触发定时任务
# 只有crontab -e创建的,在crontab组的文件才会被定时执行。
docker build . -t poc1
docker run -it --rm poc1 bash /poc.sh

POC2:
docker build . -t poc2
docker run -it --rm poc2 bash /poc.sh
# 另起一个terminal
/bin/bash.copy

Je n'ai pas une compréhension complète ; en combinant avec le correctif, on peut en saisir l'essentiel.
Au cours du processus docker exec ou docker run, la fonction execve de runc est appelée, mais lors du processus exec de runc, les descripteurs de fichier fd ne sont pas fermés, ce qui entraîne également la fuite des descripteurs de fichier de la machine hôte dans l'environnement du conteneur. L'utilisateur peut, via ce descripteur de fichier, lire et écrire les fichiers de la machine hôte, réalisant ainsi l'évasion du conteneur.
Solution de correction Mettez à niveau runc vers la version 1.12 ou supérieure. Lien officiel de runc : https://github.com/opencontainers/runc/releases
Analyse du correctif
commit du diff : https://github.com/opencontainers/runc/commit/2a4ed3e75b9e80d93d1836a9c4c1ebfa2b78870e
Fermeture rapide des fd internes avant execve
init_linux.go : vérifie, après chdir, si le cwd (répertoire de travail actuel) se trouve à l'intérieur du conteneur
