npm-атака на разработчиков DeFi: тайпсквоттинг и стиллер
Недавний анализ раскрыл хорошо скоординированную атаку на разработчиков децентрализованных финансов (DeFi), реализованную через популярный менеджер пакетов npm. Злоумышленники действовали тонко, эксплуатируя банальные опечатки при вводе названий библиотек. Целью кампании была кража закрытых ключей, секретов окружения и данных криптовалютных кошельков.
Масштаб и способ проникновения
Десять скомпрометированных аккаунтов мейнтейнеров npm опубликовали около тридцати вредоносных пакетов. Они маскировались под легитимные инструменты для работы с Polymarket и популярные математические библиотеки, используемые в DeFi-протоколах. Основным вектором стал typosquatting: жертвами оказывались разработчики, случайно допускавшие опечатку при установке пакета через npm install.
Вредоносные репозитории предлагали, на первый взгляд, полезный TypeScript bot для высокоточного прогнозирования криптособытий. Чтобы начать работу, пользователю предлагалось прописать свой POLYMARKET_PRIVATE_KEY в файле .env. Сразу после выполнения команды npm install ключ оказывался в руках атакующих — в дело вступал stealer, способный извлекать конфиденциальные данные.
Арсенал stealer’а и охват данных
Ядро вредоносной нагрузки представляло собой JavaScript-код объёмом от 2787 до 2887 строк. Его функциональность была направлена на массовый сбор:
- хранилищ криптовалютных кошельков, включая MetaMask, TrustWallet и ряд других платформ;
- учётных данных браузеров (Chrome, Firefox);
- секретов разработчика и API-токенов, найденных в файловой системе по заданным шаблонам.
Stealer сканировал директории жертвы, применяя регулярные выражения для вычленения и эксфильтрации private keys и токенов авторизации.
Четыре техники доставки вредоносного кода
Кампания выделялась гибкостью методов распространения, что затрудняло детектирование. Специалисты зафиксировали четыре ключевых способа, которыми stealer попадал в среду разработчика.
1. Dropper через postinstall script. Наиболее примечательный метод, при котором скрипт, запускаемый после установки пакета, динамически извлекал command-and-control (C2) URL напрямую из поля homepage файла package.json. Таким образом, реальное назначение пакета маскировалось, а адрес управляющего сервера не светился в коде в явном виде.
2. Прямая вставка stealer’а. Вредоносный код без дополнительных ухищрений инжектировался непосредственно в тело публикуемого пакета.
3. Transitive dependency. Stealer включался как транзитивная зависимость, которая автоматически исполнялась в момент импорта. Этот подход обходил защитные меры, игнорирующие выполнение postinstall-скриптов.
4. Механизм самовосстановления. Изначально пакет публиковался в «чистой» версии, что позволяло пройти первичные автоматические проверки. Однако сразу после установки он загружал уже скомпрометированное обновление, делая традиционное сканирование репозитория неэффективным.
Риски для экосистемы
Стратегический подход злоумышленников означал, что любая случайная установка подставного пакета могла привести к полной компрометации учётных данных разработчика. Учитывая широкое использование математических DeFi-библиотек и интерес к предсказательным рынкам, круг потенциальных жертв оказался чрезвычайно широк. Инцидент в очередной раз напоминает о критической важности проверки имён пакетов и использовании строгих политик безопасности в CI/CD-пайплайнах.
Отчет получен из сервиса CTT Report Hub. Права на отчет принадлежат его владельцу.
Ознакомиться подробнее с отчетом можно по ссылке.



