Очередная атака на цепочку поставок задела популярный Python-фреймворк Lightning (более известный как PyTorch Lightning) — высокоуровневую надстройку над PyTorch с более чем 31 100 звёзд на GitHub. 30 апреля 2026 года злоумышленники опубликовали в PyPI две вредоносные версии пакета — 2.6.2 и 2.6.3, — через которые пытались похищать учётные данные разработчиков. О компрометации сообщили сразу несколько компаний: Aikido Security, OX Security, Socket и StepSecurity.
По оценке исследователей, атака — продолжение кампании Mini Shai-Hulud, той же, что накануне, в среду, затронула SAP-пакеты в npm. Администраторы PyPI оперативно поместили проект Lightning в карантин.
Как работал вредонос
Внутри заражённого пакета скрывался каталог _runtime с загрузчиком и обфусцированной полезной нагрузкой на JavaScript. Как отметили в Socket, цепочка запускалась автоматически при импорте модуля lightning — никаких дополнительных действий пользователя не требовалось.
Схема атаки: скрипт start.py скачивал и запускал JavaScript-рантайм Bun, а тот, в свою очередь, исполнял 11-мегабайтный обфусцированный файл router_runtime.js, отвечающий за комплексную кражу учётных данных. Полученные GitHub-токены проверялись через api.github[.]com/user, после чего использовались для внедрения червеобразной полезной нагрузки — вредонос дописывал коммиты в до 50 веток из каждого репозитория, куда у токена был доступ на запись.
«Операция работает как upsert: создаёт несуществующие файлы и молча перезаписывает существующие, без предварительной проверки содержимого», — пояснили в Socket. Каждый заражённый коммит подписывался фиктивной личностью, имитирующей Anthropic Claude Code.
Отдельно вредонос умел распространяться через npm: постинсталляционный хук в package.json запускал полезную нагрузку, увеличивал номер патч-версии и пересобирал .tgz-архивы. Если разработчик по незнанию публиковал такой изменённый пакет из локального окружения, заражённая версия попадала в npm и дальше — к пользователям ниже по цепочке.
Мейнтейнеры проекта подтвердили инцидент и начали расследование. На момент публикации точная причина компрометации была неясна, но всё указывало на взлом GitHub-аккаунта проекта. В отдельном advisory команда Lightning уточнила, что затронутые версии содержали функциональность, характерную для механизма сбора учётных данных.
Кто стоит за атакой
Инцидент связывают с группировкой TeamPCP, за которой уже числится длинный список подобных компрометаций. После блокировки аккаунта в X за нарушение правил площадки группа запустила собственный сайт в даркнете. Там же TeamPCP назвала LAPSUS$ «хорошим партнёром, активно вовлечённым во всю эту операцию» и заявила, что никогда не использовала шифровальщик VECT, а владеет собственным инструментом CipherForce — это заявление прозвучало на фоне отчёта Check Point Research об уязвимостях в шифровании упомянутого вымогательского ПО.
Второй фронт: intercom-client и Packagist
Параллельно в рамках той же кампании Mini Shai-Hulud была скомпрометирована версия 7.0.4 пакета intercom-client — по схожему сценарию с SAP-пакетами, через preinstall-хук. Выяснилось, что был взломан аккаунт GitHub-пользователя «nhur», а вредоносный пакет опубликован через уже удалённую ветку, запустившую автоматический CI-воркфлоу публикации.
Кампания добралась и до Packagist: пакет intercom/intercom-php версии 5.0.2 получил аналогичный механизм кражи данных, адаптированный под экосистему PHP. Через плагин Composer вредонос скачивал Bun с помощью скрипта setup-intercom.sh, срабатывающего при установке или обновлении (хуки post-install-cmd и post-update-cmd), и запускал тот же обфусцированный router_runtime.js.
Вредонос охотится за токенами GitHub и npm, SSH-ключами, облачными учётными данными, секретами Kubernetes, Vault, Docker, файлами .env и другими секретами разработки и CI/CD. Похищенные данные шифруются и отправляются на сервер zero.masscan.cloud:443/v1/telemetry; если это не удаётся, срабатывает резервный канал — эксфильтрация через GitHub с созданием публичного репозитория с описанием «A Mini Shai-Hulud has Appeared». Для распространения вредонос использует найденные npm-токены, переупаковывая заражённые пакеты, а также записывает свои файлы по путям вроде .claude/settings.json и .vscode/tasks.json.
По данным Intercom, корень проблемы — локальная установка пакета pyannote-audio, который подтянул скомпрометированный Lightning как транзитивную зависимость. Это подтверждает: новые заражения — не отдельные атаки, а последствия предыдущих волн TeamPCP. «Одна скомпрометированная зависимость способна стать мостом в другие экосистемы пакетов», — отметили в Socket, добавив, что «после двух недель практически непрерывных атак темп выглядит не случайным, а спланированным и устойчивым».
Развязка и что делать
Карантин с пакета Lightning уже сняли, вредоносные версии 2.6.2 и 2.6.3 удалены из PyPI, актуальная безопасная версия — 2.6.1. По уточнению мейнтейнеров, заражённые релизы находились в PyPI всего 42 минуты до карантина, и нет доказательств, что был скомпрометирован сам исходный репозиторий на GitHub. «Злоумышленник получил доступ к нашему каналу публикации в PyPI, склонировал открытый код, внедрил вредоносную нагрузку и напрямую опубликовал изменённые сборки в PyPI как версии 2.6.2 и 2.6.3, полностью в обход системы контроля версий», — сообщили в команде проекта. Любой, кто выполнял pip install или обновление до этих версий, получал сборку атакующего, а не оригинальную.
Разработчикам, использующим Lightning или intercom-client/intercom-php, рекомендуется заблокировать поражённые версии (2.6.2, 2.6.3 для Lightning и 7.0.4 для intercom-client), удалить их, если они уже установлены, откатиться на последнюю чистую версию (2.6.1 для Lightning) и в обязательном порядке ротировать все учётные данные, которые могли быть скомпрометированы в затронутых окружениях.
Источник: The Hacker News.