- Несколько версий @7nohe/openapi-react-query-codegen в npm были скомпрометированы.внедряет сложную вредоносную программу, которая использует уязвимости рабочих процессов на основе TanStack Query.
- В ходе атаки использовались скрипты обхода песочницы binding.gyp и скрипты предварительной установки. для выполнения многоуровневого кражи JavaScript во время выполнения команды npm install, даже без явных хуков жизненного цикла.
- В результате взлома вредоносная программа получила доступ к широкому спектру учетных данных разработчиков и облачных сервисов. (GitHub, npm, AWS, Azure, GCP, Vault, Kubernetes и другие) и распространили их в общедоступные репозитории GitHub.
- Червь использовал украденные токены для заражения дополнительных пакетов npm, PyPI, RubyGems и репозиториев GitHub., что подчеркивает более широкий риск для цепочки поставок, связанный с популярным использованием npm-пакета TanStack Query.

В конце августа 2026 года исследователи в области безопасности обнаружили Целенаправленная атака на цепочку поставок, связанная с экосистемой npm TanStack Query. Инцидент произошел через популярный генератор кода OpenAPI. В центре инцидента находится данный пакет. @7nohe/openapi-react-query-codegen, инструмент, который автоматически генерирует типобезопасные хуки для TanStack Query непосредственно из схем OpenAPI, и который еженедельно скачивается более чем 150 000 раз на npm.
Вместо того чтобы атаковать сами основные библиотеки TanStack Query, злоумышленники скомпрометировали сопутствующие инструменты, на которые полагаются многие команды для создания хуков TanStack Query , внедрив сложную вредоносную программу в несколько версий генератора. Поскольку эти хуки напрямую подключаются к производственным кодовым базам React и TypeScript, последствия выходят далеко за рамки одного пакета, затрагивая любой конвейер CI или компьютер разработчика, установившего зараженные версии.
Как злоумышленники использовали уязвимость в генераторе кода TanStack Query на npm.
Пострадавшая библиотека, @7nohe/openapi-react-query-codegenшироко используется для создания структуры слоев обработчиков запросов TanStack. из контрактов OpenAPI, избавляя команды от необходимости вручную писать повторяющуюся логику получения данных. В течение примерно 20 минут злоумышленник разместил в реестре npm десять вредоносных версий этого пакета, каждая из которых имела действительные подтверждения происхождения, полученные с помощью GitHub Actions.
Эти подтверждения, обычно являющиеся надежным сигналом целостности, стали бессмысленными, поскольку сам рабочий процесс GitHub Actions проекта был скомпрометирован . Используя уязвимость в этом рабочем процессе, злоумышленник получил возможность распространять троянизированные сборки, при этом генерируя криптографические доказательства того, что они получены из «официального» конвейера. Соответствующий репозиторий GitHub, по всей видимости, был захвачен в ходе той же атаки, что дало злоумышленнику полный контроль над процессом выпуска.
Эта кампания повторяет более ранние инциденты в цепочке поставок, связанные с npm, но добавляет изюминку: она специально нацелена на Пересечение инструментов OpenAPI и использования TanStack QueryПоскольку генератор генерирует код React, который зависит от @tanstack/react-queryЛюбая организация, внедрившая его в свою систему автоматизированного создания API-клиентов, рискует внедрить вредоносное ПО в агенты сборки, системы непрерывной интеграции или на ноутбуки разработчиков.
Следователи также отметили, что фирменная символика вредоносной программы — называющей себя « Trinitite: Sponsored by Preview 2 Effects » — перекликается с театральным стилем предыдущих операций, связанных с TeamPCP, хотя остается неясным, является ли это работой подражателей, отколовшейся группы или постороннего субъекта, заимствовавшего эту эстетику.
Выход из песочницы Binding.gyp: запуск вредоносного ПО во время выполнения команды npm install.
Одним из наиболее необычных технических решений в этой атаке, связанной с TanStack Query, является следующее: злоупотребление binding.gyp в качестве вектора выполнения во время выполнения команды npm installПри нормальных обстоятельствах, binding.gyp В этом файле описывается, как компилировать нативные дополнения для Node.js. Когда npm обнаруживает такой файл, он вызывает... node-gyp, которая, в свою очередь, оценивает conditions поле, созданное с помощью Python.
Вредоносные версии @7nohe/openapi-react-query-codegen Воспользуйтесь этим поведением, внедрив Выход из песочницы Python в conditions блокВместо безобидной конфигурации сборки, файл проходит по внутренней иерархии классов Python, чтобы достичь нужного элемента. catch_warnings класс, переходит к __builtins__, импорт osи наконец звонит os.system выполнить JavaScript-код с помощью Node.
После устранения обфускации условие сводится к одной-единственной команде: node 3FWCvzduYZg.js выполняется автоматически во время установки, Остаток от binding.gyp Содержимое по сути является дымовой завесой: заявленное имя цели бессмысленно, тип закодирован в шестнадцатеричном формате. noneи никакой реальной нативной компиляции не происходит.
Не каждый испорченный релиз был создан исключительно с помощью этого трюка. Использовались две метки предварительного выпуска. preinstall скрипты вместо, один из которых вызывает локальный файл nu.js и еще один, загружающий среду выполнения Bun через wget по трубам bash перед запуском скрипта с наглым названием is_it_this_simple.jsБолее поздние версии были удвоены, объединив binding.gyp эксплойт с явным указанием "preinstall": "node 3FWCvzduYZg.js" вход в package.json чтобы максимально увеличить шансы на успешную посадку полезной нагрузки.
Многоуровневая JavaScript-программа, созданная для обхода песочниц.
В основе скомпрометированного генератора запросов TanStack лежит... 3FWCvzduYZg.js, однострочный файл размером примерно 5.4 МБ.Этот скрипт, расположенный в корневом каталоге пакета npm, сильно обфусцирован и использует несколько этапов шифрования, чтобы замедлить проверку и помешать работе инструментов статического анализа.
Самый внешний слой — это гигантский массив целых чисел, расшифрованный с помощью операции XOR с фиксированным ключом., что раскрывает код, который незаметно загружает среду выполнения Bun во временный каталог (под такими именами, как trinnyyyy-XXXXX (в системной временной папке). Затем Bun используется для выполнения следующего зашифрованного сегмента, который сохраняется в виде данных, защищенных AES-128-GCM, встроенных в скрипт.
После полной расшифровки и деобфускации аналитики обнаружили внутреннюю полезную нагрузку размером около 800 КБ JavaScript, которая функционирует как программа для кражи учетных данных, самораспространяющийся червь и деструктивная утилита . Этот внутренний скрипт использует собственный шифр с перетасованной таблицей, наложенный поверх известных преобразований obfuscator.io, что еще раз указывает на то, что авторы специально стремились противостоять автоматическому обратному проектированию.
Прежде чем нанести какой-либо реальный ущерб, вредоносная программа выполняет следующее: серия проверок окружающей среды, разработанная для обхода средств защиты и автоматизированных сканеров.Программа незаметно завершает работу, если обнаруживает российские системные локали, распространенные инструменты EDR от CrowdStrike, SentinelOne или Carbon Black, известные каталоги песочницы, используемые продуктами сканирования цепочки поставок, а также поддельные секретные префиксы (например, AKIAFAKE или поддельные токены npm), или названия организаций GitHub, связанные с демонстрациями исследований в области безопасности. Он также проверяет наличие инструмента StepSecurity harden-runner и отступает, если обнаруживает такую усиленную конфигурацию CI.
Что вредоносное ПО пытается украсть у пользователей TanStack Query и не только
После выполнения условий выполнения полезная нагрузка начинает систематически собирать широкий спектр учетных данных, обычно используемых в современных рабочих процессах на основе JavaScript и TanStack Query . Основное внимание уделяется не самому фронтенд-фреймворку, а облачной и инфраструктуре разработчиков, с которой обычно взаимодействуют клиенты TanStack Query.
Основной целью является доступ к GitHub. Вредоносное ПО Поиск осуществляется как по классическим персональным токенам доступа, так и по более новым, более детализированным токенам. в переменных среды и расположении файлов в файловой системе. На раннерах GitHub Actions предпринимается попытка получить токен OIDC, используя стандартный способ. ACTIONS_ID_TOKEN_REQUEST_TOKEN и связанный с ним URL-адрес, используя тот же механизм, что и легитимные рабочие процессы для кратковременных учетных данных в облаке.
Реестры пакетов — ещё один ключевой источник данных. В скрипте написано: конфигурационные файлы npm, такие как ~/.npmrcсканирование токенов носителя и их проверка в реестре npm. whoami конечная точкаОн применяет аналогичную логику для Python PyPI (поиск токенов, начинающихся с pypi-AgEIcHlwaS5vcmcCJ) и RubyGems (ищу rubygems_ токенов), что дает злоумышленникам потенциальный доступ к широкой сети в рамках всей экосистемы.
Сбор учетных данных в облаке стал еще более масштабным. Вредоносные программы проводят зондирование. Переменные среды и конфигурационные файлы, связанные с AWS, служба метаданных экземпляров EC2 и конечные точки метаданных ECS., С помощью sts:GetCallerIdentity Вызовы для проверки действительности обнаруженных учетных данных перед их кражей. Схема повторяется для Azure (идентификаторы клиентов, секреты, управляемые удостоверения и даже Azure Key Vault) и для Google Cloud, проверка JSON-данных учетных записей служб, серверов метаданных и Secret Manager. как только у него появится пригодный для использования токен.
Помимо облачных и пакетных реестров, скрипт просматривает локальные диски в поисках более 150 различных узоров в виде шариковвключая закрытые ключи SSH, конфигурации Docker, .env Файлы, хранилища учетных данных Git, каталоги криптокошельков, мессенджеры, такие как Signal или Telegram Desktop, конфигурации VPN и даже конфигурационные файлы, связанные с инструментами искусственного интеллекта, такими как Claude. Такая широта отражает понимание того, как обычно разрабатываются и развертываются приложения, использующие TanStack Query: часто в средах, где одна машина или задача CI имеет широкий спектр учетных данных для репозиториев, реестров и облачных провайдеров.
Эксфильтрация данных через репозитории GitHub и распространение подобно червям.
После сбора данных вредоносная программа использует необычный подход к эксфильтрации. Вместо отправки данных на традиционный сервер управления и контроля, она использует репозитории GitHub в качестве общедоступных зашифрованных папок для загрузки файлов . Это не только сливается с обычным трафиком разработчиков, особенно в организациях, активно использующих TanStack Query и постоянно взаимодействующих с GitHub, но и усложняет процесс удаления.
Сначала скрипт ищет в публичной истории коммитов GitHub сообщения, соответствующие очень специфическому шаблону, который кодирует зашифрованный токен внутри текста сообщения коммита. Затем он расшифровывает этот токен, чтобы получить учетные данные GitHub, которые используются для создания нового репозитория для каждой жертвы . Это означает, что украденные данные с одной машины в конечном итоге хранятся под совершенно другой, уже скомпрометированной учетной записью, что еще больше затрудняет установление авторства.
Каждый репозиторий для эксфильтрации именуется по следующему адресу: сочетание случайных имен персонажей Touhou Project с числовым суффиксом (например, cirno-marisa-74291), а его описание соответствует собственному слогану вредоносной программы: «Trinitite: Sponsored by Preview 2 Effects». В этих репозиториях скрипт создает JSON-файлы с именами, например: doubletrinnys-{counter}-{timestamp}.json внутри results/ папку.
Структура JSON проста, но тщательно зашифрована: она содержит envelope содержащая основную часть украденных учетных данных и key Поле с ключом сессии, зашифрованным с помощью открытого ключа RSA злоумышленника. Это гарантирует, что, несмотря на то, что файлы технически являются общедоступными, Только тот, кто владеет соответствующим закрытым ключом, может прочитать содержимое.В результате случайные наблюдатели и большинство автоматизированных поисковых систем не могут увидеть, что было украдено.
Параллельно вредоносная программа действует как червь. Имея на руках действительные токены npm, PyPI или RubyGems, она может... Перечисляет все пакеты, принадлежащие скомпрометированному сопровождающему, и публикует новые, зараженные версии.Схема заражения повторяет ту же схему, что и при первоначальном взломе генератора кода TanStack Query: внедрение вредоносного кода. binding.gyp, заглядывая внутрь 3FWCvzduYZg.jsи распространяет пакет, используя украденный токен публикации. Он также злоупотребляет украденными токенами GitHub для обхода доступных репозиториев, добавляя файлы конфигурации с бэкдорами в соответствующие папки. .vscode, .claude, .github/workflowsи аналогичные каталоги, все под безобидными сообщениями о коммитах, например: "chore: update dependencies".
Такое червеобразное поведение значительно увеличивает радиус поражения. Одна организация, использующая TanStack Query и @7nohe/openapi-react-query-codegen в своей цепочке CI, может непреднамеренно внедрить вредоносное ПО в десятки внутренних пакетов и репозиториев, если зараженный разработчик или агент сборки опубликует новые релизы.
Признаки компрометации для пользователей npm TanStack Query
Для команд, которые используют TanStack Query и связанные с ним инструменты npm, вот несколько конкретных примеров. Для выявления угроз были опубликованы индикаторы компрометации (IOC).Следующие версии @7nohe/openapi-react-query-codegen Было подтверждено наличие в них полезной нагрузки из тринитита, и к ним следует относиться как к ненадежным:
- 0.5.4 и 0.5.5
- 1.6.3 и 1.6.4
- 2.2.1 и 2.2.2
- 3.0.3 и 3.0.4
- Пререлизы 0.0.0-365d4eb738d3146583431948d3ba6e27a32556be и 0.0.0-ec7876d6c917dad516ba69bbfafc948b834bf0ab
Любое появление большого однострочного файла JavaScript с именем 3FWCvzduYZg.js Наличие папки в корневом каталоге npm-пакета — это серьезный тревожный сигнал. Было задокументировано несколько хешей SHA-256 этого файла.Администраторы могут сравнивать их с архивами установленных пакетов или кэшированными архивами tar в внутренних реестрах, чтобы выявлять заведомо некорректные копии.
В зараженных системах временные каталоги, названные с помощью trinnyyyy- Префикс, за которым следуют шесть случайных буквенно-цифровых символов во временной папке операционной системы, также может указывать на предыдущее выполнение. Эти каталоги используются, когда загрузка и подготовка среды выполнения Bun, необходимой для внутренней полезной нагрузки..
Помимо конкретного пакета-генератора, организациям следует анализировать данные аудита npm, внутренние зеркала пакетов и журналы CI. неожиданный binding.gyp файлы или внезапное появление preinstall крючки в пакетах, которые ранее не использовали нативные дополнения или скрипты жизненного цикла. В контексте TanStack Query это обычно означает внимательное изучение любых инструментов генерации кода или интеграции с OpenAPI, которые подключаются к React, Vue или другим фронтендам.
Наконец, стоит внимательно изучить активность на GitHub. Репозитории с описаниями, соответствующими «Trinitite: Sponsored by Preview 2 Effects», или с results/doubletrinnys-*.json файлы и сообщения о коммитах, например "meow meow meow"Следует провести расследование, поскольку это потенциальные точки утечки данных, связанные с некорректным использованием npm-пакета TanStack Query.
Что могут сделать команды, активно использующие запросы TanStack, прямо сейчас?
Для большинства организаций первым шагом является Проводится инвентаризация того, где и как используются TanStack Query и связанные с ним инструменты npm.Потому что скомпрометированный пакет генерирует хуки специально для @tanstack/react-queryОно, как правило, встречается в проектах со строгой типизацией и автоматизированными конвейерами генерации OpenAPI-клиентов, часто напрямую интегрированными в CI.
Командам следует проверить, не содержатся ли какие-либо из перечисленных вредоносных версий. @7nohe/openapi-react-query-codegen всегда присутствовали в package-lock.json, pnpm-lock.yaml или yarn.lock файлы или включены в деревья зависимостей через транзитивные зависимости. Даже если пакет больше не установлен, история его использования на агентах сборки может потребовать более тщательного исследования.
В случаях подозрения на компромисс следует сосредоточить параллельные усилия на вращающиеся токены и учетные данные, собранные вредоносным ПОЭто включает в себя персональные токены доступа GitHub, токены публикации npm, ключи доступа к облаку и любые долговременные секреты, хранящиеся в переменных окружения или в текстовом виде в конфигурационных файлах на CI-серверах. Облачные провайдеры обычно ведут журналы sts:GetCallerIdentity и аналогичные звонки, которые могут помочь сузить период воздействия.
Инструменты обеспечения безопасности цепочки поставок, специализирующиеся на сканировании npm-пакетов на наличие вредоносного ПО, могут помочь выявить заражения, которые ускользнули от традиционных сканеров уязвимостей. Некоторые платформы уже классифицируют эту кампанию как критическую проблему с уровнем серьезности 100/100 и предоставляют ежедневное повторное сканирование или проверку по запросу для репозиториев, использующих TanStack Query и связанные с ним зависимости.
В перспективе организации, которые активно используют TanStack Query, @tanstack/react-query или @tanstack/vue-query В процессе производства может потребоваться усилить меры предосторожности при установке пакетов. Это может включать в себя следующее: реестры прокси, блокирующие заведомо вредоносные версии, инструменты, перехватывающие такие команды, как npm install or pnpm add и сверять пакеты с источниками информации об угрозах.а также более строгое использование проверки происхождения и подписи — с оговоркой, что скомпрометированные конвейеры CI все еще могут выдавать «действительные» подтверждения, как показано здесь.
Поскольку фронтенд-технологии все чаще стандартизируют использование библиотек, таких как TanStack Query, для получения и кэширования данных, злоумышленники, вероятно, продолжат исследовать окружающую экосистему генераторов, CLI и плагинов, опубликованных в npm . Этот инцидент подчеркивает, как, казалось бы, узкоспециализированный пакет утилит — тот, который просто генерирует хуки TanStack Query из файла OpenAPI — может стать серьезной точкой входа в системы сборки, монорепозитории и облачную инфраструктуру, если его не защитить.
Раскрытие тринититовой кампании против @7nohe/openapi-react-query-codegen подчеркивает, как Популярные npm-пакеты, связанные с использованием TanStack Query, могут незаметно превратиться в векторы атак на цепочку поставок. когда их рабочие процессы выпуска скомпрометированы. Путем злоупотребления binding.gypИспользуя обфусцированные загрузчики JavaScript и утечку данных через GitHub, злоумышленникам удалось спрятать масштабный инструмент для кражи учетных данных внутри инструмента, который многие команды рассматривали как обычную вспомогательную систему. Для организаций, которые используют TanStack Query в React и других фронтендах, усиление контроля за npm, мониторинг подозрительных скриптов жизненного цикла и укрепление конвейеров CI вокруг OpenAPI и инструментов генерации кода запросов перестали быть необязательными дополнениями и стали частью основной модели управления рисками.