Массовая атака на цепочку поставок npm, затронувшая более 140 пакетов в пространствах имён mastra и @mastra, привлекла внимание исследователей Microsoft Threat Intelligence. Компания с высокой степенью уверенности связывает этот инцидент с северокорейским государственным актором Sapphire Sleet, который ранее специализировался на атаках на финансовый сектор и криптовалютные организации. Злоумышленники получили контроль над учётной записью одного из мейнтейнеров (ehindero) и использовали её для публикации скомпрометированных версий, внедрив в каждую из них вредоносную зависимость easy-day-js - подделку под популярную библиотеку dayjs (более 57 миллионов загрузок в неделю).
Описание
Как указано в отчёте Microsoft, компрометация началась с захвата npm-учётной записи ehindero, обладавшей правами публикации во всём пространстве @mastra. Злоумышленник создал пакет-двойник easy-day-js, указав при этом поддельное имя автора (iamkun), совпадающее с именем настоящего разработчика dayjs. Первая версия easy-day-js@1.11.21 была опубликована 16 июня 2026 года в 07:05 UTC и не содержала вредоносной нагрузки - это был чистый bait-образ, предназначенный для обхода автоматических проверок. Уже на следующий день, 17 июня в 01:01 UTC, вышла версия 1.11.22 с добавленным postinstall-скриптом, запускавшим обфусцированный файл setup.cjs. Через 19 минут, в 01:20 UTC, скомпрометированный аккаунт начал массовую публикацию обновлённых версий Mastra-пакетов, каждая из которых содержала зависимость easy-day-js в диапазоне SemVer ^1.11.21, что при установке приводило к загрузке именно версии 1.11.22.
Postinstall-скрипт автоматически выполнялся при каждом запуске npm install или npm update, независимо от того, был ли пакет импортирован в код приложения. Это означало, что любая рабочая станция разработчика или среда CI/CD, выполнявшая установку зависимостей в период атаки, оказывалась под ударом. Скрипт отключал проверку сертификатов TLS (устанавливая переменную NODE_TLS_REJECT_UNAUTHORIZED в '0'), создавал два маркерных файла во временной директории (.pkg_history и .pkg_logs с именем пакета, закодированным XOR 0x80), после чего отправлял GET-запрос на сервер управления (C2) с IP-адресом 23.254.164[.]92:8000 и загружал полезную нагрузку второго этапа размером около 41 КБ.
Загруженный агент представлял собой кросс-платформенный клиент Node.js, способный выполнять команды, полученные от C2. Он устанавливал механизмы закрепления (persistence) для всех трёх основных операционных систем: на Windows - запись в реестр (HKCU\CurrentVersion\Run) с запуском скрытого PowerShell, который вызывал Node.js; на macOS - LaunchAgent с файлом com.nvm.protocal.plist; на Linux - systemd-юнит nvmconf.service. Все три варианта имитировали легитимные установки Node.js, используя имена вроде NvmProtocal и каталоги NodePackages. На системах Windows агент дополнительно проводил разведку: перечислял установленные приложения через реестр, меню "Пуск" и UWP-пакеты, а также выполнял рефлексивную загрузку .NET-сборки в память без записи на диск. Эта сборка могла быть внедрена в процесс cmd.exe для получения интерактивного доступа.
После первоначального сбора данных агент выполнял эксфильтрацию информации, включавшей список установленных расширений криптовалютных кошельков (MetaMask, Phantom, Coinbase Wallet и ещё 162 других), историю браузера из SQLite-баз Chrome, Edge и Brave, а также сведения о хосте (имя, архитектура, ОС, запущенные процессы). Все запросы маскировались под устаревший User-Agent Internet Explorer 8. Для особо ценных целей операторы Sapphire Sleet через shell runner агента доставляли отдельный PowerShell-бэкдор, загружаемый с домена teams[.]onweblive[.]org. Этот бэкдор сразу очищал историю команд PowerShell и начинал 10-секундный цикл опроса C2, передавая подробные данные о системе (установленные антивирусы, список приложений, расширения браузеров). Затем он создавал скрытый пакетный файл C:\ProgramData\system.bat и ключ реестра MicrosoftUpdate для автозапуска, который при каждом входе в систему повторно скачивал тело бэкдора с сервера - это позволяло менять вредоносный код без изменения записи в реестре.
Финальным этапом эскалации привилегий становилась установка службы scdev, работающей в контексте SYSTEM. Злоумышленник регистрировал в реестре путь к DLL C:\windows\system32\scdev.dll, которая загружалась при старте Windows через общий процесс svchost.exe. Это обеспечивало постоянный, не зависящий от входа пользователя доступ с наивысшими правами. Microsoft отметила, что все наблюдаемые техники (PowerShell-бэкдор, инфраструктура C2, сходство с предыдущими кампаниями) полностью соответствуют шаблонам Sapphire Sleet.
Для защиты от данной атаки Microsoft рекомендует проверить файлы package-lock.json и node_modules на наличие easy-day-js и скомпрометированных версий пакетов @mastra (версия 1.13.0 и более ранние не затронуты). Желательно фиксировать версии зависимостей и использовать флаг --ignore-scripts при установке npm для предотвращения выполнения postinstall-скриптов. Следует искать маркерные файлы .pkg_history и .pkg_logs во временных папках, а также неожиданные .js-файлы в домашних и временных каталогах. Все учётные данные, токены и ключи API, которые могли присутствовать на инфицированных системах, необходимо сменить. Сетевые периметры нужно блокировать IP-адреса C2 (23.254.164[.]92 и 23.254.164[.]123), а логи CI/CD проверить на подозрительные исходящие соединения.
Sapphire Sleet - это группировка, действующая с 2020 года и ориентированная на кражу криптовалютных кошельков и интеллектуальной собственности, связанной с блокчейн-технологиями. Атаки часто инициируются через социальные сети (LinkedIn), фишинговые ссылки на поддельные страницы банков и ложные приглашения на видеоконференции. Используя компрометацию цепочки поставок npm, злоумышленники получили прямой доступ к тысячам сред разработки и инфраструктурных конвейеров, что делает этот инцидент одним из крупнейших случаев заражения через реестр открытых пакетов за последние годы.
Индикаторы компрометации
IPv4
- 23.254.164.123
- 23.254.164.92
Domains
- maskasd.com
- teams.onweblive.org
URLs
- https://23.254.164.92:8000/update/49890878
- https://maskasd.com/8555575039
- https://teams.onweblive.org/api/update/8555575039/4
SHA256
- 1d1bf5e8c1539d2f05b1429235b8f4990f87036774be95157b315a7803dd5526
- 221c45a790dec2a296af57969e1165a16f8f49733aeab64c0bbd768d9943badf
- 4a8860240e4231c3a74c81949be655a28e096a7d72f38fbe84e5b37636b98417
- 50eae63d3e24be9ca8803f4b5a0408aef97ee3fab7af018d8c2dde7c359edd65
- ae70dd4f6bc0d1c8c2848e4e6b51934626c4818dcb5af99d080ddbd7dc337185
- b122a9873bedf145ae2a7fd024b5f309007dbb025149f4dc4ac3f7e4f32a36a4
- b73de25c053c3225a077738a1fcbd9ca6966d7b3cd6f5494a30f0aa0eae55c7e