Docker Escape

Docker Escape

@Zenmovie

Дисклеймер

Данный пост был написан только для образовательных целей.


Docker представляет собой мощную платформу для контейнеризации, упрощающую процессы разработки, тестирования и развертывания приложений. Эта технология обеспечивает изоляцию приложений и их зависимостей, что облегчает их переносимость(масштабируемость) и управление. Однако, при неправильном использовании высокопривилегированных настроек, Docker-контейнеры могут стать источником серьезных угроз для безопасности системы.

Основные компоненты Docker:

  1. Контейнеры: изолированные окружения, объединяющие приложение и все необходимые для его работы компоненты.
  2. Docker Daemon: фоновый процесс, управляющий контейнерами на хост-системе.
  3. Docker CLI: интерфейс командной строки для взаимодействия с Docker Daemon.
  4. Docker Image: образ, содержащий файловую систему и конфигурацию для запуска контейнера.

Механизмы защиты Docker'a:

  1. Namespace: изоляция процессов, пользователей, сети и других ресурсов.
  2. Control Groups (cgroups): управление ресурсами, такими как CPU, память и блоки.
  3. AppArmor и SELinux: системы контроля доступа, ограничивающие действия процессов в контейнере.
  4. Seccomp: ограничение доступа к системным вызовам.

Namespace'ы и cgroups поверхностно разобрал в прошлый раз. Поэтому кратко для понимания распишу, что такое AppArmor, SELinux и Seccomp

AppArmor - это система контроля доступа в Linux, предназначенная для ограничения прав доступа процессов и программ в целях повышения безопасности.Основываясь на определении профилей безопасности для приложений, она ограничивает их доступ к определенным ресурсам и функциональности.

Что делает:

  • Задает правила доступа для приложений в форме профилей безопасности.
  • Контролирует доступ к файлам, сети, системным вызовам и другим ресурсам.
  • Профили AppArmor определяются для конкретных приложений или служб.

SELinux - это модуль ядра Linux, реализующий мандатное управление доступом (MAC) для повышения безопасности системы. Он предоставляет дополнительные слои безопасности, позволяя более детально определить и ограничить доступ к ресурсам.

Что делает:

  • Использует метки безопасности для файлов и процессов.
  • Определяет правила политики безопасности для контроля доступа.
  • Разделяет роли пользователей и права доступа.

Seccomp - это механизм в ядре Linux, позволяющий ограничивать список системных вызовов, которые может выполнять процесс. Это средство направлено на уменьшение поверхности атаки за счет ограничения доступа к опасным системным вызовам.

Что делает:

  • Ограничивает доступ к определенным системным вызовам.
  • Позволяет процессу выполнять только заранее определенные безопасные операции.


Примеры Docker Escape:

На самом деле можно было просто скопипасть информацию с hacktricks (ссылку на страницу оставил), но посчитал это излишним, поэтому докину информации, которой там по каким-либо причинам не оказалось

  1. Использование SYS_PTRACE в пространстве PID
docker run -it --cap-add=SYS_PTRACE --pid=host --security-opt=apparmor:unconfined ubuntu bash

Разрешение SYS_PTRACE предоставляет контейнеру доступ к отладочным возможностям ядра, что может использоваться для мониторинга и взаимодействия с процессами хоста.

2. Suid-бит на nsenter

nsenter --target 1 --mount sh

Команда nsenter используется для входа в указанное пространство имен (namespace) с PID 1 (что часто соответствует хостовой системе) и откроет интерактивную оболочку shell.

3. Побег с помощью capabilities

Повысить привилегии можно с помощью CAP_SYS_ADMIN, CAP_SYS_PTRACE, CAP_SYS_MODULE, DAC_READ_SEARCH, DAC_OVERRIDE, но приведу пример только с одним, остальные делаются +- по образу и подобию

docker run --cap-add=SYS_MODULE -it ubuntu bash

--cap-add=SYS_MODULE добавляет возможность для загрузки ядерных модулей внутри контейнера. Это разрешение предоставляет контейнеру доступ к системному вызову init_module и, таким образом, позволяет загружать ядерные модули.

Рекомендации:

  • Ограничение доступа к Docker сокету: Строго контролируйте доступ к Docker API, предоставляя его только тем контейнерам, которые действительно нуждаются в этом.
  • Минимизация привилегий: Используйте минимально необходимые привилегии при запуске контейнеров. Избегайте использования опции --privileged, если это необходимо именно для вашего приложения.

Вывод:

Повыситься с помощью docker-контейнера можно благодаря нескольким вещам:

  1. Известные уязвимости docker'а или его компонентов (CVE)
  2. Миссконфигурация в настройках docker-контейнера/сокета
  3. Миссконфигурация в ОС, влияющая на docker

Материал написан для: https://t.me/LamerZen

Report Page