Цепочка поставки · декабрь 2024

Компрометация библиотеки компьютерного зрения Ultralytics на PyPI

Злоумышленник через уязвимость в рабочем процессе GitHub Actions встроил криптомайнер в релизы популярной AI-библиотеки Ultralytics, опубликованные на PyPI. Вредоносный код отсутствовал в исходном репозитории и попал только в собранный пакет. После первого исправления последовала вторая волна через неотозванный токен PyPI.

Иллюстрация к инциденту «Компрометация библиотеки компьютерного зрения Ultralytics на PyPI»
ЗатронутоПользователи Python-пакета ultralytics (модели YOLO) версий 8.3.41, 8.3.42, 8.3.45 и 8.3.46, включая зависимые проекты ComfyUI и SwarmUI
КритичностьВысокий
Датадекабрь 2024

Что произошло

В начале декабря 2024 года на PyPI появились версии 8.3.41 и 8.3.42 библиотеки ultralytics, содержащие майнер XMRig. По данным BleepingComputer, пакет скачивали более 260 тыс. раз в сутки, а зависимые проекты ComfyUI и SwarmUI подтвердили, что свежие установки могли получить майнер. Атакующий открыл pull request с ветками, в названия которых была встроена команда, и рабочий процесс GitHub Actions выполнил её при обработке. Затем был отравлен кэш GitHub Actions, используемый при сборке. 7 декабря вышли ещё две вредоносные версии, 8.3.45 и 8.3.46, опубликованные с помощью неотозванного API-токена PyPI.

Где нарушилась защита

Граница доверия нарушилась в конвейере сборки: данные из pull request внешнего участника, в частности имя ветки, без проверки подставлялись в команды рабочего процесса. Это позволило изменить собираемый пакет, при этом код в репозитории оставался чистым, и ревью исходников не выявило бы проблему. Неполная ротация секретов после первого инцидента дала атакующему повторный доступ к публикации.

Последствия

  • Четыре вредоносные версии популярной AI-библиотеки были опубликованы на PyPI
  • На машинах пользователей запускался криптомайнер, расходующий вычислительные ресурсы
  • Под угрозой оказались зависимые проекты, в том числе ComfyUI и SwarmUI

Реакция

Вредоносные версии удалены с PyPI, Ultralytics выпустила чистые релизы. PyPI провёл расследование с использованием журналов прозрачности Sigstore и аттестаций происхождения и опубликовал разбор с рекомендациями по доверенной публикации.

Уроки для бизнеса

  1. Ревью исходного кода не гарантирует чистоту собранного пакета
  2. После инцидента нужно отзывать все токены публикации, а не только очевидно затронутые
  3. Популярные AI-библиотеки — привлекательная цель из-за доступа к GPU и большой базы установок
  4. Аттестации происхождения пакетов помогают быстро установить, что и как было опубликовано

Меры, которые предотвратили бы инцидент

  • Аудит рабочих процессов GitHub Actions на подстановку непроверенных данных из pull request
  • Доверенная публикация через OIDC вместо долгоживущих API-токенов
  • Проверка аттестаций происхождения и фиксация версий AI-библиотек
  • Мониторинг аномальной загрузки CPU и GPU и исходящих соединений на серверах обучения и инференса
Проверка фактов

Первоисточники

The Python Package Index Blog · 2024-12-11Supply-chain attack analysis: UltralyticsBleepingComputer · 2024-12-06Ultralytics AI model hijacked to infect thousands with cryptominerWiz · 2024-12Ultralytics AI Library Hacked via GitHub for Cryptomining