В инструментарии для запуска изолированных контейнеров runc, применяемом в Docker и Kubernetes, найдена уязвимость CVE-2024-21626, позволяющая получить доступ к файловой системе хост-окружения из изолированного контейнера. В ходе атаки злоумышленник может перезаписать некоторые исполняемые файлы в хост-окружения и таким образом добиться выполнения своего кода вне контейнера. В runtime LXC, crun и youki, так же использующих runc, проблема не проявляется. Уязвимость устранена в выпуске runc 1.1.12.
В случае использования инструментариев Docker или Kubernetes атака может быть совершена через подготовку специально оформленного образа контейнера, после установки и запуска которого в контейнере остаётся возможность обращения к внешней ФС. При использовании Docker имеется возможность эксплуатации через специально оформленный Dockerfile. Уязвимость также может быть эксплуатирована при запуске нового экземпляра контейнера командой “runc exec” через привязку рабочего каталога к пространству имён хостового окружения при помощи указания специального значения в параметре “workdir”.
Уязвимость вызвана утечкой внутренних файловых дескрипторов. Перед запуском кода из контейнера в runc выполняется закрытие всех файловых дескрипторов при помощи флага O_CLOEXEC. Тем не менее, после последующего выполнения функции setcwd() оказывался открытым файловый дескриптор, указывающий на рабочий каталог и продолжающий оставаться доступным после запуска контейнера. Предложено несколько базовых сценария атаки на хост-окружение, используя оставшийся файловый дескриптор.
Например, атакующий может указать в образе контейнера параметр process.cwd, указывающий на “/proc/self/fd/7/”, что приведёт к привязке к процессу pid1 в контейнере рабочего каталога, находящегося в пространстве монтирования хост-окружения. Таким образом в образе контейнера можно настроить запуск “/proc/self/fd/7/../../../bin/bash” и через выполнение shell-скрипта перезаписать содержимое “/proc/self/exe”, которое ссылается на хостовую копию /bin/bash.
Другой вариант атаки позволяет злоумышленнику, ограниченному внутри контейнера, получить доступ к каталогу хостового окружения, если в указанном контейнере запускаются привилегированные процессы при помощи команды “runc exec с опцией “–cwd”. Атакующий может подменить путь запускаемого процесса на символическую ссылку, указывающую на “/proc/self/fd/7/” и добиться открытия “/proc/$exec_pid/cwd” для доступа к ФС на стороне хоста. Атакующий также может добиться перезаписи исполняемых файлов на стороне хостового окружения, через организацию запуска исполняемого файла из хостового окружения с последующей перезаписью файла “/proc/$pid/exe”, ссылающегося на тот запущенный файл.
Кроме того, в компонентах инструментария Docker выявлено ещё пять уязвимостей:
- CVE-2024-23651 – состояние гонки в пакете BuildKit, применяемом в Docker для преобразования исходного кода в сборочные артефакты. Уязвимость вызвана использованием в параллельно выполняемых стадиях сборки одной общей точки монтирования в кэшем (“–mount=type=cache,source=”), что позволяет при обработке в BuildKit специально оформленного Dockerfile получить из сборочного контейнера доступ к файлам в хостовом окружении. Уязвимость устранена в BuildKit 0.12.5.
- CVE-2024-23652 – ошибка при удалении пустых файлов, созданных для точки монтирования при использовании опции “–mount” позволяет добиться удаления файла вне контейнера при обработке специально оформленного Dockerfile. Уязвимость устранена в BuildKit 0.12.5.
- CVE-2024-23653 – ошибка в реализации API в BuildKit, позволяет добиться выполнения контейнера с повышенными привилегиями, невзирая на состояние настройки security.insecure. Уязвимость устранена в BuildKit 0.12.5.
- CVE-2024-23650 – вредоносный клиент или фронтэнд BuildKit может вызвать аварийное завершение фонового процесса BuildKit. Уязвимость устранена в BuildKit 0.12.5.
- CVE-2024-24557 – возможность отравления кэша в Moby, компоненте для построения специализированных систем контейнерной изоляции. При обработке специально оформленного образа контейнера можно добиться помещения в кэш данных, которые могут использоваться на следующих этапах сборки. Уязвимость устранена в Moby 25.0.2 и 24.0.9.