Шестнадцатого июня 2026 года специалисты Microsoft Threat Intelligence обнаружили аномальную активность в реестре npm. В течение следующих суток выяснилось, что злоумышленники получили контроль над аккаунтом мейнтейнера ehindero, который имел права публикации в области @mastra. Используя этот доступ, атакующие опубликовали вредоносные версии более 140 пакетов, внедрив в них поддельную зависимость easy-day-js, имитирующую популярную библиотеку dayjs (более 57 миллионов загрузок в неделю). Microsoft Threat Intelligence немедленно уведомила команду безопасности npm. К настоящему моменту скомпрометированные пакеты удалены, а доступ злоумышленника к публикации в области @mastra аннулирован.
Описание
Атака затронула не только сами пакеты Mastra, но и любую инфраструктуру разработки, которая автоматически разрешала зависимости при выполнении npm install или npm update. Это создало угрозу для учётных данных, токенов, сборочных окружений (CI/CD) и целостности программного обеспечения, выпускаемого с использованием скомпрометированных компонентов. По оценке Microsoft, уязвимы оказались рабочие станции разработчиков и конвейеры непрерывной интеграции, где после публикации вредоносных версий была запущена установка зависимостей независимо от того, импортировался ли пакет непосредственно в код приложения.
Методика атаки включала несколько этапов. Сначала злоумышленники создали пакет-двойник easy-day-js, зарегистрировав его с использованием анонимного почтового сервиса Tutamail. Первая версия 1.11.21 была чистой: она содержала только легитимный код библиотеки dayjs без вредоносных функций. Это типичный приём - публикация приманки, не вызывающей подозрений. Через сутки, семнадцатого июня, вышла версия 1.11.22, в которую был добавлен сценарий postinstall, запускающий вредоносный код сразу после установки пакета. Затем, используя скомпрометированную учётную запись ehindero, злоумышленники опубликовали версии 140 пакетов Mastra, каждая из которых включала easy-day-js как обязательную зависимость в диапазоне ^1.11.21. Семантическое версионирование обеспечило разрешение именно на версию 1.11.22 с боевой нагрузкой.
Как показал анализ Microsoft, сценарий setup.cjs (размер 4572 байта) был защищён обфускацией JavaScript с использованием перетасованного массива закодированных строк и самодельного декодера Base64. После декодирования становилась видна пятишаговая последовательность действий. Сначала отключалась проверка сертификатов TLS с помощью установки переменной окружения NODE_TLS_REJECT_UNAUTHORIZED в ноль. Это обеспечивало возможность взаимодействия с командно-контрольной инфраструктурой (C2) без валидного сертификата. Затем во временную директорию записывались маркеры идентификации: путь к установленному пакету и имя easy-day-js, закодированное операцией XOR.
Далее скрипт обращался к C2 по адресу 23.254.164[.]92:8000 и загружал второй этап полезной нагрузки - кросс-платформенный клиент Node.js размером около 41 килобайта. Этот клиент, в отличие от одноразовых стилеров, устанавливал долгосрочное присутствие на скомпрометированном хосте. На операционных системах Windows, macOS и Linux применялись различные механизмы персистентности, маскирующиеся под компоненты Node Version Manager (NVM). Например, на Windows в реестр добавлялся ключ автозапуска, запускающий скрытый процесс PowerShell, который, в свою очередь, вызывал Node.js с сохранённым скриптом. На macOS использовался демон LaunchAgent, на Linux - systemd-юнит. Все имена файлов (NvmProtocal, com.nvm.protocal, nvmconf.service) были намеренно подобраны так, чтобы не выделяться на фоне легитимных компонентов в среде разработчика.
После закрепления в системе клиент выполнял сбор данных. Он перечислял установленные расширения браузеров (Chrome, Edge, Brave), сверяя их со списком из 166 идентификаторов криптовалютных кошельков, включая MetaMask, Phantom, Coinbase Wallet, Binance Wallet, TronLink и другие. Затем копировалась и анализировалась база данных истории посещений из профилей браузеров. Дополнительно собирались сведения об установленных приложениях, имени хоста, архитектуре, платформе и выполняющихся процессах. Собранная информация отправлялась на C2 через протокол HTTPS с ложным User-Agent Internet Explorer 8.
На платформе Windows атака дополнительно включала рефлексивную загрузку .NET-сборки в память без записи на диск. PowerShell-скрипт загружал DLL напрямую в память и вызывал её метод, запускающий второй этап, который внедрял код в процесс cmd.exe. Вся цепочка оставалась бесфайловой, что существенно затрудняет обнаружение традиционными антивирусными средствами.
По данным Microsoft Defender, активность включала попытки связи с C2, отключение проверки TLS, а также выполнение подозрительных Node.js-скриптов. Разработчикам и администраторам CI/CD рекомендуется проверить, устанавливались ли версии пакетов Mastra между 17 июня 01:01 и 17 июня 01:28 UTC, и при необходимости отозвать скомпрометированные токены и учётные данные. Инцидент демонстрирует рост sophistication атак на цепочки поставок, где атакующие используют автоматические механизмы обновления зависимостей для массового распространения вредоносного кода, маскируя его под легитимные компоненты разработки.