Pachetul npm TanStack Query vizat de un instrument de generare a codului OpenAPI compromis

Ultima actualizare: 08/29/2026
  • Mai multe versiuni compromise din @7nohe/openapi-react-query-codegen a injectat programe malware în proiecte folosind hook-uri bazate pe TanStack Query.
  • Atacatorul a abuzat de o binding.gyp evadare din sandbox și preinstalați scripturi pentru a executa o sarcină utilă JavaScript ofuscată în timpul instalării npm.
  • Sarcina utilă colectează acreditări extinse de cloud și de dezvoltatori, exfiltrându-le în depozite GitHub controlate de atacatori.
  • Jetoanele furate sunt apoi folosite pentru a răspândește malware-ul la mai multe pachete npm și repozitorii GitHub, otrăvind lanțul de aprovizionare JavaScript mai larg.

Ilustrarea pachetului TanStack Query npm

Pentru echipele care se bazează pe TanStack Query ca pachet npm de referință pentru gestionarea stării serverului în React și alte framework-uri front-end, un incident recent în lanțul de aprovizionare arată cât de repede poate fi subminată această încredere. Un instrument popular, construit special pentru a genera hook-uri TanStack Query sigure pentru tipuri din scheme OpenAPI, a fost transformat discret în armă și introdus în registry-ul npm cu o sarcină utilă sofisticată de malware.

Cercetătorii în domeniul securității descriu atacul ca pe o campanie în stilul TeamPCP , care reutilizează multe dintre elementele teatrale și modelele tehnice observate în incidentele anterioare. De data aceasta, însă, accentul se pune în mod direct pe dezvoltatorii care își construiesc stratul de date folosind pachetul @7nohe/openapi-react-query-codegen, un utilitar care promite să economisească timp prin generarea automată de hook-uri TanStack Query în loc să scrie manual șabloane.

stare stabilă de javascript 2025
Articol asociat:
Starea stabilă a JavaScript-ului modern

Cum a devenit un generator de cod TanStack Query un vehicul de livrare a programelor malware

Pachetul din centrul incidentului, @7nohe/openapi-react-query-codegen , este conceput să preia o specificație OpenAPI și să emită hook-uri complet tipizate, compatibile cu TanStack Query. Cu peste 150,000 de descărcări săptămânale, se află în calea critică pentru multe echipe care standardizează TanStack Query pentru a orchestra preluarea, memorarea în cache și sincronizarea datelor backend în frontend-urile lor bazate pe React.

Conform analizelor post-mortem, atacatorul a reușit să compromită atât pachetul npm, cât și depozitul său GitHub . Încălcarea a fost realizată prin exploatarea unei vulnerabilități într-unul dintre fluxurile de lucru GitHub Actions ale proiectului, ceea ce înseamnă că versiunile rău intenționate păreau să provină din conducta legitimă de CI și erau livrate cu atestări de proveniență valide. Aceste atestări criptografice, în mod normal un semnal puternic de încredere pentru utilizatorii npm, au devenit înșelătoare odată ce fluxul de lucru în sine a fost sub control ostil.

Într-un interval de timp restrâns de aproximativ douăzeci de minute, atacatorul a publicat zece versiuni otrăvite ale pachetului către npm, fiecare conținând cod conceput să se execute în timpul instalării și să booteze o sarcină utilă de malware în mai multe etape. Versiunile afectate acoperă mai multe versiuni minore și de patch-uri, toate acestea ar trebui acum tratate ca nefiind de încredere.

  • @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

Toate aceste variante au aceeași intenție de bază: să profite de popularitatea pachetului în rândul utilizatorilor TanStack Query pentru a obține execuția de cod în timpul instalării npm și apoi să se extindă prin lanțul de aprovizionare JavaScript mai larg.

Sarcina utilă „Trinitite” și trucurile sale de execuție în timpul instalării

Malware-ul se identifică sub eticheta de ironie „Trinitită: Sponsorizat de Preview 2 Effects”, o referință la materialul sticlos format în urma testelor nucleare. Nume anterioare de scripturi interne, cum ar fi is_it_this_simple.js sugerează atitudinea nonșalantă a atacatorului, dar tehnica de bază este orice altceva decât simplistă.

Cârligul de execuție principal se bazează pe un binding.gyp evadare din sandboxÎn proiectele Node.js normale, binding.gyp este folosit pentru a configura addon-uri native compilate de node-gyp, dar aici este transformat în armă. Când npm întâlnește un fișier binding.gyp, node-gyp îl evaluează. conditions câmp folosind Python. Atacatorul introduce o expresie Python construită cu grijă în acel câmp, exploatând ierarhia de clase a Python pentru a ieși din sandbox-ul așteptat și a rula comenzi shell arbitrare.

În pachetul compromis, expresia condițiilor este puternic ofuscată de Unicode și caractere hexadecimale de evadareOdată decodificat, parcurge codul intern al Python-ului __subclasses__ copac pentru a localiza catch_warnings clasă, folosește asta ca pivot pentru a ajunge __builtins__, importă os modul și în final apeluri os.system() pentru a lansa sarcina principală cu Node. type Câmpul din binding.gyp este codificat în hexadecimal ca none, deci nu se încearcă nicio compilare nativă autentică; configurația există doar pentru a introduce ilegal o singură comandă shell.

Această abordare înseamnă că pachetul poate executa cod rău intenționat în timpul instalării chiar dacă nu există o explicație explicită preinstall script definit în package.json. Nu toate versiunile otrăvite se bazează însă pe acest truc. Două versiuni preliminare folosesc hook-uri de preinstalare mai simple: una execută un script Node numit nu.js direct, în timp ce altul preia runtime-ul Bun prin wget conectat la bash și apoi rulează numele potrivit is_it_this_simple.jsVersiunile ulterioare combină ambele metode, livrând un fișier binding.gyp rău intenționat. și a preinstall intrare care indică aceeași sarcină utilă principală JavaScript pentru redundanță.

Straturi de ofuscare și evitarea sandbox-ului în sarcina utilă principală JavaScript

Odată ce hook-ul inițial se declanșează, atacul se concentrează pe un fișier JavaScript mare numit 3FWCvzduYZg.js , plasat în rădăcina pachetului npm. Cu o dimensiune de aproximativ 5.4 MB și redus la o singură linie, scriptul este conceput să fie cât mai opac posibil dintr-o privire, iar analize ulterioare arată că este protejat de mai multe straturi distincte de criptare și ofuscare.

Stratul cel mai exterior este alcătuit dintr-un matrice de numere întregi cu 1.6 milioane de elemente, decriptat cu un simplu XOR împotriva constantei 29. Această decriptare produce un script secundar a cărui sarcină este de a recupera în liniște runtime-ul Bun, salvându-l sub un nume de fișier temporar cu un trinnyyyy-XXXXX model în directorul temporar al sistemului și apoi utilizați Bun pentru a executa sarcina utilă reală a nucleului. Nucleul în sine este încapsulat în criptare AES-128-GCM și apoi trecut prin cifruri personalizate pe lângă tehnicile standard de ofuscare JavaScript, inclusiv cele observate în instrumente populare precum obfuscator.io.

Complet despachetată, această sarcină utilă profund stratificată dezvăluie o combinație de capabilități: un instrument de recoltare a credențiale care vizează o gamă largă de platforme cloud și de dezvoltare, o componentă de vierme capabilă să răspândească infecția către noi ținte și un canal de comandă distructiv. Înainte de activarea oricăruia dintre acestea, scriptul efectuează o serie de verificări de mediu pentru a evita sandbox-urile și instrumentele de securitate, ieșind discret dacă sunt îndeplinite anumite condiții indicatoare.

Printre cecuri se numără indicatori de localizare, mediu și sistem de fișiere asociat în mod obișnuit cu mediile de cercetare. Malware-ul se deblochează dacă setările regionale ale sistemului sunt rusești, dacă sunt prezente directoare aparținând unor produse de securitate endpoint precum CrowdStrike, SentinelOne sau Carbon Black, dacă directorul de lucru curent se potrivește cu căile utilizate de instrumentele de scanare a lanțului de aprovizionare cunoscute sau dacă variabilele de mediu conțin acreditări false utilizate de scanerele de securitate. De asemenea, analizează GITHUB_REPOSITORY_OWNER și prezența unor instrumente de consolidare a securității, cum ar fi StepSecurity harden-runner, evitând conturile GitHub despre care se știe că aparțin cercetătorilor în domeniul securității.

Ce fură malware-ul din mediile de dezvoltare bazate pe TanStack Query

Odată ce verificările de mediu sunt trecute, malware-ul începe să colecteze acreditări cu o rețea largă. Deși pachetul original este conceput ca un ajutor pentru utilizatorii TanStack Query, suprafața țintă reală se întinde mult dincolo de o singură bibliotecă, atingând aproape fiecare strat al lanțului de instrumente și al stivei cloud a unui dezvoltator JavaScript modern.

Din partea dezvoltatorului, sarcina utilă scanează pentru Jetoane de acces personal GitHub în mai multe formate, inclusiv token-uri clasice care încep cu gho or ghp și jetoane mai noi, cu granulație fină, care încep cu github_pat_Pe rulotatorii GitHub Actions, solicită și token-uri OpenID Connect prin intermediul documentelor ACTIONS_ID_TOKEN_REQUEST_TOKEN și ACTIONS_ID_TOKEN_REQUEST_URL variabile de mediu, oferind atacatorului o cale de a presupune identități ale sarcinilor de lucru, în loc de simple secrete statice.

Scriptul se orientează apoi către registrele de limbaj comun. Acesta citește Token-uri npm, PyPI și RubyGems din fișiere de configurare, cum ar fi ~/.npmrc, scanează pentru informații locale suplimentare despre proiect .npmrc fișiere și încearcă să valideze token-urile purtătoare npm descoperite prin apelarea funcției /-/whoami endpoint în registrul public. Modele similare sunt utilizate pentru PyPI și RubyGems, extragând datele de autentificare și confirmând că fiecare token poate comunica cu succes cu registrul respectiv înainte de a-l exfiltra.

Amprenta în cloud este și mai mare. Pe Amazon Web Services, malware-ul enumeră variabile de mediu precum AWS_ACCESS_KEY_ID și AWS_SECRET_ACCESS_KEY, analizează ~/.aws/credentials și ~/.aws/configși interoghează Serviciul de metadate al instanței EC2 la 169.254.169.254, preferând IMDSv2, dar renunțând la el după cum este necesar. Pentru sarcinile de lucru din containere, comunică cu punctul final de metadate ECS la 169.254.170.2Orice acreditări sau token-uri temporare pe care le recuperează sunt testate în raport cu sts:GetCallerIdentity pentru a confirma validitatea înainte de a fi pus în coadă pentru exfiltrare.

O logică comparabilă este prezentă și pentru alți furnizori de cloud. Scriptul poate colecta Acreditări client Azure și identități gestionate, inclusiv AZURE_CLIENT_ID, AZURE_CLIENT_SECRET și AZURE_TENANT_ID, apoi accesează Azure Key Vault, Azure Resource Manager și Microsoft Graph odată autentificat. Pentru Google Cloud, caută GOOGLE_APPLICATION_CREDENTIALS fișiere, interoghează serverul de metadate GCP la metadata.google.internal și, atunci când este posibil, folosește token-urile rezultate pentru a apela Google Secret Manager. Implementările HashiCorp Vault sunt, de asemenea, pe listă: sarcina utilă caută adrese și token-uri Vault prin intermediul variabilelor de mediu și al fișierelor de token-uri, apoi sondează API-ul HTTP al Vault pentru a enumera secretele accesibile.

Dincolo de IAM în cloud, malware-ul efectuează o acțiune extinsă scanare sistem de fișiere folosind peste 150 de modele globCaută chei private SSH, configurații Docker, .env fișiere, depozite de credențiale Git, .npmrc și .pypirc fișiere, acreditări Terraform și cargo, fișiere istoric shell, date portofel criptomonedar și directoare de configurare pentru aplicații de mesagerie utilizate pe scară largă, cum ar fi Signal, Telegram Desktop, Discord, Slack și Element. De asemenea, verifică fișierele de configurare VPN de la servicii precum NordVPN, ProtonVPN, CyberGhost, PIA și altele, împreună cu token-uri și domenii pentru manageri de depozite binare precum JFrog Artifactory.

Exfiltrare prin repozitorii GitHub și commit-urile „miau miau miau”

După ce colectează toate aceste secrete, malware-ul are nevoie de un loc unde să le trimită. În loc să utilizeze un domeniu fix de comandă și control care ar putea fi ușor blocat, atacatorii se bazează pe depozitele publice GitHub ca un canal de exfiltrare , combinând datele furate în fluxul normal al traficului dezvoltatorilor.

Sarcina utilă caută mai întâi în istoricul public al commit-urilor GitHub mesaje care corespund unui model specific care încorporează un token criptat la vedere, folosind o frază care îi mustră pe utilizatori pentru revocarea acestuia. Odată ce este găsită o astfel de commit, malware-ul decriptează token-ul încorporat și folosește contul asociat pentru a crea un nou depozit unde vor fi stocate datele furate. Această indirectare înseamnă că acreditările preluate de la o victimă sunt salvate în depozite deținute tehnic de un alt utilizator GitHub, ceea ce face ca rețeaua de depozite compromise să fie mai greu de urmărit până la o singură identitate a atacatorului.

Depozitele nou create au nume fanteziste, generate automat compus din două personaje din seria Touhou Project și un număr aleatoriu, rezultând combinații precum cirno-marisa-74291 or reimu-kogasa-12048Descrierile lor sunt setate cu aceeași sintagmă „Trinitite: Sponsorizat de Preview 2 Effects” care se vede în payload, oferind unul dintre singurele indicatoare clare pentru apărătorii care încearcă să identifice aceste depozite la scară largă.

Acreditările furate sunt salvate ca fișiere JSON criptate în interiorul unui results/ director, folosind nume de fișiere care încep cu doubletrinnys- urmat de un contor și o marcă temporală. Fiecare fișier conține un envelope câmp care conține pachetul de date criptate și un key câmp care conține cheia de criptare în sine, încapsulată în continuare folosind cheia publică RSA a atacatorului. La o privire superficială, acestea arată ca niște pete criptate arbitrare. Doar cineva cu cheia privată corespunzătoare poate inversa procesul, așa că, chiar dacă depozitele sunt găsite, secretele reale rămân opace pentru terțiMesajele de commit sunt de obicei scurte și superficiale, cu șiruri de caractere precum „miau miau miau” folosite în mod repetat.

Propagare asemănătoare viermilor în alte pachete npm și proiecte GitHub

Unul dintre cele mai îngrijorătoare aspecte ale campaniei Trinitite este capacitatea sa de a reutiliza token-uri furate pentru a compromite pachete și depozite suplimentare . În loc să se limiteze la pachetul original al generatorului de cod TanStack Query, malware-ul se comportă ca un vierme, căutând sistematic modalități de răspândire.

Cu un token npm valid în mână, sarcina utilă interoghează API-ul npm pentru a enumera toate token-urile asociate contului, selectând token-ul de publicare cu cele mai privilegii. Apoi efectuează o căutare pentru fiecare pachet deținut de respectivul responsabil, descarcă fișierul tar existent pentru fiecare și injectează același fișier sandbox escape binding.gyp și fișierul principal de utilă utilă în conținutul pachetului. După modificări, publică o nouă versiune pe npm sub numele responsabilului legitim, transformând efectiv pachetele de încredere în noi vectori de infecție . Un comportament similar este implementat pentru PyPI și RubyGems prin intermediul punctelor finale de încărcare respective, verificările de certificat TLS fiind dezactivate în cererile de ieșire pentru a evita problemele de fixare pe partea clientului.

Depozitele GitHub sunt tratate într-un mod comparabil. Când malware-ul obține un token GitHub cu un domeniu de aplicare suficient, acesta listează fiecare depozit și ramură accesibilă, omițând câteva ramuri de automatizare cunoscute, cum ar fi cele cu prefixul release/, dependabot/, renovate/ or copilot/Pentru ramurile rămase, acesta comită un set de fișiere atent selectate, care servesc atât ca backdoor-uri, cât și ca hook-uri în instrumentele de dezvoltare moderne.

Printre acestea se numără fișiere de configurare VS Code și Claude cu backdoor, inclusiv .vscode/tasks.json, .claude/settings.json și scenarii ca setup.mjs care sunt executate atunci când un dezvoltator deschide un proiect în anumite editoare asistate de inteligență artificială. De asemenea, malware-ul lansează o versiune falsă .github/workflows/codeql.yml flux de lucru care se deghizează în scanare de securitate, oferind în același timp un alt canal pentru execuția de cod în cadrul CI. Fișierele suplimentare sunt direcționate către alți editori și instrumente, cum ar fi Gemini, Cursor și diverși asistenți de cod, ajutând atacatorul să mențină persistența oriunde lucrează dezvoltatorii.

Fiecare dintre aceste commit-uri este creat sub licența github-actions identitate, cu mesaje care arată ca niște mesaje de întreținere de rutină, cum ar fi „sarcină: actualizare dependențe” și o semnalizare a trailerului skip-checks:true să treacă de verificările obligatorii. Pentru o echipă ocupată care scanează dintr-o privire jurnalele de commit-uri, aceste modificări pot fi ușor confundate cu actualizări de automatizare inofensive.

Indicatori de compromis pentru echipele care utilizează instrumentele TanStack Query

Pentru organizațiile care se bazează pe TanStack Query și au integrat @7nohe/openapi-react-query-codegen în fluxul lor de lucru, identificarea expunerii potențiale începe cu indicatori la nivel de versiune și fișier pe care mai multe surse i-au evidențiat acum. Aceste indicii pot ajuta la identificarea proiectelor care ar fi putut rula codul compromis în timpul pașilor de instalare.

Orice utilizare a versiunilor afectate ale @7nohe/openapi-react-query-codegen enumerate anterior ar trebui tratată ca suspectă, mai ales dacă versiunile au fost efectuate pe infrastructură CI partajată sau pe laptopuri de dezvoltatori cu acces la acreditări sensibile. Echipele de securitate sunt sfătuite să auditeze fișierele de blocare, istoricul package.json și jurnalele de versiuni pentru a confirma dacă aceste versiuni au fost vreodată introduse în medii de producție sau de testare.

Pe disc, un semn cheie al compromiterii este prezența fișierului 3FWCvzduYZg.js la rădăcina pachetului . Investigatorii au catalogat mai multe hash-uri SHA-256 asociate cu diferite versiuni ofuscate ale acestui script, toate legate de aceeași funcționalitate de bază:

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

În plus, multe gazde infectate creează directoare temporare cu nume care încep cu trinnyyyy- urmat de un scurt șir de caractere alfanumerice aleatorii în folderul temporar al sistemului. Deși acest model în sine nu dovedește un compromis, în combinație cu un fișier binding.gyp suspect și unul dintre hash-urile cunoscute ale sarcinii utile, crește semnificativ probabilitatea ca malware-ul Trinitite să se fi executat pe sistemul respectiv.

Unii furnizori de servicii de securitate au integrat deja acești indicatori în fluxurile lor de detectare. De exemplu, platformele axate pe instrumente pentru dezvoltatori și securitatea lanțului de aprovizionare marchează acum orice depozit sau proiect care importă versiunile afectate ca o problemă critică de malware , adesea evaluându-l la nivelul maxim de severitate pentru a declanșa o investigație imediată. Echipele sunt încurajate să efectueze rescanări în cadrul organizațiilor lor, în special în mediile în care TanStack Query este esențial pentru arhitectura aplicațiilor, iar instrumentele de generare de cod sunt utilizate pe scară largă.

Apar instrumente specializate și utilitare open-source care se află în fața npm, yarn, pnpm și a managerilor de pachete aferenti, verificând versiunile pachetelor în raport cu fluxurile de informații selectate înainte de instalare. Ideea este de a intercepta pachetele rău intenționate sau suspecte, în special cele legate de incidente precum acesta, înainte ca acestea să ajungă în server. node_modules, reducând riscul ca o bibliotecă auxiliară compromisă să poată expune indirect Aplicații bazate pe TanStack Query și infrastructura aferentă acestora.

Pentru echipele de dezvoltare, acest incident subliniază modul în care un pachet aparent inofensiv - unul care generează pur și simplu hook-uri tipizate pentru TanStack Query dintr-o specificație OpenAPI - poate deveni un vector de atac puternic atunci când canalul său de CI și canalul de distribuție sunt subminate. Măsurile defensive trebuie acum să se extindă dincolo de verificarea principalelor dependențe ale aplicației pentru a include generatoarele, CLI-urile și scripturile de automatizare care modelează în liniște modul în care aceste dependențe sunt utilizate zilnic.

Postări asemănatoare: