317 npm-пакетов скомпрометированы вредоносом Mini Shai-Hulud

Вредонос связан с атакой на SAP трёхнедельной давности. Под угрозой — echarts-for-react (3,8 млн загрузок/мес), size-sensor (4,2 млн) и более 250 пакетов @antv.

Обложка: 317 npm-пакетов скомпрометированы вредоносом Mini Shai-Hulud

Если вы используете echarts-for-react, size-sensor или пакеты из семейства @antv — проверьте package-lock.json прямо сейчас. 19 мая 2026 года за 22 минуты был взломан npm-аккаунт atool: атакующий опубликовал 637 вредоносных версий 317 пакетов, суммарно набирающих десятки миллионов загрузок в месяц.

Ключевые выводы

317 npm-пакетов скомпрометированы через взломанный аккаунт atool: под угрозой echarts-for-react (3,8 млн загрузок/мес), size-sensor (4,2 млн) и более 250 пакетов @antv.

Вредонос — тот же тулкит Mini Shai-Hulud, что три недели назад атаковал SAP: одинаковая архитектура сканера, те же регулярные выражения для поиска учётных данных.

Payload объёмом 498 КБ крадёт учётные данные AWS (включая EC2 metadata и ECS), GitHub PAT, токены npm, SSH-ключи, данные 1Password и Bitwarden.

Двойная эксфильтрация: через публичные GitHub-репозитории с зашифрованными Git-объектами и HTTPS-запросы к t.m-kosche[.]com под видом OpenTelemetry-трейсов.

Вредонос перехватывает AI-агентов: внедряет SessionStart-хуки в Claude Code и Codex, а также задачи runOn:folderOpen в VS Code.

Масштаб атаки

Аккаунт atool на npm поддерживает 547 пакетов. Атакующий опубликовал вредоносные версии двумя волнами: первая — с 01:39 до 01:56 UTC (~317 версий), вторая — с 02:05 до 02:06 UTC (~314 версий). В результате 309 пакетов получили по два заражённых релиза каждый.

  • size-sensor — 4,2 млн загрузок/мес
  • echarts-for-react — 3,8 млн загрузок/мес
  • @antv/scale — 2,2 млн загрузок/мес
  • timeago.js — 1,15 млн загрузок/мес
  • @antv/x6, @antv/g, @antv/g6 и более 250 других пакетов @antv

Важно: атакующий не переставил тег latest — но это не защищает. npm выбирает наибольшую версию, удовлетворяющую semver-диапазону, независимо от тега. Проект с "echarts-for-react": "^3.0.6" при следующей чистой установке получит вредоносную 3.2.7.

Как работает вредонос

498-килобайтный обфусцированный Bun-скрипт запускается через preinstall-хук. Дополнительно 630 из 637 версий добавляют в optionalDependencies ссылку на «сиротские» коммиты в репозитории antvis/G2 на GitHub с поддельным авторством. Этот механизм позволяет доставить payload даже при блокировке preinstall-хуков: npm резолвит github:-зависимости по SHA без проверки истории ветки.

Скрипт собирает учётные данные по всей цепочке AWS: переменные окружения, файлы конфигурации, EC2 Instance Metadata Service (169.254.169.254), ECS container metadata (169.254.170.2), Secrets Manager. Помимо этого — токены Kubernetes, HashiCorp Vault, GitHub PAT, токены npm, SSH-ключи и хранилища паролей: 1Password, Bitwarden, pass, gopass.

Эксфильтрация идёт двумя параллельными каналами: украденные данные коммитятся как Git-объекты в публичные GitHub-репозитории с названиями в формате Dune-вселенной (sardaukar-sandworm-42, fremen-stillsuit-7 и т.п.), а также отправляются RSA+AES-зашифрованными POST-запросами к t.m-kosche[.]com — замаскированными под данные OpenTelemetry.

Для закрепления в системе вредонос устанавливает systemd-сервис kitty-monitor (или LaunchAgent на macOS), который каждый час опрашивает GitHub Commit Search API в поиске RSA-PSS-подписанных команд по ключевому слову firedalazer. Это классический GitHub dead-drop C2-бэкдор.

Связь с атакой на SAP

Исследователи SafeDep идентифицировали payload как Mini Shai-Hulud — тот же тулкит, который три недели назад был использован в компрометации SAP. Совпадают архитектура сканера, набор регулярных выражений для поиска учётных данных и паттерны обфускации. Название отсылает к Дюне Фрэнка Герберта: Shai-Hulud — гигантский песчаный червь, пожирающий всё на своём пути.

Что делать

  1. Проверить package-lock.json или yarn.lock — найти версии из списка скомпрометированных пакетов (полный список в источнике).
  2. Удалить node_modules и переустановить зависимости после того, как npm отзовёт вредоносные версии.
  3. Проверить наличие kitty-monitor.service (Linux) или com.user.kitty-monitor.plist (macOS).
  4. Проверить файл ~/.claude/settings.json — не должно быть SessionStart-хуков, запускающих node .claude/setup.mjs.
  5. Ротировать все учётные данные: AWS IAM, GitHub PAT, npm-токены, SSH-ключи — если машина устанавливала заражённые пакеты.

Индикаторы компрометации

			# preinstall-скрипт в package.json
bun run index.js

# SHA256 payload
a68dd1e6a6e35ec3771e1f94fe796f55dfe65a2b94560516ff4ac189390dfa1c

# Exfil-домен
t.m-kosche[.]com

# C2 keyword в GitHub commits
firedalazer

# Persistence
~/.local/share/kitty/cat.py
/var/tmp/.gh_update_state
		
FAQ
1
Как проверить, затронуты ли мои проекты?

Откройте package-lock.json или yarn.lock и поищите пакеты из опубликованного SafeDep списка 317 пакетов. Особое внимание: echarts-for-react версий 3.0.7, 3.1.7, 3.2.7; size-sensor 1.0.4, 1.1.4, 1.2.4; timeago.js 4.1.2, 4.2.2. Если нашли — машина, запустившая npm install, потенциально скомпрометирована.

2
Что такое Mini Shai-Hulud?

Это многоцелевой credential-stealer тулкит, названный по гигантскому песчаному червю из романа «Дюна». Он охватывает AWS, GCP, Azure, Kubernetes, HashiCorp Vault, GitHub, npm, SSH и менеджеры паролей. Тот же тулкит был использован в атаке на SAP в начале мая 2026 года.

3
Почему semver-диапазоны опасны при таких атаках?

npm выбирает наибольшую версию, подходящую под диапазон, независимо от тега latest. Если у вас "echarts-for-react": "^3.0.6", при npm install вы получите 3.2.7 (вредоносную), а не 3.0.6. Зафиксируйте точные версии через npm shrinkwrap или используйте lockfile-проверку в CI.

Источник: SafeDep — Mini Shai-Hulud Strikes Again: 317 npm Packages Compromised