В 19% популярнейших Docker-образов нет пароля для root
В минувшую субботу, 18 мая, Jerry Gamblin из Kenna Security проверил 1000 самых популярных образов с Docker Hub на используемый в них пароль для пользователя root. В 19% случаев он оказался пустым.
Предыстория с Alpine
Поводом для проведённого мини-исследования стал появившийся ранее в этом месяце Talos Vulnerability Report (TALOS-2019-0782), авторы которого — благодаря находке Peter Adkins из Cisco Umbrella — сообщили, что Docker-образы с популярным дистрибутивом для контейнеров Alpine не имеют пароля для root:
3) содержат NULL-пароль для пользователя root. «Официальные версии Docker-образов Alpine Linux (начиная с v3. Её суть сводится к тому, что системы, развёрнутые с проблемными версиями Alpine Linux в контейнере и использующие Linux PAM или другой механизм, задействующий системный файл shadow в качестве базы данных для аутентификации, могут принимать нулевой (NULL) пароль для пользователя root». Эта уязвимость появилась в результате регрессии, представленной в декабре 2015 года.
Проверенными на проблему версиями Docker-образов с Alpine назывались 3.3—3.9 включительно, а также последний релиз edge.
Авторы давали следующую рекомендацию пользователям, подверженным проблеме:
Вероятная эксплуатация уязвимости зависит от окружения, поскольку её успех требует проброшенного вовне сервиса или приложения, использующего Linux PAM или другого подобного механизма». «Учётная запись root должна быть явно отключена в Docker-образах, собранных на базе проблемных версий Alpine.
Проблема была устранена в Alpine версий 3.6.5, 3.7.3, 3.8.4, 3.9.2 и edge (20190228 snapshot), а обладателям подверженным ей образов предложили закомментировать строку с root в /etc/shadow
или убедиться в отсутствии пакета linux-pam
.
Продолжение с Docker Hub
Jerry Gamblin решил полюбопытствовать, «насколько распространённой может оказаться практика использования null-паролей в контейнерах». Для этого он написал небольшой Bash-скрипт, суть которого весьма проста:
- через curl-запрос к API в Docker Hub запрашивается список размещённых там Docker-образов;
- через jq он сортируется по полю
popularity
, а из полученных результатов остаётся первая тысяча; - для каждого из них выполняется
docker pull
; - для каждого полученного с Docker Hub образа выполняется
docker run
с чтением первой строки из файла/etc/shadow
; - если значение строки оказалось равным
root:::0:::::
, название образа сохраняется в отдельный файл.
Что же получилось? В этом файле оказалось 194 строки с названиями популярных Docker-образов с Linux-системами, root-пользователь в которых не имеет установленного пароля:
А kylemanna/openvpn — самый популярный контейнер из списка, его статистика насчитывает более 10 миллионов pull'ов». «Среди наиболее известных имён в этом списке оказались govuk/governmentpaas, hashicorp, microsoft, monsanto и mesosphere.
Стоит, впрочем, напомнить, что само по себе это явление не означает прямой уязвимости в безопасности систем, которые их используют: всё зависит и от того, как именно они применяются (см. комментарий из случая с Alpine выше). Однако «мораль сей басни» мы видели уже много раз: видимая простота зачастую имеет и обратную сторону, о которой всегда необходимо помнить и последствия которой учитывать в своих сценариях применения технологии.
P.S.
Читайте также в нашем блоге: