Как из Docker-контейнера можно нарушить работу хостовой системы?

«Как из Docker-контейнера можно нарушить работу хостовой системы?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Контейнер, по умолчанию, изолирован, но неправильная конфигурация или предоставление избыточных привилегий может привести к компрометации хоста. Вот реальные векторы атак, которые мы учитываем при настройке безопасности.

1. Монтирование чувствительных директорий хоста: Если смонтировать корневую файловую систему хоста (/) или директорию с Docker socket (/var/run/docker.sock) в режиме записи, контейнер получит над ней полный контроль.

# Критически опасный запуск
docker run -v /:/hostfs -it alpine rm -rf /hostfs/etc

2. Запуск контейнера в привилегированном режиме (--privileged): Это дает контейнеру доступ ко всем устройствам хоста и отключает многие механизмы изоляции. Контейнер может, например, перемонтировать корневую ФС хоста.

docker run --privileged -it ubuntu
# Внутри контейнера:
mount /dev/sda1 /mnt
echo "malicious_code" > /mnt/etc/crontab

3. Неограниченное использование ресурсов: Контейнер без лимитов CPU и памяти может исчерпать ресурсы хоста, вызвав отказ в обслуживании (DoS).

4. Использование уязвимостей ядра (например, Dirty COW): Если в ядре хоста есть неисправленная уязвимость, процесс в контейнере может ее эксплуатировать для получения root-прав на хосте.

Меры защиты, которые мы применяем:

  • Никогда не использовать --privileged. Вместо этого предоставляем только необходимые Linux Capabilities через --cap-add.
  • Сбрасываем все capabilities по умолчанию: --cap-drop=ALL --cap-add=NET_BIND_SERVICE.
  • Запускаем контейнер от непривилегированного пользованого UID: --user 1000:1000.
  • Монтируем файловые системы только для чтения: --read-only.
  • Устанавливаем жесткие лимиты на ресурсы: --memory="512m" --cpus="1.0".
  • Используем Security-контексты в Kubernetes: securityContext.readOnlyRootFilesystem: true.
  • Регулярно обновляем ядро хоста и сканируем образы на уязвимости с помощью Trivy или Grype.