@tanstack/*, которые были доступны около 20 минут, пока они не были обнаружены.Хорошая новость: атаку выявили быстро, пакеты были помечены как устаревшие.
Плохая новость: если вы запускали
npm install вчера и у вас есть в проекте @tanstack/* - у вас возможно есть эти вредоносные пакеты...🥲 А как так получилось ???
Атака строилась на цепочке из трёх уязвимостей. Вредоносный PR использовал
pull_request_target в GitHub Actions, чтобы отравить общий pnpm-кэш кастомным payload.Когда в следующий раз запускался релиз, он восстановил этот заражённый кэш - и код злоумышленника извлёк OIDC-токен прямо из памяти раннера, чтобы опубликовать пакет в npm, не прикоснувшись ни к одному сохранённому credential. Для npm заражённая версия выглядела на 100% легитимной.
Что делал вредоносный payload:
🙈 Сбор учётных данных - AWS, GCP, Kubernetes, Vault, GitHub-токены, SSH-ключи,
~/.npmrc. Всё, до чего можно дотянуться с заражённого хоста🙊Самораспространяющийся червь - запрашивал реестр npm в поисках других пакетов, которые поддерживает жертва, и заражал их тоже.
🙉 «Мёртвая рука» — скрипт
~/.local/bin/gh-token-monitor.sh устанавливался как systemd-сервис (Linux) или LaunchAgent (macOS) и каждые 60 секунд проверял api.github.com/user с украденным токеном. Если пользователь отзывал токен - срабатывал rm -rf ~/. Вот такие новости.
https://github.com/TanStack/router/issues/7383