Атака на инфраструктуру PyTorch, компрометирующая репозиторий и релизы

Раскрыты детали атаки на инфраструктуру, используемую при разработке фреймворка машинного обучения PyTorch, позволившую извлечь ключи доступа, достаточные для размещения произвольных данных в репозитории с релизами проекта в GitHub и AWS, а также для подстановки кода в основную ветку репозитория и добавления бэкдора через зависимости. Подмена релизов PyTorch могла использоваться для осуществления атаки на крупные компании, такие как Google, Meta, Boeing и Lockheed Martin, использующие PyTorch в своих проектах. В рамках программы Bug Bounty компания Meta выплатила исследователям $16250 за информацию о проблеме.

Суть атаки в возможности выполнения своего кода на серверах непрерывной интеграции, выполняющих пересборку и выполнение заданий для тестирования новых изменений, отправляемых в репозиторий. Проблема затрагивает проекты, которые используют собственные внешние обработчики
“Self-Hosted Runner” с GitHub Actions. В отличие от традиционных GitHub Actions обработчики Self-Hosted выполняются не в инфраструктуре GitHub, а на своих серверах или в виртуальных машинах, поддерживаемых разработчиками.

Выполнение сборочных заданий на своих серверах позволяет организовать запуск кода, который может осуществить сканирование внутренней сети предприятия, поиск в локальной ФС ключей шифрования и токенов доступа, анализ переменных окружения с параметрами обращения к внешним хранилищам или облачным сервисам. При отсутствии должной изоляции сборочного окружения найденные конфиденциальные данные могут быть отправлены атакующим вовне, например, через обращение к внешним API. Для определения применения проектами “Self-Hosted Runner” может использоваться инструментарий Gato, анализирующий общедоступные workflow-файлы и логи запуска CI-заданий.

В PyTorch и многих других проектах, использующих “Self-Hosted Runner”, запуск сборочных заданий разрешён только разработчикам, изменения которых ранее проходили рецензирование и включались в кодовую базу проекта. Наличие статуса “contributor” при использовании в репозитории настроек по умолчанию даёт возможность запускать обработчики GitHub Actions при передаче pull-запросов и, соответственно, выполнять свой код в любом окружении GitHub Actions Runner, привязанном к репозиторию или курирующей проект организации.

Привязку к статусу “contributor” оказалось легко обойти – достаточно предварительно отправить незначительное изменение и дождаться его принятия в кодовую базу, после чего разработчик автоматически получал статус активного участника, pull-запросы которого разрешено тестировать в CI-инфраструктуре без отдельной проверки. Для получения статуса активного разработчика в ходе эксперимента использовались незначительные косметические изменения, связанные с устранением опечаток в документации. Для получения доступа к репозиторию и хранилищу релизов PyTorch в ходе атаки при выполнении
кода в “Self-Hosted Runner” был осуществлён перехват токена GitHub, применявшегося для доступа к репозиторию из сборочных процессов, а также ключей AWS, задействованных для сохранения результатов сборки.

Проблема не специфична для PyTorch и затрагивает многие другие крупные проекты, которые используют настройки по умолчанию для “Self-Hosted Runner” в GitHub Actions. Например, упомянуто осуществление похожих атак для подстановки бэкдора в некоторые крупные кошельки криптовалют и блокчейн-проекты с миллиардной капитализацией, внесения изменений в релизы Microsoft Deepspeed и TensorFlow, компрометации одного из приложений компании CloudFlare, а также выполнения кода на компьютере в сети Microsoft. Детали по данным инцидентам пока не раскрываются. В рамках действующих программ Bug Bounty исследователи отправили более 20 заявок для получения вознаграждений на сумму несколько сотен тысяч долларов.

Release. Ссылка here.