Контейнеризация приложений с использованием Docker становится все более популярной благодаря изоляции, портативности и масштабируемости. Однако Docker не застрахован от уязвимостей, позволяющих нарушить безопасность хоста. В этой статье на примере прохождения уязвимой виртуальной машины MonitorsTwo с площадки Hack The Box мы попробуем осуществить побег из Docker с помощью уязвимости CVE-2021-41091.
Еще по теме: Пример атаки побег из Docker-контейнера
Краткое описание уязвимости CVE-2021-41091
CVE-2021-41091 — это уязвимость в Moby (Docker Engine), которая позволяет непривилегированным пользователям Linux получить доступ к каталогу данных (обычно /var/lib/docker) и запускать программы в нем из-за неправильно настроенных разрешений. Эта уязвимость присутствует, когда контейнеры содержат исполняемые файлы с расширенными разрешениями, такими как setuid.
Непривилегированные пользователи Linux могут обнаружить и запустить эти программы, а также изменять файлы, если UID пользователя на хосте совпадает с владельцем файла или группой внутри контейнера.
Побег из Docker эксплуатируя уязвимость CVE-2021-41091
Итак, ранее взломав сайт, используя уязвимость, в движке Cacti, мы получили пароль и можем с ним зайти по SSH.
Загружаем на машину скрипт LinPEAS и выполняем его. Единственное, что можно отметить в выводе, — это почтовые сообщения пользователя marcus.
Смотрим содержимое файла /var/mail/marcus и обнаруживаем, что в переписке упомянуто три уязвимости CVE.
Последний из перечисленных багов — это CVE-2021-41091: ошибка в фреймворке Moby, которая при определенных условиях может открыть возможность побега из контейнера.
Moby — это проект с открытым исходным кодом, разработанный командой Docker для удобства контейнеризации ПО. Ошибка сводится к тому, что каталог с данными (обычно это /var/lib/docker) содержит подкаталоги с недостаточно ограниченными разрешениями. Это позволяет непривилегированным пользователям просматривать содержимое каталога и выполнять программы с их текущими разрешениями.
Таким образом, когда контейнер содержит исполняемый файл с активным S-битом, непривилегированные пользователи могут выполнить эти программы от имени владельца (в Docker) на хостовой машине за пределами Docker.
Попробуем повторить эту атаку, для чего вернемся к root-сессии в Docker и присвоим SUID файлу командной оболочки /bin/bash.
Бит SUID
Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из‑за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.
Теперь надо найти раздел, куда примонтирован наш контейнер. Это нужно, чтобы получить доступ к файлу /bin/bash с S-битом.
Есть несколько разделов Docker — в каталоге /var/lib/docker/, поэтому пройдемся по этим директориям и просмотрим права на файлы bash.
Так находим файл с активным S-битом. Создаем новую сессию bash в контексте пользователя root и забираем второй флаг.
Защита от уязвимости CVE-2021-41091
CVE-2021-41091 — серьезная уязвимость Docker, позволяющая преодолеть изоляцию контейнеров. Чтобы устранить эту уязвимость, крайне важно обновить Docker до версии 20.10.9 или выше.
Своевременное обновление Docker контейнеров критически важно для предотвращения компрометации. Следует тщательно проверять контейнеры на безопасные настройки разрешений.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Проверка безопасности Docker-образов с помощью Trivy
- Проверка безопасности Docker и Kubernetes в облаке Amazon