
Proof-of-concept per CVE-2024-21626, una vulnerabilità di fuga dal container runc. Include script di verifica, due metodi di sfruttamento (reverse shell via cron e sostituzione di comando) e analisi della causa principale e della patch.
| Nome vulnerabilità | Vulnerabilità di fuga di runc in docker |
|---|---|
| ID vulnerabilità | CVE-2024-21626 |
| Data di divulgazione | 2024-01-31 |
| Caratteristica | / |
| Versioni interessate | runc @ [v1.0.0-rc93,1.1.11] |
Le condizioni per lo sfruttamento sono piuttosto restrittive, richiedono l'interazione della vittima. Personalmente lo ritengo un po' inutile:
Verifica dell'esistenza della vulnerabilità e ottenimento del descrittore:
git clone https://github.com/V0WKeep3r/CVE-2024-21626-runcPOC.git
cd CVE-2024-21626-runcPOC
bash verify.sh
Come mostrato nell'immagine qui sotto, la vulnerabilità è presente e il descrittore di file è /proc/self/fd8
verify.sh può trovare il valore specifico di fd nell'ambiente della macchina corrente. Se fd non è 8, è necessario modificare WORKDIR nel Dockerfile con il valore corrispondente o specificarlo con -w in docker run.
Verifica di fuga/elevazione dei privilegi: Qui sono più vicino a uno scenario reale. poc.sh utilizza un cron job per ottenere una reverse shell. poc2.sh utilizza la sostituzione di comandi (nota: con questo metodo è necessario eseguire un backup dei file in anticipo per evitare di non poterli ripristinare).
# 需要确认定时任务文件存在,不存在可以创建写,但是那样不能触发定时任务
# 只有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

Non è del tutto compreso, ma insieme alla patch si può avere un'idea generale.
Durante l'esecuzione di docker exec o docker run, viene chiamata la funzione execve di runc. Tuttavia, nel processo di runc exec, i descrittori di file (fd) non vengono chiusi, causando la perdita dei descrittori di file dell'host nell'ambiente del contenitore. L'utente può utilizzare questi descrittori per leggere e scrivere i file dell'host, ottenendo così la fuga dal contenitore.
Soluzione di mitigazione Aggiornare runc alla versione 1.12 o successiva. Link ufficiale: https://github.com/opencontainers/runc/releases
Analisi della patch
diff commit: https://github.com/opencontainers/runc/commit/2a4ed3e75b9e80d93d1836a9c4c1ebfa2b78870e
Chiudere i fd interni prima di execve
init_linux.go: dopo chdir, verifica che la cwd (directory di lavoro corrente) sia all'interno del contenitore
