Распространённый пакет Python lightning оказался вредоносным: заражённые версии похищают учётные данные и атакуют цепочки поставок

information security

Популярный пакет lightning, предназначенный для построения и обучения моделей машинного обучения и скачиваемый примерно восемь миллионов раз в месяц, стал источником серьёзной угрозы. Две его версии - 2.6.2 и 2.6.3 - оказались вредоносными. Они уже удалены из репозитория PyPI, но все организации и разработчики, успевшие установить эти выпуски, потенциально скомпрометированы. Злоумышленники встроили в код механизм, который при каждом импорте lightning незаметно запускает фоновый процесс, загружающий альтернативную среду выполнения JavaScript под названием Bun и выполняющий объёмную полезную нагрузку. Атака относится к кампании Shai-Hulud, которая ранее уже использовала аналогичные техники.

Описание

Интерес злоумышленников к пакету lightning не случаен. Библиотеку применяют как небольшие стартапы, так и крупные корпорации, активно внедряющие искусственный интеллект. Установка заражённой версии означала, что вредоносное действие запускалось автоматически при любом обращении к пакету - в тренировочном скрипте, в программе на Jupyter Notebook или в процессе непрерывной интеграции. Пользователь не видел никаких признаков работы постороннего кода, так как весь вывод был направлен в пустоту.

Специалисты компании Endor Labs обнаружили аномалии вскоре после публикации версий. В 12:45 UTC 30 апреля 2026 года появилась версия 2.6.2, через пять минут её уже пометили как вредоносную. Почти сразу вышла версия 2.6.3 - она была заблокирована в течение десяти минут. Оба релиза оперативно карантинировали, но даже этот короткий промежуток мог оставить следы во множестве сред.

Технический анализ показал продуманную цепочку атак. Как только разработчик выполнял команду import lightning, срабатывал скрытый обработчик. Файл __init__.py пакета запускал фоновый поток, который порождал отдельный дочерний процесс start.py. Этот процесс был полностью отвязан от родительской программы: его стандартный вывод и поток ошибок перенаправлялись в /dev/null, а сам поток завершался мгновенно. Таким образом, даже если основная программа заканчивала работу быстро, вредоносный код продолжал действовать без следа.

Второй этап - загрузка среды исполнения Bun. Скрипт проверял, установлен ли уже Bun в системе или в локальной папке .bun. Если нет, он скачивал архив версии 1.3.13 с официального репозитория GitHub, извлекал только бинарный файл и запускал его. В версии 2.6.3 разработчики вредоноса полностью отключили все информационные сообщения - ни пользователь, ни системные журналы не получали никаких уведомлений о происходящем.

Третий этап - выполнение полезной нагрузки размером 11,4 мегабайта. Это сильно запутанный JavaScript-файл router_runtime.js. После декомпиляции выяснилось, что это большая связка легитимных библиотек (AWS SDK, Octokit, Azure Identity, клиенты Google Cloud) и собственного вредоносного кода объёмом около 33 тысяч строк. Именно в этой части реализованы основные вредоносные возможности.

Первая - кража учётных данных. Вредонос считывает десятки системных файлов: настройки AWS, SSH-ключи, конфигурации Docker, kubectl, npmrc, переменные окружения. На компьютерах с macOS дополнительно проверяются браузерные хранилища и файлы VS Code. Для извлечения токенов GitHub и npm используются регулярные выражения. Также выполняется скрипт, который напрямую читает память процесса раннера GitHub Actions, обходя механизм маскировки секретов.

Вторая - самораспространение в экосистеме npm. Если вредонос находит npm-токен с правами на публикацию, он скачивает последнюю версию каждого доступного пакета, внедряет в неё свою полезную нагрузку, увеличивает номер патча на единицу и публикует заражённую версию под видом легитимного обновления. Этот приём позволяет быстро подорвать доверие к другим пакетам. Кроме того, атака использует OIDC-токены в среде GitHub Actions для получения разрешений на публикацию без кражи учётных данных.

Третья - отравление репозиториев GitHub. Злоумышленники размещают копию вредоноса, конфигурационный файл и загрузчик в папки .claude и .vscode на всех ветках репозитория, кроме защищённых. Это создаёт точки закрепления: при следующем запуске рабочей среды VS Code или агента Claude опасный код выполняется автоматически.

Четвёртая - сбор секретов из облачных хранилищ. Вредонос перебирает 17 регионов AWS, извлекает значения Secrets Manager и параметры SSM с дешифровкой. Аналогичные операции выполняются для Azure Key Vault и Google Cloud Secret Manager. Все собранные данные шифруются открытым ключом злоумышленников и отправляются на управляющий сервер. Если домен недоступен, вредонос ищет новый адрес в подписях коммитов GitHub - так реализована ротация командных серверов без обновления кода.

Кампания Shai-Hulud уже известна использованием среды Bun вместо Node.js, чтобы обходить инструменты безопасности, ориентированные на стандартные окружения. В этот раз авторы вредоноса также применили проверку локали: если системные переменные указывают на русскоязычную среду, код немедленно завершает работу, не оставляя следов.

Разработчикам, которые могли установить одну из опасных версий, следует немедленно очистить кэш pip, удалить пакет и откатиться на чистую версию 2.6.1. При этом нужно исходить из того, что все учётные данные (токены npm, PyPI, GitHub, облачных провайдеров) могли быть скомпрометированы. Требуется сменить их, проверить репозитории на несанкционированные коммиты и проанализировать сетевые соединения из процессов, импортировавших lightning. Ситуация остаётся тревожной: в экосистеме npm уже выявлены новые реплики, и расследование продолжается.

Индикаторы компрометации

Domains

  • zero.masscan.cloud

SHA256

  • 5f5852b5f604369945118937b058e49064612ac69826e0adadca39a357dfb5b1
  • 8046a11187c135da6959862ff3846e99ad15462d2ec8a2f77a30ad53ebd5dcf2
  • d2815d425ae08cc627f1db69009442165f8bbc64b7e9157e2ff9d7aab02094d4
Комментарии: 0