Масштаб приличный... заражено более 800 пакетов, суммарно генерирующих свыше 2 миллиардов установок в месяц.
Всё началось со взлома GitHub-аккаунта разработчика библиотеки
keyv (у которой 127 млн скачиваний в неделю). Злоумышленник пропихнул вредоносный код прямо в main ветку и выпустил релиз. Зараженный пакет выглядит абсолютно чистым по контрольным суммам, но в его
package.json зашит хук: "preinstall": "node setup.mjs". Как только разраб или CI/CD-сервер делает
npm install, срабатывает этот хук. Он скачивает среду выполнения Bun, а через нее запускает вторую стадию - обфусцированный JS-файл на 728 КБ.Дальше начинается пылесос:
🟢Скрипт сканирует локалку и ворует токены npm, GitHub, токены Kubernetes и т.д. Он даже дергает метаданные облачных инстансов и читает ключи из памяти раннеров GitHub Actions.
🟢Награбленное добро шифруется RSA-ключом и коммитится в рандомные публичные репозитории на GitHub. Если гитхаб недоступен, адреса резервных C2-серверов берутся напрямую из... смарт-контракта в сети Ethereum 😮
🟢Получив npm-токены, вирус смотрит, к каким пакетам есть права на публикацию. Скачивает их, заражает тем же хуком, увеличивает версию (bump) и публикует от имени разраба обратно в
npmjs.org. Именно так эпидемия расползлась на сотни чужих библиотек.И самая лютая фича... вирус прописывается в автозагрузку (через
systemd или LaunchAgent) и каждую минуту проверяет, жив ли украденный им токен. Если разраб или безопасники отзывают скомпрометированный токен, сервер GitHub вернет ошибку 40x. Вирус увидит это, моментально скачает с C2-сервера команду возмездия, выполнит ее через eval и только потом удалится. Так что разумное ни в коем случае не отзывать токены сразу. Сначала нужно физически найти и убить процесс вируса на машине, иначе сработает скрипт кабздеца (уничтожение данных, саботаж, затирание следов).Типичный 🥸 Сисадмин