
Проверка IOC для атаки на цепочку поставок npm TanStack/Mini Shai-Hulud (CVE-2026-45321)
curl -fsSL https://raw.githubusercontent.com/nkopylov/tanscript-exploit-check/main/check-tanstack-exploit.sh | bash
Или склонируйте репозиторий и запустите локально:
git clone https://github.com/nkopylov/tanscript-exploit-check.git
cd tanscript-exploit-check
./check-tanstack-exploit.sh [project_dir ...]
Этот чекер покрывает две волны кампании атаки на цепочку поставок Mini Shai-Hulud от TeamPCP:
11 мая 2026 (19:20–19:26 UTC) злоумышленник опубликовал 84 вредоносные версии в 42 npm-пакетах @tanstack/* за 6-минутное окно. Атака также затронула пакеты Mistral AI, UiPath, OpenSearch и другие — в общей сложности более 170 пакетов в npm и PyPI.
Учётные данные мейнтейнеров не были похищены. Атакующий использовал саму цепочку доверия CI/CD через атаку в 3 этапа:
pull_request_target — одноразовый GitHub-форк открыл PR, который выполнял код атакующего в контексте безопасности базового репозитория19 мая 2026 (01:39–02:06 UTC) скомпрометированный npm-аккаунт atool ([email protected]) опубликовал 637 вредоносных версий в 314 пакетах двумя автоматизированными волнами. Цели с высоким влиянием включают:
size-sensor (4,2 млн загрузок/месяц)echarts-for-react (3,8 млн загрузок/месяц)@antv/scale (2,2 млн загрузок/месяц)timeago.js (1,15 млн загрузок/месяц)@antv/* и другихВ этой волне использовалась полезная нагрузка на основе Bun (498КБ index.js), запускаемая через "preinstall": "bun run index.js", с нагрузкой второй стадии, скрытой в поддельных коммитах, запушенных в GitHub-репозиторий antvis/G2 через эксплуатацию расшаривания fork-объектов.
Обе волны используют одно и то же семейство инструментов «Mini Shai-Hulud»:
gh-token-monitor (волна 1) и kitty-monitor (волна 2) через LaunchAgent/systemd; хуки в .claude/settings.json и .vscode/tasks.jsontoJSON(secrets), обмен npm OIDC-токеновrm -rf ~/ при отзыве GitHub-токена, пока демон активенfiredalazer, команды, подписанные RSA-PSSЗатронуты только @tanstack/router* и @tanstack/start*. НЕ затронуты: @tanstack/query*, @tanstack/table*, @tanstack/form*, @tanstack/virtual*, @tanstack/store.
Полный список всех 42 пакетов см. в полном уведомлении.
Все пакеты, опубликованные npm-пользователем atool ([email protected]), получили вредоносные версии 19 мая 2026 года. Пакеты с высоким влиянием включают:
| Пакет | Ежемесячные загрузки |
|---|---|
size-sensor | 4,2 млн |
echarts-for-react | 3,8 млн |
@antv/scale | 2,2 млн |
Плюс 310+ пакетов, в основном в скоупе @antv/* (@antv/g2, @antv/g6, @antv/l7, @antv/s2, @antv/x6, @antv/f2 и т.д.), ai-figure, timeago-react, jest-canvas-mock, jest-date-mock и другие.
Полный список см. в анализе SafeDep.
КРИТИЧЕСКИ ВАЖНО: отключите рубильник («мёртвую руку») ПЕРЕД отзывом любых токенов. Вредоносное ПО стирает
$HOME, если токены отозваны, пока демон активен.
gh-token-monitor И kitty-monitor) и удалите службы LaunchAgent/systemd.claude/router_runtime.js, .vscode/setup.mjs, ~/.local/share/kitty/cat.py, /var/tmp/.gh_update_state и т.д.)node_modules и lockfile, переустановите с --ignore-scriptsapi.masscan.cloud, filev2.getsession.org, git-tanstack.com, t.m-kosche.com)Скопируйте и вставьте эти промпты в вашего AI-агента кодинга (Claude Code, Cursor, Cline/OpenClaw, Windsurf, Hermes и т.д.), чтобы укрепить ваш проект против атак на цепочку поставок, подобных этой.
Укрепите npm-конфигурацию этого проекта против атак на цепочку поставок. Сделайте следующее:
Зафиксируйте точные версии: Удалите все префиксы
^и~у каждой зависимости вpackage.json, чтобыnpm installникогда не подтягивал молча только что опубликованную версию.Отключите postinstall-скрипты по умолчанию: Добавьте
ignore-scripts=trueв.npmrc. Затем добавьте явный"preinstall"скрипт вpackage.json, который запускает только известные безопасные жизненные циклы скриптов, реально необходимые этому проекту (если такие есть).Обеспечьте установки только через lockfile в CI: Убедитесь, что CI использует
npm ci(неnpm install). Если есть файл конфигурации CI, проверьте это. Если нет — отметьте как ручной шаг.Добавьте проверку provenance: Добавьте
npm audit signaturesкак шаг в pipeline CI и как git-hook перед push.
Проверьте и укрепите конфигурацию AI-агента кодинга этого проекта против инъекций в цепочку поставок (как кампания TanStack/Mini Shai-Hulud, которая внедряла вредоносные хуки в
.claude/settings.jsonи.vscode/tasks.json). Сделайте следующее:Claude Code (
.claude/):
- Просмотрите
.claude/settings.jsonи.claude/settings.local.jsonна предмет записейhooks, выполняющих shell-команды. Помечайте всё, что исполняет файлы.js,.mjsили.sh— особенно из.claude/,.vscode/илиnode_modules/.- Удалите любые хуки, которые вы не можете проследить до легитимной, созданной пользователем цели.
- Добавьте правило в
.gitignore, чтобы предотвратить коммит (он должен оставаться локальным).
Проверьте и укрепите конфигурацию GitHub Actions в этом репозитории против атак на цепочку поставок CI/CD. Сделайте следующее:
Удалите или отрефакторите любые триггеры
pull_request_target— они выполняют код workflow в контексте базового репозитория с доступом к секретам, даже при запуске из форка. При необходимости замените наpull_request+ отдельный workflow с одобрением доступа.Зафиксируйте все сторонние actions на полные SHA коммитов (не на теги или ветки). Например, замените
actions/checkout@v4наactions/checkout@<полный-sha>. Добавьте комментарий с тегом для читаемости.Примените минимально необходимые права к каждому workflow. Добавьте явные блоки
permissions:. Большинству workflow достаточноcontents: read. Публикующим workflow нуженid-token: write— и ничего больше.Ограничьте область кэша: Если используется
actions/cache, убедитесь, что ключи кэша привязаны к ветке, чтобы предотвратить отравление между ветками. Добавляйтеrestore-keysосторожно — не восстанавливайте кэши из недоверенных веток.
MIT
| # | Проверка | Описание |
|---|
| 1 | Рубильник («мёртвая рука») | Демоны постоянства: gh-token-monitor (волна 1), kitty-monitor (волна 2) |
| 2 | Вредоносные процессы | Известные имена процессов атакующего (обе волны) |
| 3 | Файлы полезной нагрузки | Известные вредоносные файлы по имени и SHA-256 хэшу (4 хэша) |
| 4 | Хуки Claude Code | Внедрённые хуки в .claude/settings.json + общая эвристика SessionStart |
| 5 | Задачи VS Code | Внедрённые задачи в .vscode/tasks.json + общая эвристика runOn: folderOpen |
| 6 | GitHub Actions | toJSON(secrets) в любом workflow + предупреждение о pull_request_target |
| 7 | npm lockfile | Скомпрометированные версии пакетов в lockfile |
| 8 | optionalDependencies | Вредоносные @tanstack/setup и @antv/setup + 4 SHA поддельных коммитов |
| 9 | Сетевые соединения | Активные подключения к инфраструктуре C2 (5 доменов/IP) |
| 10 | DNS-кэш | Раннее разрешение доменов атакующего (4 домена) |
| 11 | Git-ветки | Паттерн именования веток атакующего в тематике «Дюны» |
| 12 | Жизненные циклы скриптов | Эвристика: bun run в preinstall/postinstall (установленные пакеты) |
| 13 | Мёртвая точка C2 | Ключевое слово firedalazer и маркеры «Shai-Hulud» в истории git |
| 14 | GitHub-зависимости | Эвристика: зависимости github: привязанные к SHA коммита в optionalDeps |
| Пакет | Вредоносные версии | Первая безопасная версия |
|---|
@tanstack/react-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/router-core | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/vue-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/solid-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/react-start | 1.167.68, 1.167.71 | 1.167.72 |
@tanstack/router-plugin | 1.167.38, 1.167.41 | 1.167.42 |
timeago.js | 1,15 млн |
Создайте скрипт политики обновления: Создайте scripts/safe-update.sh, который:
npm view <pkg> time --json)npm install <pkg>@latest --save-exactНе меняйте код приложения. Трогайте только конфигурационные файлы, .npmrc, скрипты package.json и конфигурацию CI.
.claude/settings.local.jsonVS Code (.vscode/):
.vscode/tasks.json и .vscode/launch.json на предмет задач, выполняющих неожиданные скрипты или бинарные файлы.setup.mjs, router_runtime.js или другие имена, не принадлежащие этому проекту..vscode/extensions.json на расширения, которые вы не узнаёте.Cursor (.cursor/):
.cursor/settings.json и любые файлы правил на предмет внедрённых команд или хуков..vscode/.Общее:
preinstall, postinstall, prepare или prestart в package.json, которые вы не писали. Помечайте подозрительные..github/workflows/ на любой workflow, использующий pull_request_target — помечайте его как риск безопасности с комментарием, объясняющим почему..gitignore исключает файлы сессий агента, которые могут раскрыть учётные данные (.claude/projects/, .cursor/logs/ и т.д.).Сообщите, что вы нашли и что изменили. Не изменяйте код приложения.
Добавьте StepSecurity Harden-Runner первым шагом в каждую job: step-security/harden-runner@v2 с egress-policy: audit (или block, если вы знаете ваши разрешённые endpoints).
Проверьте логи workflow на секреты: Убедитесь, что ни один шаг workflow не выводит ${{ secrets.* }} или ${{ toJSON(secrets) }} в stdout.
Сообщите обо всех изменениях. Не изменяйте код приложения.