Mastra — популярний фреймворк на JavaScript і TypeScript для створення застосунків та агентів зі штучним інтелектом. Сукупна кількість завантажень уражених пакетів перевищувала 1,1 млн на тиждень . 19 червня Microsoft із високою впевненістю заявила, що за операцією стоїть саме Sapphire Sleet .
Сценарій виявився небезпечно простим: компрометація одного довіреного облікового запису відкрила доступ до цілого набору пакетів.
Спочатку нападники обманом отримали облікові дані легітимного мейнтейнера Mastra. Його npm-акаунт, ідентифікований як ehindero, мав права на публікацію пакетів у всьому просторі @mastra .
Використовуючи захоплений акаунт, зловмисники перепублікували пакети з простору @mastra/* упродовж 88-хвилинного вікна. Окремі звіти вказують, що основний сплеск публікацій тривав лише близько 19 хвилин . Така швидкість свідчить про автоматизований скрипт, а не ручне завантаження пакетів.
До кожної скомпрометованої версії додали залежність easy-day-js. Це typosquat — назва, навмисно схожа на легітимну популярну бібліотеку для роботи з датами dayjs . Дослідники назвали кампанію на честь цієї шкідливої залежності — easy-day-js .
Шкідливе навантаження використовувало npm-скрипт postinstall. Тому достатньо було виконати npm install для ураженого пакета: код запускався автоматично, навіть якщо розробник ще не запускав сам застосунок .
Після запуску шкідливий код шукав на робочих станціях розробників і в системах збирання:
Також навантаження вимикало перевірку TLS і завантажувало викрадач даних другого етапу з інфраструктури, контрольованої нападниками .
19 червня Microsoft із високою впевненістю приписала операцію групі Sapphire Sleet — державному угрупованню з Північної Кореї, яке переважно атакує фінансовий і криптовалютний сектори . Компанія послалася на інфраструктуру та тактики, методи й процедури (TTP), що відповідають раніше задокументованим операціям цієї групи.
Amazon Threat Intelligence також пов’язала Sapphire Sleet із попередніми атаками на npm-пакети, серед яких були axios, debug, chalk і typo-crypto .
Атака на Mastra стала ще одним аргументом на користь відмови від довгоживучих ключів публікації. Microsoft оголосила про два ключові кроки для NuGet.org — реєстру пакетів для .NET — і паралельно рекомендує безпечніші підходи для всього екосистемного ланцюга.
Починаючи з 17 серпня 2026 року, максимальний термін дії нових API-ключів NuGet.org скорочується з 365 до 30 днів . Усі ключі, створені до цієї дати, Microsoft примусово деактивує 1 листопада 2026 року .
Причина — ризик викрадення довгоживучих ключів. Як пояснює Microsoft, це фактично «рядки символів, які легко загубити». Якщо такий ключ потрапляє до рук нападника, він може тривалий час публікувати троянізовані версії пакетів від імені довіреного проєкту .
Microsoft рекомендує мейнтейнерам переходити на Trusted Publishing — процес публікації, запущений у вересні 2025 року. Він використовує OpenID Connect (OIDC) і не потребує зберігати довгоживучі API-ключі в репозиторіях або CI/CD-системах .
Переваги підходу:
Під час запуску CI/CD-процесу, наприклад у GitHub Actions, він отримує криптографічно підписаний OIDC-токен. NuGet.org перевіряє його відповідність заздалегідь зареєстрованій політиці видавця, а потім створює тимчасовий одноразовий API-ключ, чинний лише для цієї сесії публікації .
Подібні кроки вже впроваджуються і в npm — реєстрі пакетів JavaScript:
npm login тепер видає сесійні токени, що діють дві години ;Разом ці заходи мають усунути саме той вектор, яким скористалася Sapphire Sleet: один довгоживучий і недостатньо захищений токен мейнтейнера з правами на цілий простір пакетів.
npm install --ignore-scripts або параметр ignore-scripts = true допомагають запобігти запуску шкідливих postinstall-скриптів .Атака на Mastra показала, що для масштабної компрометації не обов’язково зламувати сам реєстр пакетів. Іноді достатньо отримати контроль над одним обліковим записом, якому екосистема вже довіряє.