Docker Escape
@ZenmovieДисклеймер
Данный пост был написан только для образовательных целей.
Docker представляет собой мощную платформу для контейнеризации, упрощающую процессы разработки, тестирования и развертывания приложений. Эта технология обеспечивает изоляцию приложений и их зависимостей, что облегчает их переносимость(масштабируемость) и управление. Однако, при неправильном использовании высокопривилегированных настроек, Docker-контейнеры могут стать источником серьезных угроз для безопасности системы.
Основные компоненты Docker:
- Контейнеры: изолированные окружения, объединяющие приложение и все необходимые для его работы компоненты.
- Docker Daemon: фоновый процесс, управляющий контейнерами на хост-системе.
- Docker CLI: интерфейс командной строки для взаимодействия с Docker Daemon.
- Docker Image: образ, содержащий файловую систему и конфигурацию для запуска контейнера.
Механизмы защиты Docker'a:
- Namespace: изоляция процессов, пользователей, сети и других ресурсов.
- Control Groups (cgroups): управление ресурсами, такими как CPU, память и блоки.
- AppArmor и SELinux: системы контроля доступа, ограничивающие действия процессов в контейнере.
- Seccomp: ограничение доступа к системным вызовам.
Namespace'ы и cgroups поверхностно разобрал в прошлый раз. Поэтому кратко для понимания распишу, что такое AppArmor, SELinux и Seccomp
AppArmor - это система контроля доступа в Linux, предназначенная для ограничения прав доступа процессов и программ в целях повышения безопасности.Основываясь на определении профилей безопасности для приложений, она ограничивает их доступ к определенным ресурсам и функциональности.
Что делает:
- Задает правила доступа для приложений в форме профилей безопасности.
- Контролирует доступ к файлам, сети, системным вызовам и другим ресурсам.
- Профили AppArmor определяются для конкретных приложений или служб.
SELinux - это модуль ядра Linux, реализующий мандатное управление доступом (MAC) для повышения безопасности системы. Он предоставляет дополнительные слои безопасности, позволяя более детально определить и ограничить доступ к ресурсам.
Что делает:
- Использует метки безопасности для файлов и процессов.
- Определяет правила политики безопасности для контроля доступа.
- Разделяет роли пользователей и права доступа.
Seccomp - это механизм в ядре Linux, позволяющий ограничивать список системных вызовов, которые может выполнять процесс. Это средство направлено на уменьшение поверхности атаки за счет ограничения доступа к опасным системным вызовам.
Что делает:
- Ограничивает доступ к определенным системным вызовам.
- Позволяет процессу выполнять только заранее определенные безопасные операции.
Примеры Docker Escape:
На самом деле можно было просто скопипасть информацию с hacktricks (ссылку на страницу оставил), но посчитал это излишним, поэтому докину информации, которой там по каким-либо причинам не оказалось
- Использование 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-контейнера можно благодаря нескольким вещам:
- Известные уязвимости docker'а или его компонентов (CVE)
- Миссконфигурация в настройках docker-контейнера/сокета
- Миссконфигурация в ОС, влияющая на docker
Материал написан для: https://t.me/LamerZen