Отправили pull request в GitHub? Поздравляем, вы только что заразили тысячи разрабов самовоспроизводящимся червем

Отправили pull request в GitHub? Поздравляем, вы только что заразили тысячи разрабов самовоспроизводящимся червем

Как Shai-Hulud 2.0 поработил экосистему JavaScript за выходные.

image

Для команды PostHog, разрабатывающей аналитическую платформу с открытым исходным кодом, недавняя атака через npm стала самым серьёзным инцидентом за всё время. Источником проблемы оказалась вредоносная версия библиотеки Shai-Hulud 2.0: с её помощью злоумышленники встроили в популярные JavaScript SDK скрипт, который крал доступы разработчиков и автоматически распространял заражённые сборки дальше.

Под удар попали ключевые модули — posthog-node, posthog-js и posthog-react-native. В каждой из вредоносных версий скрывался preinstall-скрипт, запускавшийся сразу после установки. Он прогонял кодовую базу и настройки пользователя через утилиту TruffleHog, выискивая токены и ключи. Обнаруженные данные отправлялись в публичные GitHub-репозитории, созданные для слива информации. После этого атака продолжалась: украденные npm-токены использовались для публикации новых заражённых сборок, что ускоряло распространение червя.

Как сообщили в компании Wiz, одной из первых исследовавших инцидент, всего за трое суток вредонос получил доступ к секретам как минимум 25 000 разработчиков. Пострадали не только клиенты PostHog — заражённые зависимости затронули пакеты от Zapier, AsyncAPI, ENS Domains и Postman. Многие из них загружаются десятки тысяч раз в неделю, что сделало масштаб заражения колоссальным.

Shai-Hulud 2.0 вёл себя не как обычный троян, а как полноценный червь. Он не ограничивался кражей токенов GitHub или ключей от npm: вредоносные пакеты вытягивали переменные окружения, доступы к облачным платформам (AWS, GCP, Azure), а также конфиденциальную информацию из CI/CD-процессов и других частей внутренней инфраструктуры.

После обнаружения атаки команда PostHog отозвала все скомпрометированные ключи, удалила заражённые версии SDK и начала выкладывать безопасные релизы. Однако самым тревожным в этой истории оказалось то, как именно червь попал в систему: всё началось с обычного pull request'а в репозиторий. Из-за ошибки в настройках CI скрипт из ветки злоумышленника запустился с полным набором прав. В результате он получил доступ к токену одного из ботов, обладавшего правами записи по всей организации. С этого момента контроль над системой оказался в чужих руках.

Дальнейшее развивалось по цепной схеме. Используя похищенные данные, атакующий внедрил поддельный lint-скрипт, внешне похожий на инструмент проверки стиля. На деле он собирал все чувствительные переменные, включая токен публикации в npm. Именно с его помощью началась массовая рассылка вредоносных SDK.

В ответ PostHog объявила о внедрении новых мер безопасности. Компания отказывается от автоматических публикаций через CI и переходит на модель trusted publisher для npm. Кроме того, в сборочном процессе отключён запуск установочных скриптов, а любые изменения в workflow теперь проходят ручную проверку.

Этот случай снова показывает, насколько уязвимыми остаются даже крупные проекты с открытым кодом. Один незаметный PR, автоматический запуск пайплайна без защиты и избыточные права технического аккаунта — и вредонос получает всё необходимое, чтобы встроиться в цепочку поставок и начать красть данные у тысяч разработчиков.