Две атаки на npm за четыре дня: бэкдор в SDK Injective и инфостилер в пакете jscrambler

8 июля в @injectivelabs/sdk-ts под видом телеметрии залили кражу seed-фраз, 11 июля скомпрометировали пакет самого вендора безопасности jscrambler — с кроссплатформенным инфостилером, который выгребал облачные токены и ключи AI-ассистентов.

DB
DBG · по материалам Socket / The Hacker News
0

Вторая неделя июля выдалась для экосистемы npm скверной: два независимых supply-chain-инцидента за четыре дня, и во втором жертвой стал пакет компании, которая сама продаёт защиту JavaScript-кода.

8 июля. Атакующие, получив доступ к аккаунту доверенного разработчика, протолкнули коммит в репозиторий @injectivelabs/sdk-ts — TypeScript-SDK для блокчейна Injective. В версию 1.20.21 добавили код, замаскированный под безобидную телеметрию. На деле он вешал хуки на два ключевых входа деривации ключей — PrivateKey.fromMnemonic() и PrivateKey.fromHex() — и в момент создания или загрузки кошелька снимал сырые BIP-39 seed-фразы и приватные ключи, отправляя их на сервер атакующего. Вредоносная версия прожила около 49 минут, её успели скачать 310 раз, а разошлась она ещё в 17 пакетов области @injectivelabs, которые жёстко пинили SDK как зависимость — то есть задело и тех, кто библиотеку напрямую не ставил. Команда откатила коммит и выпустила чистую 1.20.23; в Injective заявили, что средства пользователей не пострадали.

11 июля. С украденными publish-креденшелами в npm залили сразу пять вредоносных версий пакета jscrambler — 8.14.0, 8.16.0, 8.17.0, 8.18.0 и 8.20.0 — плюс связанные плагины. Сначала полезная нагрузка запускалась через preinstall-хук, подтягивающий скрытые нативные бинарники. Затем атакующие перенесли вредоносный код в основные файлы пакета — прицельно, чтобы обойти сканеры, которые проверяют только install-скрипты. Нагрузка — кроссплатформенный инфостилер под разработчиков: креденшелы и seed-фразы крипто-кошельков, токены AWS, GCP и Azure, конфиги и API-ключи AI-ассистентов, данные браузеров, содержимое системных keyring. Собранное уходило на дроп-сервер обычным POST /upload с multipart-телом. Пакет качают примерно 15 800 раз в неделю; Socket засёк вредоносный релиз через шесть минут после публикации. Чистая версия — 8.22.0.

Общий знаменатель обоих случаев — не дыра в коде, а захват учётки мейнтейнера. Ни code review, ни статический анализ здесь не спасают: подписывается всё легитимными ключами, и пакет прилетает по обычному каналу обновлений.

Что делать. Первым делом — npm ls jscrambler и npm ls @injectivelabs/sdk-ts по всем репозиториям, включая транзитивные зависимости, и проверка lock-файлов на затронутые версии. Если хоть где-то они ставились — считайте машину и билд-агент скомпрометированными, а не «возможно затронутыми». Это означает ротацию всего, до чего дотягивался процесс: ключей AWS/GCP/Azure, npm-токенов, GitHub PAT и деплой-ключей, API-ключей AI-сервисов, содержимого .env. Крипто-кошельки, чьи seed-фразы могли оказаться в памяти, переводятся на новые адреса — ротацией ключа тут не отделаться. Дальше — посмотрите исходящий трафик билд-агентов за 8–12 июля: неожиданные POST-запросы наружу выдают факт эксфильтрации лучше любого сканера. И стратегически: --ignore-scripts в CI (а лучше сразу npm 12, где скрипты выключены по умолчанию), запрет плавающих версий в lock-файле и задержка перед принятием свежих релизов — 24–48 часов «карантина» в этих двух случаях спасли бы почти всех.

Комментарии

Две атаки на npm за четыре дня: бэкдор в SDK Injective и инфостилер в пакете jscrambler | DBG