Поддельный пакет TanStack на npm похищал переменные окружения разработчиков

information security

29 апреля 2026 года цепочка поставок JavaScript-экосистемы снова подверглась атаке. Злоумышленник, зарегистрировавший имя "tanstack" в реестре npm ещё в декабре 2024 года, опубликовал несколько версий подставного пакета, который при установке незаметно вычитывал файлы с конфиденциальными данными из рабочего каталога разработчика. Речь идёт о вредоносных выпусках tanstack@2.0.4, 2.0.5, 2.0.6 и 2.0.7, появившихся в промежутке с 17:08 до 17:35 по всемирному координированному времени. Настоящий проект TanStack (владелец библиотек TanStack Query, TanStack Table, TanStack Router, насчитывающих миллионы еженедельных загрузок) к этому инциденту не имеет никакого отношения. Атакующий просто занял свободное имя без пространства имён @tanstack, оформил подделку как правдоподобный SDK для видеоплеера и выждал момент.

Описание

Все четыре вредоносные версии содержали сценарий postinstall - код, который запускается автоматически сразу после команды npm install. В предыдущей легитимной версии 2.0.3 (выпущенной в марте) такого хука не было. Теперь же при установке на компьютере разработчика или в сборочном конвейере CI выполнялся скрипт, читающий локальные файлы и отправляющий их содержимое на управляемый злоумышленником веб-хук сервиса Svix. Svix - это легитимная платформа для обработки веб-хуков; атакующий использовал её функцию Ingest как ретранслятор для кражи данных, чтобы обойти блокировки на уровне сети.

Специалисты компании Aikido сообщили об инциденте, проанализировав хронологию публикаций. Первая версия 2.0.4 (17:08) была нацелена на файлы .env и .env.local. В коде был предусмотрен флаг отписки TANSTACK_TELEMETRY_OPT_OUT, но он оказался закомментирован - то есть возможности избежать утечки не было. Уже через три минуты вышла версия 2.0.5, где цели изменили на README.md и AGENTS.md, а механизм отписки включили. Скорее всего, это была проверка работоспособности веб-хука или попытка сделать хук менее подозрительным. Но затем, в 17:26, появилась самая опасная версия 2.0.6. Вместо перечисления конкретных файлов в ней применялся перебор всех файлов в корневой директории, отфильтрованных по имени, начинающемуся на .env, включая .env.local, .env.production, .env.staging, .env.development. Весь "улов" уходил одним POST-запросом. Вывод в консоль был полностью подавлен, отписка снова отключена. Спустя девять минут выпустили версию 2.0.7, вернувшуюся к жёстко заданным .env и .env.local и оставившую подавление вывода. За 27 минут атакующий, по сути, проводил живую отладку: менял цели, проверял канал приёма данных, оптимизировал скрытность - всё это под видом нормального пакета, доступного для установки любому разработчику.

README поддельного пакета был выполнен добросовестно: значки спонсорства, счётчики загрузок с npm, таблица сравнения функций, примеры кода. Казуальный взгляд не выявил бы обмана. Однако опасность заключалась именно в путанице имён. Разработчик, по ошибке набравший npm install tanstack вместо npm install @tanstack/query, получал не библиотеку для управления данными, а шпионское ПО. На момент кампании у пакета было около 19 830 загрузок за предыдущий месяц - то есть некоторые разработчики уже использовали его, не подозревая, что до 29 апреля пакет был чист.

Последствия такой утечки могут быть катастрофическими. В типичных .env-файлах JavaScript-проекта хранятся ключи доступа к AWS, персональные токены GitHub и npm, строки подключения к базам данных, API-ключи Stripe, Twilio, SendGrid, OpenAI, Anthropic и других сервисов, секреты OAuth. Если в рабочем каталоге при установке находился файл .env.production, то производственные учётные данные оказывались в руках атакующего. Особенно уязвимы сборочные конвейеры CI, где postinstall срабатывает даже при выполнении npm ci. Все секреты, внедрённые в окружение пайплайна, могли быть украдены.

Разработчикам следует немедленно проверить свои lock-файлы (package-lock.json, yarn.lock, pnpm-lock.yaml) и каталоги node_modules на наличие указанных версий tanstack 2.0.4-2.0.7. Если они найдены, необходимо считать скомпрометированными все файлы .env, присутствовавшие в рабочем каталоге в момент установки. Ключи AWS нужно проверить в CloudTrail на предмет несанкционированных вызовов, токены GitHub и npm отозвать и перевыпустить, все сторонние API-ключи из затронутых файлов сменить. Для обнаружения факта утечки можно проверить сетевые логи на предмет исходящего HTTPS-трафика к api.svix.com в соответствующий временной интервал.

Этот инцидент - очередное напоминание о том, что цепочка поставок открытого кода остаётся одним из самых уязвимых мест современной разработки. Злоумышленники всё чаще используют сквоттинг имён, правдоподобные README и автоматическое выполнение кода при установке, чтобы обойти внимание и автоматические сканеры. Единственный способ снизить риски - внедрять проверки целостности зависимостей и использовать инструменты, блокирующие подозрительные пакеты до их установки на рабочие станции и в CI-среды.

Индикаторы компрометации

URLs

  • https://api.svix.com/ingest/api/v1/source/src_3387PLMB2uhXOBe3Q8sHu/in/3j2jokvbaF4WWdngv8zBbk

SHA256

  • 04ee5325c8900c9d644ed81c9012525b6fc19f21c65cef85b6ba98b6a0a23566
  • 72ec4571e27c06f1d48737477c2b38a4f90d699950dab8946b48591133dc4f90
  • 7bb84e6ba893248814cd3bac70b7bdc115740fba9e13419940c73460cbcd7b6f
  • abc164807947b102164488a08161adb4ee08be6b78a371350a6b156eed0d97d9
Комментарии: 0