Что произошло в цепочке поставки Mastra#
Microsoft Security Blog описывает масштабную компрометацию npm-экосистемы Mastra. Вредоносный код выполнялся во время установки через npm lifecycle hook postinstall. Затронуто более 140 пакетов под mastra и @mastra scopes. Любой npm install или npm update в окно компрометации мог запускать код атакующих, включая CI/CD пайплайны, даже без прямого использования пакета.
Механика атаки через postinstall#
Атака началась с захвата npm-аккаунта мейнтейнера с правами публикации в Mastra scope. Злоумышленники опубликовали модифицированную версию mastra. Единственное заметное изменение — добавление зависимости easy-day-js, typosquat легитимной библиотеки. Версия была помечена как latest и подтягивалась через SemVer диапазоны, включая caret-обновления.
postinstall запускался сразу после установки. Скрипт запускал обфусцированный загрузчик, отключал проверку TLS сертификатов и обращался к инфраструктуре атакующих. Далее загружалась вторая стадия и запускалась как скрытый detached process. Это переносит риск с уровня импорта на уровень выполнения при установке.
По всей экосистеме более 140 пакетов были пересобраны с тем же паттерном вредоносной зависимости. Цепочка использовала штатные механизмы npm: резолвинг зависимостей, flattening и lifecycle scripts.
Definition capsule: postinstall
Postinstall — npm lifecycle script, который автоматически выполняется после установки пакета. Он может запускать произвольный код и часто используется как вектор атак в supply chain.
Почему postinstall опасен в CI/CD#
Он выполняется без явного намерения приложения. Любой pipeline с npm install становится средой исполнения кода из зависимостей. Это разрушает границу между управлением зависимостями и выполнением.
В случае Mastra выделяются три фактора. Компрометация одного мейнтейнера. Автоматическое разрешение SemVer, подтягивающее заражённые версии. Выполнение lifecycle scripts до любых проверок безопасности или runtime-защит.
Microsoft с высокой уверенностью связывает кампанию с Sapphire Sleet, северокорейской группировкой, ранее замеченной в атаках на финансовый сектор.
| Этап | Что выполняется | Тип риска | Видимость |
|---|---|---|---|
| Установка зависимостей | postinstall scripts | мгновенное выполнение кода | низкая |
| Runtime приложения | импорт модулей | логическая эксплуатация | средняя |
| CI/CD | окружение сборки | утечка токенов и секретов | очень низкая |
Что проверить#
Любая система, выполнявшая npm install или npm update с затронутыми версиями, должна считаться потенциально скомпрометированной. Включая локальные машины разработчиков, build agents и ephemeral CI runners.
Основные пути риска: утечка переменных окружения, кража CI/CD токенов, установка persistence через вторичные payloads. Поведение включало C2-коммуникацию и запуск скрытых процессов.
Проверьте версии зависимостей mastra и @mastra scope. Проведите аудит логов установок. Ротация всех секретов в окружениях, где выполнялась установка.
https://gigatap.top/en/articles/100-package-test-coverage-is-the-point-not-the-slogan
https://gigatap.top/en/articles/openssfs-april-signal-make-security-artifacts-operational
https://gigatap.top/en/articles/open-source-security-needs-more-than-code
FAQ#
Как вредоносный код запускался без импорта#
Через npm lifecycle scripts, в частности postinstall, которые выполняются автоматически при установке зависимостей.
Почему SemVer диапазоны усилили атаку#
Caret-диапазоны позволяли автоматически подтягивать скомпрометированную версию без изменения package manifest.