Kubernetes‑кластеры в 2025‑м живут в другом мире, чем три‑четыре года назад. runc перестал быть «прозрачной» деталью под капотом Docker и k8s: новые уязвимости показали, что сам контейнерный рантайм стал полноценной зоной боевых действий, а не просто инфраструктурным фоном. Эта статья - попытка переосмыслить модель угроз Kubernetes и контейнеров после свежих CVE и собрать практический чек‑лист для тех, кто отвечает за безопасность прод‑кластеров.
Когда изолирующий слой сам становится целью
2025 год принёс целую серию контейнерных побегов - уязвимостей, позволяющих выскочить из контейнера на хост и дальше в плоскость управления кластера. В центре внимания оказались новые баги в runc: CVE‑2025‑31133, CVE‑2025‑52565 и CVE‑2025‑52881. Они эксплуатируют ошибки в обработке maskedPaths, работе с /dev/console и монтировании /proc, что даёт возможность обходить ограничения неймспейсов и записывать данные в чувствительные системные файлы хоста.Если раньше в типичном докладе про безопасность Kubernetes раздел «контейнерный рантайм» занимал один‑два слайда, то теперь этого явно недостаточно. runc, crun и их аналоги стали тем самым «пограничным контролем», от которого зависит, останется ли компрометация на уровне пода или пойдёт вверх по всей инфраструктуре.
Что изменили новые CVE в модели угроз
Классическая учебная картинка выглядела так: приложение → контейнер → хостовое Linux‑ядро → управляющая плоскость Kubernetes. runc фигурировал где‑то между контейнером и ядром и считался достаточно надёжным, чтобы про него не думать. Новые CVE ломают это допущение сразу в нескольких местах.- CVE‑2025‑31133 и CVE‑2025‑52565 эксплуатируют гонки и ошибки проверки в механизмах maskedPaths и монтировании /dev/console: через подмену /dev/null на симлинк или манипуляции монтированием можно добиться записи в чувствительные /proc‑пути хоста и обойти защиту LSM.
- CVE‑2025‑52881 дополняет картину возможностью переадресовать записи runc в произвольные файлы /proc, фактически получая готовые «гаджеты» для повышения привилегий на хосте.
Чтобы глубже понять, как новые уязвимости встраиваются в общую картину угроз для контейнерных сред, рекомендуем ознакомиться со статьей «Матрица угроз для Kubernetes: понимание и защита контейнерных сред» - в нём систематизированы векторы атак на разных уровнях архитектуры k8s.
Контейнерное бегство как стандартный сценарий атак
Отчёты за 2025 год показывают: большая часть продакшн‑образов содержит минимум один high/critical CVE, а число новых уязвимостей продолжает расти. В такой среде container escape перестаёт быть экзотикой и становится ожидаемой стадией сложной атаки.Типовой сценарий выглядит так:
- Компрометация приложения внутри пода (RCE, уязвимая библиотека, баг в бизнес‑логике).
- Эксплуатация ошибки рантайма или ядра (свежая runc‑CVE, уязвимость в файловой системе, eBPF‑баг) для выхода на хост.
- Дальнейшее движение в сторону kubelet и kube‑api: кража токена сервис‑аккаунта, доступ к /var/lib/kubelet и credential‑файлам.
- Перехват управления над нодой и затем над управляющей плоскостью.
Как новые уязвимости бьют по Docker и Kubernetes
Многие команды по инерции воспринимают Docker как локальную сборочную утилиту, а Kubernetes - как «настоящую» боевую среду. Новые баги в runc бьют по этому разделению: сама фаза сборки образа становится площадкой атаки, если build‑агенты используют уязвимые версии рантайма и ядра.- Компрометация CI‑агента через runc‑эксплойт ведёт к компрометации registry и всех деплойментов, то есть к масштабному supply‑chain‑инциденту.
- Ошибки конфигурации (привилегированные build‑контейнеры, доступ к сокету Docker‑демона) усиливают эффект: успешный побег даёт злоумышленнику root‑доступ ко всей инфраструктуре сборки.
Kubernetes: уязвимость рантайма = уязвимость ноды
В Kubernetes рантайм - часть доверенной базы. kubelet опирается на CRI‑адаптер (containerd, CRI‑O), который внутри использует тот же runc. Любая уязвимость runc автоматически превращается в уязвимость всех подов, работающих на ноде.Последствия:
- Привилегированные поды и поды с hostPID, hostNetwork, широкими hostPath‑монтами становятся критическими: если атакующий выбрался из такого контейнера, у него почти нет ограничений на хосте.
- Токены сервис‑аккаунтов в файловой системе пода превращаются в прямой путь к управляющей плоскости: достаточно сбежать из контейнера и прочитать их в смонтированных секретах или через директории kubelet.
- Node‑local службы (агенты мониторинга, логгеры, security‑sidecar’ы) часто работают с повышенными привилегиями; выход к ним через контейнерное бегство даёт быстрый путь к латеральному перемещению как внутри кластера, так и за его пределами.
Практика обновлений и hardening
Первый слой обороны банален, но критичен: нужно убедиться, что на всех нодах используются версии runc и контейнерного движка, закрывающие свежие CVE 2025 года, и что сама ОС получает регулярные обновления ядра. Многие вендоры (дистрибутивы Linux, GKE/EKS/AKS) публикуют отдельные бюллетени по этим уязвимостям - их нужно читать не «когда‑нибудь», а в день выхода.При этом бездумный автоапдейт по cron’у - почти гарантированная боль. Для прод‑кластеров разумно:
- держать staging‑кластер, куда первыми выкатываются обновления хоста и рантайма;
- использовать PodDisruptionBudget и аккуратно выводить ноды в cordon/drain, чтобы обновления не приводили к одновременному падению нескольких критичных подов;
- иметь задокументированную процедуру rollback’а версии ядра или образа ноды.
Минимизировать привилегии контейнеров
Новые runc‑CVE особенно опасны, когда из контейнера уже есть куда «выскочить». Чем меньше прав дано на хосте, тем короче траектория атаки и тем больше шансов, что побег упрётся в дополнительный барьер.Хорошая база для манифестов:
- securityContext.runAsNonRoot: true и явный runAsUser, чтобы root внутри контейнера не совпадал с root на хосте.
- allowPrivilegeEscalation: false, запрет privileged: true, отказ от hostPID, hostIPC, hostNetwork, если без них можно обойтись.
- readOnlyRootFilesystem: true для большинства сервисов: это усложняет запись в системные пути, которые эксплойты часто используют как «точки опоры».
- Агрессивный capabilities.drop: ["ALL"] и точечное добавление только необходимых capability.
Пересмотр политики образов и CI
Часть атак смещается в сторону фазы сборки и распространения образов, поэтому к Dockerfile и CI‑pipeline нужно относиться как к полноценному коду, а не техническому шуму.Практические шаги:
- добавить статический анализ Dockerfile и образов (Trivy, Grype, Snyk, Anchore и др.) в CI и падать по критичным CVE ещё до деплоя;
- перейти на минимальные и distroless‑образы, где меньше потенциальных точек атаки и заметно ниже общий CVE‑футпринт;
- жёстко ограничить использование публичных реестров: прод‑кластеры должны тянуть образы только из доверенного private registry, а использование imagePullPolicy: Always и плавающих тегов :latest - это приглашение к сюрпризам;
- ввести код‑ревью для Dockerfile с чек‑листом: отсутствие лишних пакетов, отсутствие curl | sh из непроверенных источников, отсутствие постоянного монтирования сокетов Docker‑демона.
Defensive‑практики для Blue Team: мониторинг и реагирование
После всплеска уязвимостей в runc привычный список «аномалий в логах приложений» уже не хватает. Нужны сигналы, которые отражают именно попытку побега или работы с хостом.Стоит обратить внимание на:
- неожиданные обращения контейнеров к чувствительным путям /proc и системным файлам, не используемым штатным кодом;
- создание или изменение файлов в директориях, смонтированных как hostPath, вне заранее утверждённого списка;
- появление в контейнере утилит, которых не должно быть в образе: интерактивные шеллы, сетевые сканеры, отладчики;
- резкую смену сетевой активности пода - появление прямых запросов к kube‑api, обращений к метаданным cloud‑провайдера и нетипичных внешних IP;
- изменение конфигурации системных служб на ноде (kubelet, агенты мониторинга) вскоре после аномальной активности в одном из подов.
Какой стек инструментов достаточно зрелый для 2025 года
Полный набор из десятка агентов и SaaS‑платформ необязателен. Для команды уровня Middle можно собрать разумный минимум.- Средства проверки конфигурации по CIS Benchmark и другим гайдам (kube‑bench, Kubescape, специализированные аудит‑операторы).
- eBPF‑ и rule‑based сенсоры вроде Falco или Tracee для отслеживания системных вызовов, подозрительных монтирований и изменений в файловой системе.
- Runtime‑сканеры образов в кластере (оператор Trivy, решения от Aqua, Wiz, других вендоров) для отслеживания новых критичных CVE в уже запущенных подах.
- Включённый Kubernetes Audit Log с экспортом в центральное хранилище и связкой с SIEM, чтобы расследования не упирались в отсутствие журналов.
Заключение: жить с тем, что контейнеры не волшебная песочница
Уязвимости runc 2025 года окончательно добили миф о том, что «контейнер = изоляция по умолчанию». На практике это лишь тонкий программный слой над общим ядром, который ошибается так же часто, как и любой другой сложный компонент. Разница только в том, что ошибка здесь автоматически поднимает уровень риска со «скомпрометированного микросервиса» до «скомпрометированной ноды и, возможно, всего кластера».Обновлённый взгляд на безопасность Kubernetes в 2025 году опирается на три основные идеи.
- Патчить рантайм и ядро так же дисциплинированно, как приложения. Уязвимости уровня runc - это не инфраструктурный шум, а прямые векторы к захвату кластера. Обновления нод, staging‑кластер и понятный rollback - обязательная гигиена.
- Минимизировать последствия побега. Ограничение привилегий контейнеров, отказ от лишних host*‑опций, минимальные образы и аккуратное обращение с hostPath делают даже успешный побег менее разрушительным.
- Смотреть на Kubernetes как на живую, наблюдаемую систему. Мониторинг системных вызовов, аудит конфигурации, инвентаризация образов и логирование действий в управляющей плоскости превращают «магический» оркестратор в понятную инженерную систему, в которой можно замечать и останавливать атаки.
Последнее редактирование: