27.02.2024

Уязвимость в runc, позволяющая выбраться из контейнеров Docker и Kubernetes

В инструментарии для запуска изолированных контейнеров runc, применяемом в Docker и Kubernetes, найдена уязвимость CVE-2024-21626, позволяющая получить доступ к файловой системе хост-окружения из изолированного контейнера. В ходе атаки злоумышленник может перезаписать некоторые исполняемые файлы в хост-окружения и таким образом добиться выполнения своего кода вне контейнера. В runtime LXC, crun и youki, так же использующих runc, проблема не проявляется. Уязвимость устранена в выпуске runc 1.1.12.

В случае использования инструментариев Docker или Kubernetes атака может быть совершена через подготовку специально оформленного образа контейнера, после установки и запуска которого из контейнера можно обратиться к внешней ФС. При использовании Docker имеется возможность эксплуатации через специально оформленный Dockerfile. Уязвимость также может быть эксплуатирована в случае запуска в контейнере процессов командой «runc exec» через привязку рабочего каталога к пространству имён хостового окружения.

Уязвимость вызвана утечкой внутренних файловых дескрипторов. Перед запуском кода внутри контейнера в 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/self/fd/7/../../../bin/bash») с последующей перезаписью файла «/proc/$pid/exe», ссылающегося на запущенный файл.

Кроме того, в компонентах инструментария Docker выявлено ещё пять уязвимостей:

  • CVE-2024-23651 — состояние гонки в пакете BuildKit, применяемом в Docker для преобразования исходного кода в сборочные артефакты. Уязвимость вызвана использованием в параллельно выполняемых стадиях сборки одной общей точки монтирования c кэшем («—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.

Источник: https://www.opennet.ru/opennews/art.shtml?num=60545 Источник.