
Эксплойт proof-of-concept для критической уязвимости побега из контейнера runC (CVE-2026-Pending) с состоянием гонки на символьных ссылках, включая PoC на Go, анализ и рекомендации по патчу.
Серьёзность: Критическая (CVSS 9.8)
Компонент: opencontainers/runc (libcontainer)
Тип уязвимости: CWE-59: Неправильное разрешение ссылок перед доступом к файлу ('Link Following')
Критическая уязвимость существует в функции maskPaths в runc. При маскировании чувствительных путей (например, /proc/kcore) внутри контейнера runc использует os.OpenFile(path, O_PATH, 0) без флага O_NOFOLLOW. Это позволяет вредоносному процессу в контейнере заменить целевой путь симлинком на чувствительный файл хоста (например, /etc/shadow), в результате чего runc выполняет операции монтирования с файлом хоста, а не с путём контейнера.
Прилагаемый файл exploit.go демонстрирует поведение ядра, которое позволяет осуществить этот обход.
Скомпилируйте и запустите в среде Linux (или в контейнере с CAP_SYS_ADMIN, если тестируете рекурсию):
go run exploit.go
// Vulnerable Code Pattern in runC:
// 1. Path is typically provided as a string (e.g. from config)
// 2. runC calls os.OpenFile(path, O_PATH...)
// 3. MISSING: unix.O_NOFOLLOW flag
// Result: Kernel follows symlink if attacker swapped the path.
Требуется патч:
Обновите libcontainer/rootfs_linux.go, чтобы добавить unix.O_NOFOLLOW при открытии целевых путей для маскирования.
- dstFh, err := os.OpenFile(path, unix.O_PATH|unix.O_CLOEXEC, 0)
+ dstFh, err := os.OpenFile(path, unix.O_PATH|unix.O_CLOEXEC|unix.O_NOFOLLOW, 0)
exploit.go: Функциональный код PoC на Go.analysis.md: Подробный технический разбор состояния гонки.cve_draft.md: Шаблон отчёта для подачи.Отказ от ответственности: Этот код предназначен только для исследований в области безопасности и образовательных целей.