TanStack Query npm-pakke målrettet gjennom kompromittert OpenAPI-kodegenereringsverktøy

Siste oppdatering: 08/29/2026
Forfatter: C SourceTrail
  • Flere kompromitterte utgivelser av @7nohe/openapi-react-query-codegen injiserte skadelig programvare i prosjekter ved hjelp av TanStack Query-baserte hooks.
  • Angriperen misbrukte en binding.gyp sandkasseflukt og forhåndsinstaller skript for å kjøre en obfuskert JavaScript-nyttelast under npm-installasjonen.
  • Nyttelasten innhenter omfattende sky- og utviklerlegitimasjon, og eksfiltrerer dem til angriperkontrollerte GitHub-repositorier.
  • Stjålne tokens brukes deretter til å spre skadevaren til flere npm-pakker og GitHub-repoer, noe som forgifter den bredere JavaScript-forsyningskjeden.

Illustrasjon av TanStack Query npm-pakke

For team som bruker TanStack Query som sin foretrukne npm-pakke for å administrere servertilstand i React og andre front-end-rammeverk, viser en nylig hendelse i forsyningskjeden hvor raskt denne tilliten kan undergraves. Et populært tilhørende verktøy, bygget spesielt for å generere typesikre TanStack Query-hooks fra OpenAPI-skjemaer, ble i det stille gjort til et våpen og sendt til npm-registeret med en sofistikert malware-nyttelast innebygd.

Sikkerhetsforskere beskriver angrepet som en TeamPCP-lignende kampanje som gjenbruker mange av de teatralske og tekniske mønstrene som ble sett i tidligere hendelser. Denne gangen er imidlertid fokuset utelukkende på utviklere som bruker pakken @7nohe/openapi-react-query-codegen til å bygge opp datalaget sitt, et verktøy som lover å spare tid ved å automatisk generere TanStack Query-hooks i stedet for å skrive standardtekst for hånd.

estado estable de javascript 2025
Relatert artikkel:
Den stabile tilstanden til moderne JavaScript

Hvordan en TanStack Query-kodegenerator ble et kjøretøy for levering av skadelig programvare

Pakken som er sentral i hendelsen, @7nohe/openapi-react-query-codegen , er designet for å ta en OpenAPI-spesifikasjon og sende ut fullstendig typede hooks som er kompatible med TanStack Query. Med over 150 000 ukentlige nedlastinger ligger den i den kritiske banen for mange team som standardiserer TanStack Query for å orkestrere henting, mellomlagring og synkronisering av backend-data i sine React-baserte frontender.

Ifølge obduksjonen klarte angriperen å kompromittere både npm-pakken og GitHub-repositoriet . Innbruddet ble oppnådd ved å utnytte en sårbarhet i en av prosjektets GitHub Actions-arbeidsflyter, noe som betyr at de ondsinnede byggene fortsatt så ut til å komme fra den legitime CI-pipelinen og ble levert med gyldige proveniensbekreftelser. Disse kryptografiske bekreftelsene, som vanligvis er et sterkt tillitssignal for npm-brukere, ble misvisende når selve arbeidsflyten var under fiendtlig kontroll.

I løpet av et smalt vindu på rundt tjue minutter publiserte angriperen ti forgiftede versjoner av pakken til npm, hver med kode designet for å kjøres under installasjon og starte opp en flertrinns skadelig programvarenyttelast. De berørte utgivelsene spenner over flere mindre og oppdateringsversjoner, som alle nå skal behandles som uklarerte.

  • @7nohe/openapi-react-query-codegen@0.5.4
  • @7nohe/openapi-react-query-codegen@0.5.5
  • @7nohe/openapi-react-query-codegen@1.6.3
  • @7nohe/openapi-react-query-codegen@1.6.4
  • @7nohe/openapi-react-query-codegen@2.2.1
  • @7nohe/openapi-react-query-codegen@2.2.2
  • @7nohe/openapi-react-query-codegen@3.0.3
  • @7nohe/openapi-react-query-codegen@3.0.4
  • @7nohe/openapi-react-query-codegen@0.0.0-365d4eb738d3146583431948d3ba6e27a32556be
  • @7nohe/openapi-react-query-codegen@0.0.0-ec7876d6c917dad516ba69bbfafc948b834bf0ab

Alle disse variantene deler den samme grunnleggende hensikten: å dra nytte av pakkens popularitet blant TanStack Query-brukere for å få kodekjøring under npm-installasjonen, og deretter spre den ut gjennom den bredere JavaScript-forsyningskjeden.

Nyttelasten «Trinitite» og triksene for utførelse under installasjon

Skadevaren identifiserer seg med den ironiske etiketten «Trinitite: Sponset av Preview 2 Effects», en referanse til det glassaktige materialet som dannes av atomprøvesprengninger. Tidligere interne skriftnavn som is_it_this_simple.js antyder angriperens avslappede holdning, men den underliggende teknikken er alt annet enn forenklet.

Den primære utførelseskroken henger på en binding.gyp sandkassefluktI vanlige Node.js-prosjekter brukes binding.gyp til å konfigurere native tillegg kompilert av node-gyp, men her er det et våpen. Når npm støter på en binding.gyp-fil, evaluerer node-gyp dens conditions feltet ved hjelp av Python. Angriperen setter inn et nøye konstruert Python-uttrykk i det feltet, og utnytter Pythons klassehierarki til å bryte ut av den forventede sandkassen og kjøre vilkårlige skallkommandoer.

I den kompromitterte pakken er betingelsesuttrykket sterkt tilslørt med Unicode- og heksadesimale escape-koderNår den er dekodet, går den gjennom Pythons interne __subclasses__ treet for å finne catch_warnings klasse, bruker det som et omdreiningspunkt for å nå __builtins__, importerer os modul og til slutt kaller os.system() å starte hovednyttelasten med Node. The type Feltet i binding.gyp er heksadesimalkodet som none, så ingen ekte, native build blir forsøkt; konfigurasjonen eksisterer utelukkende for å smugle inn en enkelt skallkommando.

Denne tilnærmingen betyr at pakken kan kjøre skadelig kode under installasjon selv om det ikke finnes noe eksplisitt preinstall skript definert i package.json. Ikke alle de forgiftede versjonene er avhengige av akkurat dette trikset. To forhåndsutgivelser bruker enklere forhåndsinstallasjonskroker: én kjører et Node-skript kalt nu.js direkte, mens en annen henter Bun-kjøretiden via wget rørlagt til bash og kjører deretter det passende navngitte is_it_this_simple.jsSenere versjoner kombinerer begge metodene og sender en ondsinnet binding.gyp. og a preinstall oppføring som peker til den samme primære JavaScript-nyttelasten for redundans.

Obfuskasjonslag og sandkasseunngåelse i hoved-JavaScript-nyttelasten

Når den første hooken utløses, dreier angrepet seg om til en stor JavaScript-fil kalt 3FWCvzduYZg.js , som er plassert i roten av npm-pakken. Med sine omtrent 5.4 MB og minimert til én linje, er skriptet designet for å være så ugjennomsiktig som mulig ved første øyekast, og videre analyse viser at det er beskyttet av flere distinkte krypterings- og obfuskasjonslag.

Det ytterste laget består av en 1.6 millioner elementer heltallsmatrise, dekryptert med en enkel XOR mot konstanten 29. Den dekrypteringen gir et sekundært skript hvis jobb er å hente Bun-kjøretiden stille, og lagre den under et midlertidig filnavn med en trinnyyyy-XXXXX mønster i systemets midlertidige katalog, og bruk deretter Bun til å kjøre den virkelige kjernenyttelasten. Selve kjernen er pakket inn i AES-128-GCM-kryptering og deretter ført gjennom tilpassede chiffer i tillegg til standard JavaScript-obfuskeringsteknikker, inkludert de som sees i populære verktøy som obfuscator.io.

Fullstendig utpakket avslører denne dypt lagdelte nyttelasten en blanding av funksjoner: en legitimasjonsinnhøster som retter seg mot et bredt spekter av sky- og utviklerplattformer, en ormkomponent som kan spre infeksjonen til nye mål, og en destruktiv kommandokanal. Før noe av dette aktiveres, utfører skriptet en rekke miljøkontroller for å unngå sandkasser og sikkerhetsverktøy, og avsluttes stille hvis visse avslørende betingelser er oppfylt.

Blant sjekkene er indikatorer for språk, miljø og filsystem ofte assosiert med forskningsmiljøer. Skadevaren unnslipper hvis systemspråket er russisk, hvis kataloger som tilhører endepunktsikkerhetsprodukter som CrowdStrike, SentinelOne eller Carbon Black er til stede, hvis den gjeldende arbeidskatalogen samsvarer med stier som brukes av kjente skanneverktøy for forsyningskjeden, eller hvis miljøvariabler inneholder falske legitimasjonsopplysninger som brukes av sikkerhetsskannere. Den ser også på GITHUB_REPOSITORY_OWNER og tilstedeværelsen av herdingsverktøy som StepSecuritys harden-runner, og holder seg unna GitHub-kontoer som er kjent for å tilhøre sikkerhetsforskere.

Hva skadevaren stjeler fra TanStack Query-baserte utviklingsmiljøer

Når miljøkontrollene er bestått, begynner skadevaren å høste legitimasjonsinformasjon over et bredt nett. Selv om den opprinnelige pakken er innrammet som en hjelper for TanStack Query-brukere, når den faktiske målflaten langt utover et enkelt bibliotek, og berører nesten hvert lag i en moderne JavaScript-utviklers verktøykjede og skystabel.

På utviklersiden skanner nyttelasten etter GitHub personlige tilgangstokener i flere formater, inkludert klassiske tokens som starter med gho or ghp og nyere finkornede tokens som begynner med github_pat_På GitHub Actions-kjørere ber den også om OpenID Connect-tokens via den dokumenterte ACTIONS_ID_TOKEN_REQUEST_TOKEN og ACTIONS_ID_TOKEN_REQUEST_URL miljøvariabler, noe som gir angriperen en måte å anta arbeidsbelastningsidentiteter på i stedet for bare statiske hemmeligheter.

Skriptet går deretter over til vanlige språkregistre. Det leser npm-, PyPI- og RubyGems-tokens fra konfigurasjonsfiler som ~/.npmrc, skanner etter ytterligere prosjektlokal .npmrc filer og forsøk på å validere oppdagede npm-bærertokener ved å kalle /-/whoami endepunkt på det offentlige registeret. Lignende mønstre brukes for PyPI og RubyGems, som utvinner autentiseringsdata og bekrefter at hvert token kan kommunisere med det respektive registeret før det eksfiltreres.

Skyfotavtrykket er enda større. På Amazon Web Services lister skadevaren opp miljøvariabler som AWS_ACCESS_KEY_ID og AWS_SECRET_ACCESS_KEY, analyserer ~/.aws/credentials og ~/.aws/config, og spør EC2-instansens metadatatjeneste på 169.254.169.254, og foretrekker IMDSv2, men faller tilbake etter behov. For containerarbeidsbelastninger kommuniserer den med ECS-metadataendepunktet på 169.254.170.2All legitimasjon eller midlertidige tokener den gjenoppretter testes mot sts:GetCallerIdentity for å bekrefte gyldigheten før de settes i kø for eksfiltrering.

Tilsvarende logikk finnes for andre skyleverandører. Skriptet kan samle inn Azure-klientlegitimasjon og administrerte identiteter, Herunder AZURE_CLIENT_ID, AZURE_CLIENT_SECRET og AZURE_TENANT_ID, og deretter få tilgang til Azure Key Vault, Azure Resource Manager og Microsoft Graph når den er godkjent. For Google Cloud søker den etter GOOGLE_APPLICATION_CREDENTIALS filer, spør GCP-metadataserveren på metadata.google.internal og bruker, når det er mulig, de resulterende tokenene til å kalle Google Secret Manager. HashiCorp Vault-distribusjoner er også på listen: nyttelasten ser etter Vault-adresser og tokener via miljøvariabler og tokenfiler, og undersøker deretter Vaults HTTP API for å liste opp tilgjengelige hemmeligheter.

Utover skybasert IAM utfører skadevaren en omfattende filsystemsøk ved bruk av over 150 glob-mønstreDen jakter etter private SSH-nøkler, Docker-konfigurasjoner, .env filer, Git-legitimasjonslagre, .npmrc og .pypirc filer, Terraform- og Cargo-legitimasjon, shell-historikkfiler, kryptovaluta-lommebokdata og konfigurasjonskataloger for mye brukte meldingsapper som Signal, Telegram Desktop, Discord, Slack og Element. Den sjekker også etter VPN-konfigurasjonsfiler fra tjenester som NordVPN, ProtonVPN, CyberGhost, PIA og andre, sammen med tokens og domener for binære arkivadministratorer som JFrog Artifactory.

Eksfiltrering gjennom GitHub-repoer og «meow meow meow»-commitene

Etter å ha samlet alle disse hemmelighetene, trenger skadevaren et sted å sende dem til. I stedet for å bruke et fast kommando- og kontrolldomene som lett kan blokkeres, stoler angriperne på offentlige GitHub-repositorier som en eksfiltreringskanal , og blander stjålne data inn i den normale flyten av utviklertrafikk.

Nyttelasten søker først i GitHubs offentlige commit-historikk etter meldinger som samsvarer med et spesifikt mønster som legger inn et kryptert token i åpent skue, ved hjelp av en frase som skjeller ut brukere for å ha tilbakekalt det. Når en slik commit er funnet, dekrypterer skadevaren det innebygde tokenet og bruker den tilknyttede kontoen til å opprette et nytt arkiv der stjålne data skal lagres. Denne indirekte virkningen betyr at påloggingsinformasjon hentet fra ett offer lagres i arkiver som teknisk sett eies av en annen GitHub-bruker, noe som gjør nettverket av kompromitterte arkiver vanskeligere å spore tilbake til en enkelt angriperidentitet.

De nyopprettede arkivene har lunefulle, automatisk genererte navn sammensatt av to karakterer fra Touhou Project-serien og et tilfeldig tall, noe som resulterer i kombinasjoner som cirno-marisa-74291 or reimu-kogasa-12048Beskrivelsene deres er satt til den samme frasen «Trinitite: Sponsored by Preview 2 Effects» som ses i nyttelasten, noe som gir en av de få klare markørene for forsvarere som prøver å identifisere disse depotene i stor skala.

Stjålne legitimasjonsdetaljer lagres som krypterte JSON-filer i en results/ katalog, ved å bruke filnavn som starter med doubletrinnys- etterfulgt av en teller og et tidsstempel. Hver fil inneholder en envelope felt som inneholder den krypterte datapakken og en key felt som inneholder selve krypteringsnøkkelen, videre pakket inn med angriperens offentlige RSA-nøkkel. Ved første øyekast ser disse ut som vilkårlige krypterte klatter. Bare noen med den samsvarende private nøkkelen kan reversere prosessen, så selv om depotene blir funnet, faktiske hemmeligheter forblir ugjennomsiktige for tredjeparterCommit-meldinger er vanligvis korte og lettsindige, med strenger som «mjau mjau mjau» brukt gjentatte ganger.

Ormlignende forplantning til andre npm-pakker og GitHub-prosjekter

Et av de mest bekymringsfulle aspektene ved Trinitite-kampanjen er dens evne til å gjenbruke stjålne tokens for å kompromittere ytterligere pakker og databaser . I stedet for å begrense seg til den originale TanStack Query-kodegeneratorpakken, oppfører skadevaren seg som en orm, og søker systematisk etter måter å spre seg på.

Med et gyldig npm-token i hånden, spør nyttelasten npm API-et for å liste opp alle tokener som er tilknyttet kontoen, og velger det mest privilegerte publiseringstokenet. Deretter utfører den et søk etter hver pakke som eies av den vedlikeholderen, laster ned den eksisterende tarballen for hver, og injiserer den samme binding.gyp sandbox escape-filen og hovednyttelastfilen i pakkeinnholdet. Etter endringene publiserer den en ny versjon til npm under den legitime vedlikeholderens navn, noe som effektivt gjør pålitelige pakker om til nye infeksjonsvektorer . Lignende oppførsel implementeres for PyPI og RubyGems via deres respektive opplastingsendepunkter, med TLS-sertifikatkontroller deaktivert i utgående forespørsler for å unngå problemer med pinning på klientsiden.

GitHub-repositorier behandles på en sammenlignbar måte. Når skadevaren får tak i et GitHub-token med tilstrekkelig omfang, lister den opp alle tilgjengelige repositorier og grener, og hopper over noen få kjente automatiseringsgrener, for eksempel de som har prefikset release/, dependabot/, renovate/ or copilot/For de resterende grenene lagrer den et sett med nøye utvalgte filer som fungerer både som bakdører og som kroker inn i moderne utviklingsverktøy.

Blant disse er bakdørs VS Code og Claude-konfigurasjonsfiler, Herunder .vscode/tasks.json, .claude/settings.json og manus som setup.mjs som kjøres når en utvikler åpner et prosjekt i visse AI-assisterte redigeringsprogrammer. Skadevaren slipper også en falsk .github/workflows/codeql.yml en arbeidsflyt som utgir seg for å være en sikkerhetsskanning, samtidig som den gir en annen kanal for kodekjøring i CI. Ytterligere filer er målrettet mot andre redigeringsprogrammer og verktøy, som Gemini, Cursor og diverse kodeassistenter, noe som hjelper angriperen med å opprettholde utholdenhet uansett hvor utviklerne faktisk jobber.

Hver av disse commitene er forfattet under github-actions identitet, med meldinger som ser ut som rutinemessig vedlikehold, for eksempel «chore: update dependencies» og en trailerflagging skip-checks:true å glippe forbi nødvendige kontroller. For et travelt team som skanner commit-logger med et raskt blikk, kan disse endringene lett forveksles med uskyldige automatiseringsoppdateringer.

Indikatorer for kompromiss for team som bruker TanStack Query-verktøy

For organisasjoner som er avhengige av TanStack Query og har integrert @7nohe/openapi-react-query-codegen i arbeidsflyten sin, starter identifisering av potensiell eksponering med versjons- og filnivåindikatorer som flere kilder nå har fremhevet. Disse ledetrådene kan bidra til å finne ut hvilke prosjekter som kan ha kjørt den kompromitterte koden under installasjonstrinnene.

All bruk av de berørte versjonene av @7nohe/openapi-react-query-codegen som er nevnt tidligere, bør behandles som mistenkelig, spesielt hvis bygg ble utført på delt CI-infrastruktur eller utviklerbærbare datamaskiner med tilgang til sensitiv legitimasjon. Sikkerhetsteam anbefales å revidere låsefiler, package.json-historikk og byggelogger for å bekrefte om disse utgivelsene noen gang ble trukket inn i produksjons- eller stagingmiljøer.

På disk er et viktig tegn på kompromittering tilstedeværelsen av 3FWCvzduYZg.js-filen i pakkeroten . Etterforskere har katalogisert flere SHA-256-hasher knyttet til forskjellige obfuskerte versjoner av dette skriptet, alle knyttet til den samme underliggende funksjonaliteten:

  • 8e5d1af68ca340ae0c6e8132cb00c686ec2d60502c1994d94ce353d1472ad5a3
  • b49afb7dba04cd99b357ce7c652c823a3707f28e130bd5c6645851a7adc030d6
  • 59370c67b54a0ccaedd265e2356f04540b2fba1e1845300ef6de4d5437d99380
  • 778d6f0058045d6a2ab9a7e1d3e3be8e7e6b4d9cc217d13949bf1dfbab759a7c
  • b24d121667f21f492cb9db34fbfd515d5922a8dd30b9c45215c7220abbb10ca8
  • e1f1162ece9a6e6ea21a20399cbf31c563a8149d433a68711f4223870c203d5a
  • b6012b2ff87f08f93ee53921c48db907ddbcf5461b03bb988083b01a36886237
  • 709af2fdeb50324229e94c44c679a0fab18bd8e17d3864405989c526cbb63ad8

I tillegg oppretter mange infiserte verter midlertidige kataloger med navn som begynner med trinnyyyy- etterfulgt av en kort streng med tilfeldige alfanumeriske tegn i systemets midlertidige mappe. Selv om dette mønsteret alene ikke beviser et kompromittering, øker det i kombinasjon med en mistenkelig binding.gyp-fil og en av de kjente nyttelast-hashene, sannsynligheten for at Trinitite-skadevaren har kjørt på det systemet betydelig.

Noen sikkerhetsleverandører har allerede integrert disse indikatorene i sine deteksjonsfeeder. For eksempel flagger plattformer som fokuserer på utviklerverktøy og forsyningskjedesikkerhet nå ethvert arkiv eller prosjekt som importerer de berørte versjonene som et kritisk skadelig problem , og scorer det ofte på maksimal alvorlighetsgrad for å be om umiddelbar etterforskning. Team oppfordres til å kjøre nye skanninger på tvers av organisasjonene sine, spesielt i miljøer der TanStack Query er sentralt i applikasjonsarkitekturen og kodegenereringsverktøy er mye brukt.

Spesialiserte verktøy og åpen kildekode-verktøy dukker opp som ligger foran npm, yarn, pnpm og relaterte pakkebehandlere, og sjekker pakkeversjoner mot kuraterte etterretningsfeeder før installasjon. Tanken er å fange opp ondsinnede eller mistenkelige pakker, spesielt de som er knyttet til hendelser som denne, før de i det hele tatt lander i node_modules, noe som reduserer risikoen for at et kompromittert hjelpebibliotek indirekte kan eksponere TanStack Query-drevne applikasjoner og deres tilhørende infrastruktur.

For utviklingsteam understreker denne hendelsen hvordan en tilsynelatende uskyldig bekvemmelighetspakke – en som ganske enkelt genererer typede kroker for TanStack Query fra en OpenAPI-spesifikasjon – kan bli en kraftig angrepsvektor når CI-pipelinen og distribusjonskanalen undergraves. Forsvarstiltak må nå strekke seg utover å sjekke de viktigste applikasjonsavhengighetene til å inkludere generatorene, CLI-ene og automatiseringsskriptene som i det stille former hvordan disse avhengighetene brukes hver dag.

Relaterte innlegg: