## 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