Postinstall в npm: Mastra взлом и код при установке

В цепочке npm Mastra вредоносный код запускался через postinstall при установке зависимостей. Затронуто более 140 пакетов и CI/CD окружения.

2026-06-21 GIGATAP Team #security
#npm#supply-chain#postinstall

Что произошло в цепочке поставки 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.