Практическое руководство: как работает атака, как проверить свой проект, и как защитить фронтенд от крупнейшей атаки на npm в 2026 году. 170+ пакетов скомпрометированы — вот что нужно знать.
В конце апреля 2026 года в экосистеме npm появился новый вариант червя Shai-Hulud. Исследователи безопасности быстро окрестили его «Mini Shai-Hulud» — самораспространяющийся червь, который распространялся через доверенную инфраструктуру пакетов npm, компрометируя учётные данные разработчиков и публикуя вредоносные версии легитимных пакетов.
Атака развернулась в две волны. Первая волна (конец апреля) была
нацелена на экосистему разработки SAP, скомпрометировав пакеты
@cap-js/sqlite, @cap-js/postgres и mbt.
Вторая волна (11–12 мая) резко расширилась: 373 вредоносных версии
в 169 именах npm-пакетов, включая 42 пакета @tanstack/*, весь набор
SDK @mistralai, инструменты автоматизации @uipath, а также
пакеты в пространствах имён @squawk и @tallyui.
StepSecurity обнаружила атаку 11 мая в течение 30 минут. Все затронутые версии пакетов помечены как устаревшие (deprecated) на npm и теперь показывают предупреждения SECURITY. Но для разработчиков и организаций, установивших эти пакеты в период уязвимости, ущерб может быть значительным: украденные учётные данные, скомпрометированные CI/CD-пайплайны и несанкционированная публикация пакетов.
170+ npm-пакетов затронуто в экосистемах TanStack, Mistral AI, UiPath, Squawk, TallyUI и SAP. 404 вредоносных версии в общей сложности. Украдены: токены GitHub, токены доступа npm, облачные ключи AWS/Azure/GCP, секреты GitHub Actions и токены сервисных аккаунтов Kubernetes.
Mini Shai-Hulud выполняет многоэтапную цепочку атаки, которая
начинается в момент запуска npm install. Понимание каждого этапа
помогает распознавать паттерны атаки и защищать собственные проекты.
Злоумышленники модифицировали package.json легитимных пакетов,
добавив скрипт preinstall:
"scripts": {
"preinstall": "node setup.mjs"
}
npm выполняет хуки preinstall до завершения установки
пакета — то есть вредоносный код запускается автоматически. Остальной
исходный код пакета остаётся идентичным чистой версии, что делает поверхностный
аудит кода неэффективным. Только хук установки и два добавленных файла
(setup.mjs и execution.js) отличаются от легитимного релиза.
Файл setup.mjs — это небольшой загрузчик, который скачивает Bun v1.3.13
из релизов GitHub, распаковывает бинарный файл и использует Bun для выполнения основной
нагрузки. Использование Bun стратегически важно — это автономная среда выполнения
JavaScript, не зависящая от локальной установки Node.js, что позволяет вредоносному ПО
работать в окружениях, где Node ограничен или недоступен.
Файл execution.js содержит одну большую обфусцированную нагрузку,
использующую собственный скремблер ctf-scramble-v2. Он проверяет,
запущен ли в CI-окружении, завершает работу при обнаружении русской локали и
демонизируется, чтобы продолжать работу после завершения установки.
Инструмент кражи учётных данных нацелен на широкий спектр ценных активов:
Особенно примечателен путь кражи секретов GitHub Actions: встроенный Python-помощник
сканирует /proc на наличие процесса Runner.Worker, читает его
память и извлекает замаскированные структуры секретов непосредственно из работающего
CI-воркера — восстанавливая секреты, которые GitHub в противном случае удалил бы
из логов заданий.
Mini Shai-Hulud использует сам GitHub как канал эксфильтрации. После сбора учётных данных вредоносное ПО сжимает и шифрует результаты с помощью AES-256-GCM (ключ AES обёрнут встроенным открытым ключом RSA) и отправляет зашифрованный пакет в виде JSON-файла в публичный репозиторий GitHub, созданный с использованием украденного токена. Репозитории получают рандомизированные имена в стиле «Дюны» и описание «A Mini Shai-Hulud has Appeared».
Вредоносное ПО также сканирует коммиты GitHub на наличие ключевого слова
OhNoWhatsGoingOnWithGitHub, интерпретируя сообщения коммитов формата
OhNoWhatsGoingOnWithGitHub:<base64> как тайники с токенами —
декодируя значение base64 в токен GitHub для дальнейшего распространения.
Получив валидные токены, Mini Shai-Hulud автоматически распространяется: определяет
npm-пакеты, которые жертва авторизована публиковать, внедряет свою нагрузку в эти
пакеты, увеличивает патч-версию и публикует скомпрометированный релиз. Червь также
пытается отправить файлы нагрузки в директории .vscode/ и
.claude/, используя украденные токены GitHub Actions, с сообщением
коммита chore: update dependencies и автором claude.
Майская волна 2026 года представила более изощрённый путь входа. Вместо явного хука preinstall вредоносные пакеты TanStack использовали опциональную зависимость, указывающую на пакет, размещённый на GitHub:
"optionalDependencies": {
"@tanstack/setup": "github:tanstack/router#79ac49..."
}
Git-зависимость содержит скрипт prepare, который запускает полезную
нагрузку. Завершающий exit 1 заставляет npm считать опциональную
зависимость неудачной — вывод установки выглядит менее подозрительно, в то время
как нагрузка уже выполнена.
Если ваш проект использует пакеты из этих пространств имён, немедленно проверьте lockfile:
@tanstack/* @mistralai/* @uipath/* @squawk/* @tallyui/* @cap-js/* mbt
Пошаговый чек-лист для проверки безопасности вашего проекта:
package-lock.json или yarn.lock на наличие пакетов из затронутых пространств имён с датами публикации около 11–12 мая 2026 года.npm audit отметит устаревшие версии с предупреждениями SECURITY. Обратите особое внимание на пакеты @tanstack/* и @mistralai/*.chore: update dependencies от автора claude или необычную активность по публикации пакетов..vscode/ (tasks.json, setup.mjs) или .claude/ (execution.js, setup.mjs).Считайте машину разработчика или CI/CD-раннер полностью скомпрометированными. Немедленно смените: токены npm, персональные токены GitHub, секреты GitHub Actions и облачные учётные данные AWS/Azure/GCP. Проверьте всю недавнюю активность по публикации пакетов и выполнению CI/CD-воркфлоу на предмет несанкционированного доступа.
Атаки на цепочку поставок не исчезнут. Вот практическая стратегия защиты, которую должна внедрить каждая команда разработки:
^ или ~ в production-зависимостях, если не контролируете пакетnpm ci вместо npm install в CI/CD для строгого соблюдения lockfilepackage-lock.json или yarn.lock в системе контроля версийnpm install --ignore-scripts, проверьте код, затем запустите скрипты вручнуюpreinstall должен вызывать повышенное вниманиеnpm audit — Настройте pre-commit хук или шаг CI, выполняющий npm audit --audit-level=highnpm audit в CI — Останавливайте сборку при обнаружении уязвимостей уровня high/critical--ignore-scripts в CI, затем выборочно включайте для доверенных пакетовЕсли вы нанимаете веб-разработчика или агентство для создания сайта, безопасность цепочки поставок теперь часть обсуждения. Mini Shai-Hulud показывает, что одна скомпрометированная зависимость может раскрыть весь ваш проект — и потенциально учётные данные вашей инфраструктуры — злоумышленникам.
На что обратить внимание при выборе разработчика или команды:
Экосистема npm — это основа современной фронтенд-разработки. Доверие к ней зарабатывается бдительностью — и эта бдительность должна быть частью профессиональной практики вашего разработчика. Когда я создаю веб-приложения для клиентов, безопасность зависимостей и регулярный npm audit встроены в процесс разработки с первого дня.
pull_request_target GitHub Action для кражи привилегированного токена GitHub и скачал всю приватную кодовую базу Grafana. В то время как атака на npm использовала установочные скрипты как вектор, оба инцидента нацелены на одно и то же: учётные данные, доступные в инфраструктуре сборки и развёртывания. Вместе они демонстрируют, что защита токенов GitHub и CI/CD пайплайнов неотделима от защиты дерева зависимостей.Mini Shai-Hulud — это тревожный звонок для всей экосистемы фронтенда. Атаки на цепочку поставок не теоретические — они происходят прямо сейчас и становятся всё более изощрёнными. Хорошая новость: инструменты защиты существуют, и большинство из них бесплатны.
Если вы создаёте веб-приложение и хотите работать с разработчиком, который относится
к безопасности как к первостепенной задаче — свяжитесь
со мной. Я full-stack разработчик с более чем 20-летним опытом,
и каждый проект я строю с безопасностью зависимостей, встроенной с первого дня:
npm audit в CI, зафиксированные версии, 2FA везде и регулярные проверки
lockfile.
Есть проект? Помогу выбрать безопасный, современный стек технологий и реализовать его. Бесплатная первичная консультация.