Атака на зависимости позволила выполнить код на серверах PayPal, Micrоsoft, Apple, Netflix, Uber и ещё 30 компаний
10 февраля 2021 года
Представлен поразительный по своей простоте метод атаки на зависимости в приложениях, при разработке которых используются внутренние репозитории пакетов. Выявившие проблему исследователи смогли выполнить свой код на внутренних серверах 35 компаний, среди которых PayPal, Micrоsoft, Apple, Netflix, Uber, Tesla и Shopify. Взломы проводились в рамках программ Bug Bounty, согласованно с атакуемыми компаниями, и уже принесли авторам 130 тысяч долларов, выплаченных в форме вознаграждений за выявление уязвимостей (выплаты продолжают поступать).
Метод основан на том, что многие компании используют в своих внутренних приложениях зависимости из стандартных репозиториев NPM, PyPI и RubyGems, а также внутренние зависимости, которые не распространяются публично и загружаются из собственных репозиториев. Проблема в том, что пакетные менеджеры, такие как npm, pip и gem, пытаются загрузить внутренние зависимости компаний в том числе и из публичных репозиториев. Для атаки достаточно определить имена пакетов со внутренними зависимостями и создать собственные пакеты с такими же именами в публичных репозиториях NPM, PyPI и RubyGems. Проблема не специфична для NPM, PyPI и RubyGems, и также проявляется в других системах, таких как NuGet, Maven и Yarn.
Идея предложенного метода появилась после того, как исследователь случайно обратил внимание, что в публикуемом на GitHub общедоступном коде многие компании не очищают из manifest-файлов упоминание дополнительных зависимостей, применяемых во внутренних проектах или при реализации расширенной функциональности. Подобные следы были найдены в Node.JS, Python и Ruby проектах многих компаний и исследователь решился на эксперимент по взлому инфраструктуры данных компаний в рамках действующих программ Bug Bounty. Все опубликованные дубликаты пакетов были снабжены примечанием о проведении исследования.
Результаты оказались неожиданно эффективными и исследователю удалось выполнить свой код на многих серверах, отвечающих за сборку или тестирование на базе систем непрерывной интеграции. При загрузке зависимостей пакетные менеджеры npm, pip и gem в первую очередь устанавливали пакеты из первичных публичных репозиториев NPM, PyPI и RubyGems, которые рассматривались как более приоритетные. Наличие аналогичных пакетов с теми же именами в приватных репозиториях компаний игнорировалось без вывода какого-либо предупреждения и не приводя к сбою. В PyPI на приоритет загрузки влиял номер версии (независимо от репозитория загружалась наиболее свежая версия пакета). В NPM и RubyGems приоритет зависел только от репозитория.
Исследователь разместил в репозиториях NPM, PyPI и RubyGems пакеты, пересекающиеся с названиями найденных внутренних зависимостей, добавив в скрипт, запускаемый перед началом установки (preinstall в NPM), код для сбора информации о системе и отправки полученных сведений на внешний хост. Для передачи сведений об успехе взлома в обход межсетевых экранов, блокирующих внешний трафик, использовался метод организации скрытого канала связи поверх протокола DNS. Запускаемый код осуществлял резолвинг хоста в подконтрольном атакующему домене, что позволяло на DNS-сервере собирая информацию об успешных операциях.
Компания Microsoft опубликовала рекомендации по защите сборочных систем от атак на зависимости:
- В PyPI рекомендуется использовать опцию index-url для переопределения приоритета обработки зависимостей.
- В NuGet в nuget.config в секции packageSources рекомендуется использовать запись <clear /> для удаления наследуемых конфигураций и явно добавлять приватные репозитории через запись <add />.
- В Maven рекомендуется настроить одно общее зеркало при помощи опций <mirrorOf>*</mirrorOf> и перенаправлять в его все запросы к репозиториям. Другим вариантом является переопределение репозиториев по умолчанию при помощи настройки <releases>.
- В NPM и Yarn в пакетах рекомендуется определить scopeprefix для привязки репозитория к каждому пакету (возможна привязка только одго репозитория).
Источники[править]
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии[править]
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.