
Обнаруживает CVE-2026-45321 (компрометация цепочки поставок TanStack) и артефакты червя Mini Shai-Hulud. Сканирует node_modules, lockfiles, перехватчики постоянства (Claude Code, VS Code, systemd, LaunchAgent), GitHub workflows, историю git, C2-домены и конфигурации AI-инструментов.
⚠️ Отказ от ответственности: Этот инструмент был создан для моего собственного использования. Все индикаторы взяты из следующих источников рекомендаций:
Если после последнего обновления появятся новые IOC, варианты полезной нагрузки или инфраструктура атакующего, они не будут обнаружены. Всегда перепроверяйте информацию по последним опубликованным рекомендациям.
Обнаруживает компрометацию цепочки поставок TanStack (CVE-2026-45321) и связанные артефакты червя Mini Shai-Hulud в локальной копии проекта.
Скрипт предназначен для быстрой сортировки в исходных копиях, заданиях CI и сборках Docker. Чистый результат означает, что ни один из известных индикаторов, перечисленных ниже, не был найден. Это не полное криминалистическое исследование и не гарантия того, что машина никогда не была скомпрометирована.
| Категория | Детали |
|---|
| Скомпрометированные пакеты | Все 42 пакета @tanstack/* + 20 вторичных жертв, распространенных червём (@mistralai, @opensearch-project, @draftlab, safe-action и т.д.) |
| Сканирование lock-файлов | pnpm-lock.yaml, yarn.lock, bun.lock, bun.lockb, package-lock.json, включая многострочные записи packages npm v3 и разделы селектора/версии Yarn v1 |
| Файлы полезной нагрузки | router_init.js, tanstack_runner.js в node_modules с проверкой SHA-256; точное совпадение хеша и несовпадение хеша приводят к неудаче сканирования |
| Вектор заражения | @tanstack/setup как optionalDependency в любом установленном пакете |
| Персистентность | Хуки Claude Code SessionStart как в настройках проекта, так и в домашнем каталоге, задачи VS Code folderOpen, gh-token-monitor (LaunchAgent + systemd), вредоносные GitHub workflows |
| Артефакты на диске | .claude/router_runtime.js, .claude/setup.mjs, .vscode/setup.mjs, gh-token-monitor.sh, com.user.gh-token-monitor.plist |
| IOC источника | Хеши коммитов атакующего, C2-домены (api.masscan.cloud, git-tanstack.com), конечные точки Session Protocol, соль PBKDF2, строки кампании |
| История Git | Коммиты, автором которых является [email protected] |
| Шаблоны веток | dependabot/github_actions/format/* и dependabout/*/setup-formatter |
| Конфигурации AI-инструментов | Изменённые .claude/mcp.json и .kiro/settings/mcp.json |
| Запущенные процессы | Демонизированная полезная нагрузка и процессы gh-token-monitor |
| npm-токены | Токены с пометкой выкупа (IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner) |
pnpm, yarn, bun, затем npm). Если репозиторий намеренно содержит несколько lock-файлов, сканируйте каждое соответствующее состояние менеджера пакетов отдельно.npm и достаточной аутентификации для npm token list.HOME процесса, запускающего скрипт. В CI или контейнерах это может отличаться от домашнего каталога рабочей станции разработчика.# Сканирование текущего каталога
bash check-tanstack-compromise.sh .
# Сканирование конкретного проекта
bash check-tanstack-compromise.sh /path/to/project
# Однострочник (curl)
curl -sL https://raw.githubusercontent.com/ry-allan/tanstack-compromise-checker/main/check-tanstack-compromise.sh | bash
Код выхода 0 = не найдено покрытых индикаторов.
Код выхода 1 = найден покрытый индикатор компрометации или подозрительной полезной нагрузки.
═══════════════════════════════════════════════════════════════
TanStack Supply Chain Compromise Check (CVE-2026-45321)
═══════════════════════════════════════════════════════════════
Advisory: GHSA-g7cv-rxg3-hmpx
Reference: https://snyk.io/blog/tanstack-npm-packages-compromised/
Deep dive: https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-…
[*] Scanning: /Users/xxxxx/repos/xxxxx
[*] Package manager: pnpm (pnpm-lock.yaml)
[*] Checking installed TanStack packages against 42 known-compromised versions…
[*] Checking worm-propagated secondary victims (Mini Shai-Hulud)…
[*] Packages: @mistralai, @opensearch-project, @draftlab, @draftauth,
[*] @dirigible-ai, safe-action, cmux-agent-mcp, nextmove-mcp,
[*] git-git-git, git-branch-selector, agentwork-cli, ml-toolkit-ts,
[*] wot-api, cross-stitch, ts-dna
[*] Scanning lockfile for known-compromised versions (pnpm-lock.yaml)…
[✓] No compromised versions in lockfile
[*] Checking for persistence artifacts (payload files, hooks, services, C2)…
[✓] No malicious author commits in git history
───────────────────────────────────────────────────────────────
[✓] No compromise detected.
Установите Aikido Safe Chain для автоматического сканирования каждой установки пакета на наличие вредоносного ПО:
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/latest/download/install-safe-chain.sh | sh
После этого перезапустите терминал. Safe Chain оборачивает npm, npx, yarn, pnpm, pip, uv и другие инструменты — блокируя пакеты, выпущенные менее 48 часов назад, и известные плохие версии до того, как они попадут на диск. Никаких токенов или настройки не требуется.
Интеграционный Dockerfile создаёт только синтетические фикстуры. Он не загружает реальные скомпрометированные пакеты.
Основная фикстура проверяет, что срабатывают все 33 сообщения обнаружения в манифестах пакетов, lock-файлах, артефактах персистентности, workflows, истории git, IOC источника, именах файлов полезной нагрузки, конфигурациях AI-инструментов и выводе исправлений:
docker build -f integration.Dockerfile -t tanstack-check-test .
Сборка Docker также включает целевую регрессионную проверку для:
package-lock.json v3, где имя пакета и скомпрометированная версия находятся на разных строках.version находятся на разных строках.router_init.js с несовпадающим хешем, возвращающих код выхода 1.SessionStart на уровне дома, даже если существует чистый файл .claude/settings.json на уровне проекта.После сборки образ команды можно запустить напрямую:
docker run --rm tanstack-check-test