
Что произошло
В начале декабря 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 и аттестаций происхождения и опубликовал разбор с рекомендациями по доверенной публикации.
Уроки для бизнеса
- Ревью исходного кода не гарантирует чистоту собранного пакета
- После инцидента нужно отзывать все токены публикации, а не только очевидно затронутые
- Популярные AI-библиотеки — привлекательная цель из-за доступа к GPU и большой базы установок
- Аттестации происхождения пакетов помогают быстро установить, что и как было опубликовано
Меры, которые предотвратили бы инцидент
- Аудит рабочих процессов GitHub Actions на подстановку непроверенных данных из pull request
- Доверенная публикация через OIDC вместо долгоживущих API-токенов
- Проверка аттестаций происхождения и фиксация версий AI-библиотек
- Мониторинг аномальной загрузки CPU и GPU и исходящих соединений на серверах обучения и инференса