Метод основан на том, что многие компании используют в своих внутренних приложениях зависимости из репозиториев NPM, PyPI и RubyGems, а также внутренние зависимости, которые не распространяются публично и загружаются из собственных репозиториев компаний. Проблема в том, что пакетные менеджеры, такие как npm, pip и gem, пытаются загрузить внутренние зависимости компаний в том числе и из публичных репозиториев. Для атаки достаточно определить имена пакетов со внутренними зависимостями и создать собственные пакеты с такими же именами в публичных репозиториях NPM, PyPI и RubyGems.
Идея предложенного метода появилась после того, как исследователь случайно обратил внимание, что в публикуемом на 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 для привязки репозитория к каждому пакету (возможна привязка только одго репозитория).
Источник: http://www.opennet.ru/opennews/art.shtml?num=54566