Проблема: атака, которую не остановила валидная подпись
11 мая 2025 года за шесть минут были скомпрометированы 42 npm-пакета под префиксом @tanstack/*. За двое суток кампания расширилась до 172 пакетов в двух экосистемах — npm и PyPI. Совокупное число затронутых загрузок превысило 518 миллионов.
Главная проблема не в масштабе, а в методе: каждый вредоносный пакет имел валидную SLSA Build Level 3 аттестацию происхождения. У мейнтейнеров была двухфакторная аутентификация и trusted publishing через OIDC. По всем формальным признакам безопасности — всё было настроено правильно. Атака всё равно сработала.
Для бизнеса это означает одно: привычные индикаторы доверия к пакетам — подпись, аттестация, репутация автора — перестали быть достаточной защитой.
Почему удаление пакета не решает проблему
Червь Mini Shai-Hulud проектировался для персистентности. После установки он размещает механизмы закрепления в дереве проекта, а не в node_modules:
- Хук в
.claude/settings.json(Claude Code) - Задача в
.vscode/tasks.jsonс параметромrunOn: folderOpen— запускается при каждом открытии проекта в VS Code - Системный демон (macOS LaunchAgent или Linux systemd) — переживает перезагрузку
Удаление пакета через npm uninstall эти файлы не затрагивает. Они остаются активными.
На CI/CD-раннерах червь использует дополнительный вектор: на Linux-системах он читает /proc/pid/mem напрямую, извлекая секреты из памяти процессов, включая переменные, скрытые в логах.
Критическая ловушка: если отозвать токены до изоляции машины, деструктивный компонент демона уничтожает домашний каталог пользователя.
Решение: 6 шагов в правильном порядке
1. Аудит зависимостей. Проверьте package-lock.json и requirements.txt на наличие версий скомпрометированных пакетов, опубликованных 11–13 мая 2025 года.
2. Поиск артефактов. Проверьте .vscode/tasks.json на наличие folderOpen, .claude/settings.json, а также список LaunchAgents (macOS) и systemd юнитов (Linux).
3. Сначала изоляция — потом ротация. Отключите машину от сети, и только затем начинайте ротацию токенов. Ротируйте: AWS-ключи, GitHub PAT, npm-токены, SSH-ключи, токены Vault и Kubernetes, токены MCP-серверов ИИ-агентов.
4. Проверка CI/CD. Уязвимость в конфигурации OIDC-скоупа: если пайплайн доверяет всему репозиторию, orphan-коммит достаточен для получения валидного публикационного токена. Ограничьте scope до конкретного workflow на конкретной ветке.
5. Менеджеры паролей. Червь целенаправленно атакует 1Password и Bitwarden. Если на скомпрометированной машине был разблокирован менеджер паролей — ротируйте все хранимые там credentials.
6. Превентивные меры. Включите npm audit в CI как блокирующий шаг. Ограничьте pullrequest_target workflows. Настройте регулярную ротацию токенов MCP-серверов.
Результат: что меняет этот инцидент
Атака Shai-Hulud — не просто очередная уязвимость в зависимостях. Она демонстрирует системный сдвиг: злоумышленники научились получать валидные подписи и аттестации, действуя через легитимные механизмы CI/CD.
Для команд, использующих ИИ-агентов (Claude Code, Kiro), появился новый вектор: червь целенаправленно похищает токены MCP-серверов — то есть доступ ко всем внешним сервисам, к которым подключён агент. Это значит, что безопасность ИИ-инфраструктуры теперь напрямую связана с безопасностью цепочки поставок.
Шесть шагов выше — минимум для любой команды, использующей npm или PyPI в production.