Sploitus

Exploit for CVE-2025-31133

kitploit · 2026-08-25

Exploit Code

MARKDOWN92 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-SKYNET-F-NVIDIA-CVE-2025-31133
# Эксплойт PoC для CVE-2025-31133

В этом документе объясняется функциональность предоставленного PoC-скрипта (Proof-of-Concept) для уязвимости `runc` CVE-2025-31133.

## Краткое описание

  * **Уязвимость:** CVE-2025-31133 — состояние гонки с символическими ссылками в обработке `maskedPaths` в `runc`.
  * **Воздействие:** Вредоносный контейнер может обойти защиту `maskedPaths`, что позволяет ему записывать данные в чувствительные файлы хост-системы. Это представляет собой **побег из контейнера**.
  * **Цель PoC:** Безопасно продемонстрировать уязвимость, изменив файл `/proc/sys/kernel/core_pattern` на хосте изнутри контейнера.
  * **Безопасность:** Этот PoC не является деструктивным. Он только записывает строку `"pwned"` в целевой файл и **не** выполняет произвольный код на хосте. Он также содержит инструкции по восстановлению исходного значения.



* * *

## Объяснение уязвимости

Функция `maskedPaths` в спецификации OCI контейнера (`config.json`) — это механизм безопасности, предназначенный для предотвращения доступа контейнеров к чувствительным системным файлам. Он работает за счёт bind-mount-подключения `/dev/null` (пустого файла устройства) поверх этих чувствительных путей внутри контейнера, что фактически делает их недоступными для чтения и записи.

Уязвимость (CVE-2025-31133) представляет собой состояние гонки **Time-of-Check to Time-of-Use (TOCTOU)**. Эксплойт работает следующим образом:

  1. **Изъян:** Когда `runc` настраивает контейнер, он готовится использовать файл `dev/null` из rootfs контейнера в качестве источника для bind-mount, который замаскирует чувствительный путь (например, `/proc/sys/kernel/core_pattern`).
  2. **Гонка:** Существует небольшой временной интервал между моментом, когда `runc` разрешает путь к `rootfs/dev/null`, и моментом, когда он фактически выполняет операцию монтирования.
  3. **Эксплойт:** Злоумышленник может создать скрипт на хосте, который непрерывно и очень быстро переключает файл `rootfs/dev/null` между легитимным узлом устройства и символической ссылкой, указывающей на целевой файл на хосте (`/proc/sys/kernel/core_pattern`).
  4. **Выигрыш гонки:** Если тайминг идеален, `runc` выполнит операцию монтирования в тот самый момент, когда `rootfs/dev/null` является символической ссылкой. Это заставляет ядро следовать по символической ссылке, и предполагаемая операция маскирования для `/proc/sys/kernel/core_pattern` не срабатывает.
  5. **Побег из контейнера:** Поскольку маскирование не удалось, путь внутри контейнера больше не защищён. Процесс, работающий внутри контейнера, теперь может записывать в , что напрямую изменяет файл на хосте, достигая побега из контейнера.



Этот PoC использует данную технику для записи в `/proc/sys/kernel/core_pattern` — распространённую цель для подобных эксплойтов, поскольку её изменение может привести к выполнению произвольного кода на хосте при сбое процесса. Однако этот PoC записывает только безвредную строку, чтобы доказать наличие примитива записи.

* * *

## Как работает скрипт PoC

Скрипт `poc.sh` автоматизирует весь описанный выше процесс.

  1. **Настройка и очистка:**

     * Он определяет переменные для бинарного файла `runc`, имени контейнера и пути к rootfs.
     * Он включает надёжную функцию `cleanup`, которая гарантирует удаление всех ранее созданных контейнеров или файлов скрипта. Эта функция автоматически вызывается при выходе, прерывании или завершении работы.
  2. **Подготовка:**

     * Он сохраняет исходное содержимое `/proc/sys/kernel/core_pattern` хоста во временный файл. Позже это используется для проверки, удался ли эксплойт, и для помощи пользователю в восстановлении системы.
     * Он создаёт минимальный rootfs контейнера (`./rootfs`) и файл `config.json`.
     * `config.json` явно перечисляет `/proc/sys/kernel/core_pattern` в разделе `maskedPaths` — той самой функции, которую эксплойт нацелен обойти.
  3. **Функция гонки (`symlink_race`)**

     * Это ядро эксплойта. Она предназначена для работы в фоновом режиме.
     * Она входит в плотный цикл, который длится 20 секунд.
     * Внутри цикла она многократно: 
       1. Удаляет .



* * *

## Использование

**Предварительные требования:**

  * Уязвимая версия `runc`.
  * Установленный `busybox-static` (для оболочки контейнера).
  * Права root (`sudo`) для запуска `runc` и изменения `/proc`.



**Шаги:**

  1. Сохраните скрипт как `poc.sh`.
  2. Сделайте его исполняемым: `chmod +x poc.sh`.
  3. Запустите его с sudo: `sudo ./poc.sh`.



### Интерпретация вывода

  * **Успех:** Если вы видите сообщение `[+] EXPLOIT SUCCEEDED!`, это означает, что состояние гонки было выиграно. Файл `/proc/sys/kernel/core_pattern` на хосте был успешно изменён изнутри контейнера, что подтверждает уязвимость.
  * **Неудача:** Если вы видите `[-] Exploit did not succeed.`, гонка не была выиграна при этой попытке. Состояния гонки вероятностны и сильно зависят от времени и загрузки системы. **Попробуйте запустить скрипт ещё несколько раз.**



### Восстановление системы (после успешного запуска)

PoC изменит системный файл. Чтобы восстановить его в исходное состояние, выполните команду, предложенную скриптом:

root@kitploit:~
    
    
    # The 'ORIGINAL_PATTERN' will be the actual value from your system
    echo 'original_core_pattern_value' | sudo tee /proc/sys/kernel/core_pattern