Эта статья основана на глубоком анализе недавней атаки на цепочку поставок (supply chain attack), затронувшей популярную экосистему TanStack и вышедшую далеко за её пределы. Атака оказалась крайне опасной из-за своей способности к самораспространению по принципу «червя».
Суть инцидента: Масштаб и охват
11 мая произошла масштабная атака на пакеты TanStack (Query, Router, Start и др.). Злоумышленникам удалось опубликовать вредоносные версии всех пакетов семейства в NPM. Хотя атаку локализовали в течение 20 минут, этого времени хватило, чтобы вирус начал распространяться дальше.
Основные факты:
- Тип атаки: Червь (Worm).
- Цель: Кража учетных данных (NPM tokens, GitHub tokens, AWS credentials) и дальнейшее самораспространение.
- Затронутые экосистемы: Изначально NPM (JavaScript), но уже зафиксированы случаи перехода в экосистему Python.
- Жертвы: Не только рядовые разработчики, но и CI/CD пайплайны других проектов.
Как работает «Червь» в коде
В отличие от обычного крадника данных, это вредоносное ПО использует украденные токены GitHub и NPM для автоматической публикации новых вредоносных версий пакетов, к которым у жертвы есть доступ.
- Сбор данных: Вирус сканирует систему на наличие секретов в типичных местах (папки
.aws, переменные окружения, конфигурации NPM). - Экстраполяция: Если жертва — мейнтейнер другого пакета, вирус использует её права для публикации зараженного кода в этот пакет.
- Заражение CI/CD: Если ваш проект использует TanStack в процессе сборки (CI), вредоносный код может выполниться в облачной среде сборки и украсть секреты самого репозитория.
Технический разбор: Как это стало возможным?
Атака не была связана со взломом компьютера конкретного разработчика. Злоумышленники использовали уязвимость в архитектуре GitHub Actions проекта TanStack, применив комбинацию из трех техник:
- PullRequestTarget Pattern: Использование триггера
pull_request_target. В отличие от обычногоpull_request, этот триггер запускает воркфлоу в контексте базового репозитория, что дает доступ к секретам и общим ресурсам. - Отравление кэша (Cache Poisoning): Злоумышленник создал форк, внес вредоносный код и открыл Pull Request. При запуске GitHub Action вредоносный код сохранил себя в кэше зависимостей. Когда настоящий мейнтейнер запустил легитимную сборку, она подтянула «отравленный» кэш.
- Кража OIDC токена: Получив доступ к среде исполнения через кэш, вирус перехватил краткосрочный токен (OIDC), предназначенный для «доверенной публикации» (Trusted Publishing) в NPM, и использовал его для выгрузки вредоносного кода.
Как проверить себя и защититься?
Индикаторы компрометации (IoC)
- Сетевой трафик: Проверьте наличие исходящих запросов на подозрительные URL (список обновляется в официальных постах TanStack).
- Время установки: Если вы устанавливали или обновляли пакеты TanStack вечером 11 мая (по UTC), считайте свою систему скомпрометированной.
- Токены: Если вы подозреваете заражение, немедленно отозовите все токены (NPM, AWS, GitHub).
Рекомендации по безопасности
- Используйте Dev Containers или VM: Не ведите разработку напрямую в основной ОС. Изоляция среды минимизирует доступ вируса к вашим личным файлам и ключам.
- Минимальный возраст пакетов: Настройте пакетные менеджеры (например, Bun или PNPM) на установку пакетов, выпущенных не менее X дней/часов назад. Это дает сообществу время обнаружить и удалить вредоносный код.
- Запрет postinstall-скриптов: Большинство атак полагаются на скрипты жизненного цикла. Используйте флаг
--ignore-scripts. - Управление секретами: Избегайте хранения ключей в
.envфайлах. Используйте специализированные сервисы (Infisical, Doppler) или SSO-авторизацию (например, AWS SSO вместо IAM-ключей).
Итог
Эра ИИ делает такие атаки проще: злоумышленникам легче анализировать чужой код на предмет уязвимостей в CI/CD. Данный инцидент показал, что даже «безопасные» методы (вроде Trusted Publishing без постоянных токенов) могут быть обойдены при грамотном использовании механизмов кэширования.
Совет на сегодня: Воздержитесь от обновлений зависимостей в ближайшие дни, пока волна «червя» не утихнет окончательно.
