Шестнадцатого июня 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 атак на цепочки поставок, где атакующие используют автоматические механизмы обновления зависимостей для массового распространения вредоносного кода, маскируя его под легитимные компоненты разработки.
Индикаторы компрометации
IPv4
- 23.254.164.123
- 23.254.164.92
IPv4 Port Combinations
- 23.254.164.92:8000
URLs
- https://23.254.164.92:8000/update/49890878
SHA256
- 221c45a790dec2a296af57969e1165a16f8f49733aeab64c0bbd768d9943badf
- 4a8860240e4231c3a74c81949be655a28e096a7d72f38fbe84e5b37636b98417
- ae70dd4f6bc0d1c8c2848e4e6b51934626c4818dcb5af99d080ddbd7dc337185
- b122a9873bedf145ae2a7fd024b5f309007dbb025149f4dc4ac3f7e4f32a36a4
- b73de25c053c3225a077738a1fcbd9ca6966d7b3cd6f5494a30f0aa0eae55c7e
npm package
- easy-day-js
npm account
- sergey2016