- Useita @7nohe/openapi-react-query-codegen-versioita npm:ssä on vaarantunut, upottamalla hienostuneen haittaohjelmahyötyohjelman, joka väärinkäyttää TanStack Query -pohjaisia työnkulkuja.
- Hyökkäyksessä käytettiin binding.gyp-sandbox-pakoa ja esiasennusskriptejä. monikerroksisen JavaScript-varastuksen suorittamiseksi npm-asennuksen aikana, jopa ilman eksplisiittisiä elinkaarikoukkuja.
- Hyötyaineisto keräsi laajan valikoiman kehittäjien ja pilvipalveluiden tunnistetietoja (GitHub, npm, AWS, Azure, GCP, Vault, Kubernetes ja paljon muuta) ja suodatti ne julkisiin GitHub-arkistoihin.
- Mato käytti varastettuja tokeneita tartuttaakseen lisää npm-, PyPI- ja RubyGems-paketteja sekä GitHub-repositorioita., mikä korostaa TanStack Query npm:n käyttöön liittyvää laajempaa toimitusketjuriskiä.
Elokuun lopulla 2026 turvallisuustutkijat paljastivat kohdennettu toimitusketjuhyökkäys, joka on linkitetty TanStack Query npm -ekosysteemiin suositun OpenAPI-koodigeneraattorin kautta. Tapaus keskittyy pakettiin @7nohe/openapi-react-query-codegen, työkalu, joka luo automaattisesti tyyppiturvallisia hookkeja TanStack Querylle suoraan OpenAPI-skeemista ja jota on ladattu npm:ssä yli 150 000 kertaa viikossa.
Sen sijaan, että hyökkääjät olisivat itse hyökänneet TanStack Queryn ydinkirjastoihin, he vaaransivat ympäröivän työkalun, jota monet tiimit käyttävät TanStack Query -hookkien tuottamiseen , ja sisällyttivät monimutkaisen haittaohjelmasisällön generaattorin useisiin versioihin. Koska nämä hookit kytketään suoraan React- ja TypeScript-tuotantokoodikantoihin, vaikutus ulottuu paljon yhden paketin ulkopuolelle ja koskettaa kaikkia CI-putkia tai kehittäjäkoneita, jotka ovat asentaneet saastutetut versiot.
Kuinka hyökkäys väärinkäytti TanStack Query -koodigeneraattoria npm:ssä
Kyseinen kirjasto @7nohe/openapi-react-query-codegen, käytetään laajalti TanStack Query -koukkukerrosten telineenä OpenAPI-sopimuksista, mikä säästää tiimejä toistuvalta käsin kirjoitetulta hakulogiikalta. Noin 20 minuutin aikana hyökkääjä lähetti npm-rekisteriin kymmenen haitallista versiota tästä paketista, ja kaikissa niissä oli voimassa olevat GitHub Actionsin kautta luodut alkuperävahvistukset.
Nämä vahvistukset, jotka yleensä ovat vahva signaali eheydestä, menettivät merkityksensä, koska itse projektin GitHub Actions -työnkulku oli vaarantunut . Hyödyntämällä työnkulun haavoittuvuutta uhkatoimija pystyi lähettämään troijalaisen saastuttamia koontiversioita ja samalla luomaan kryptografisia todisteita siitä, että ne tulivat "virallisesta" prosessista. Vastaava GitHub-arkisto näyttää tulleen haltuun samalla siirrolla, mikä antoi hyökkääjälle täyden hallinnan julkaisuprosessista.
Kampanja heijastelee aiempia npm:ään liittyviä toimitusketjun häiriöitä, mutta lisää siihen oman käänteensä: se kohdistuu erityisesti OpenAPI-työkalujen ja TanStack-kyselyiden käytön leikkauspisteKoska generaattori tuottaa React-koodia, joka riippuu @tanstack/react-query, mikä tahansa organisaatio, joka on kytkenyt sen automaattiseen API-asiakasohjelmaansa, ottaa riskin siitä, että se on vetänyt haittaohjelman rakennusagentteihin, CI-ajoprosesseihin tai kehittäjien kannettaviin tietokoneisiin.
Tutkijat huomauttivat myös, että haittaohjelman brändäys – nimeltään " Trinitite: Sponsored by Preview 2 Effects " – heijastelee aiempien TeamPCP:hen liittyvien operaatioiden teatraalista tyyliä, vaikka onkin epäselvää, onko kyseessä kopioiden, sirpaleryhmän vai estetiikkaa lainaavan, asiaan liittymättömän toimijan työtä.
Binding.gyp-sandbox-pako: haittaohjelman käynnistäminen npm-asennuksen aikana
Yksi epätavallisimmista teknisistä valinnoista tässä TanStack Queryn viereisessä hyökkäyksessä on väärinkäyttö binding.gyp suoritusvektorina npm-asennuksen aikanaNormaalioloissa binding.gyp kuvaa, kuinka natiivit Node.js-lisäosat käännetään. Kun npm kohtaa tällaisen tiedoston, se kutsuu node-gyp, joka puolestaan arvioi conditions kenttä Pythonia käyttäen.
Haitalliset versiot @7nohe/openapi-react-query-codegen hyödyntää tätä käyttäytymistä upottamalla Python-hiekkalaatikkopeli conditions lohkoSen sijaan, että tiedosto sisältäisi vaarattoman koontikonfiguraation, se kulkee Pythonin sisäisen luokkahierarkian läpi päästäkseen catch_warnings luokka, kääntyy kohti __builtins__, tuonti osja lopulta soittaa os.system JavaScript-hyötykuorman suorittamiseksi Node.
Kun hämärrys on poistettu, ehto tiivistyy yhteen komentoon: node 3FWCvzduYZg.js suoritetaan automaattisesti asennuksen aikanaLoput binding.gyp sisältö on käytännössä savuverho: ilmoitettu kohteen nimi on merkityksetön, tyyppi on heksakoodattu none, eikä varsinaista natiivia käännöstä tapahdu.
Kaikki saastuneet julkaisut eivät luottaneet pelkästään tähän temppuun. Kaksi julkaisua edeltävää tunnistetta käytettiin tavanomaisesti preinstall skriptejä sen sijaan, yksi kutsuu paikallista tiedostoa nu.js ja toinen lataa Bun-ajonaikaisen sovelluksen kautta wget johdettu bash ennen kuin aloitat röyhkeästi nimetyn skriptin is_it_this_simple.jsMyöhemmät versiot kaksinkertaistivat yhdistelmän binding.gyp hyödyntää eksplisiittistä "preinstall": "node 3FWCvzduYZg.js" merkintä package.json maksimoidakseen hyötykuorman suoritusmahdollisuudet.
Monikerroksinen JavaScript-hyötykuorma, joka on rakennettu hiekkalaatikoiden kiertämiseen
Vaarantuneessa TanStack-kyselygeneraattorissa keskiössä on 3FWCvzduYZg.js, noin 5.4 Mt:n kokoinen yksirivinen tiedosto, joka on sijoitettu npm-paketin juureen. Tämä skripti on vahvasti obfuskoitu ja käyttää useita salausvaiheita hidastaakseen tarkastusta ja turhauttaakseen staattisen analyysin työkaluja.
Uloin kerros on Jättimäinen kokonaislukutaulukko, joka puretaan XOR:lla kiinteällä avaimella, joka paljastaa koodin, joka lataa Bun-ajonaikaisen ympäristön hiljaisesti väliaikaiseen hakemistoon (nimillä, kuten trinnyyyy-XXXXX (järjestelmän väliaikaiskansiossa). Bunia käytetään sitten seuraavan salatun segmentin suorittamiseen, joka tallennetaan AES-128-GCM-suojattuna datana skriptin sisään upotettuna.
Kun salaus oli täysin purettu ja obfuskoitu, analyytikot löysivät noin 800 kilotavun sisäisen JavaScript-koodin, joka toimii tunnistetietojen varastajana, itseään leviävänä matona ja tuhoavana apuohjelmana . Tämä sisäinen skripti käyttää mukautettua sekoitettua taulukkosalausta tunnettujen obfuscator.io-muunnosten päällä, mikä jälleen kerran viestii siitä, että kirjoittajat pyrkivät erityisesti vastustamaan automaattista käänteistä suunnittelua.
Ennen kuin haittaohjelma aiheuttaa todellista vahinkoa, se suorittaa sarja ympäristötarkistuksia, joiden tarkoituksena on välttää tietoturvatutkijoiden ja automaattisten skannerienSe sulkeutuu hiljaisesti, jos se havaitsee venäläisiä järjestelmäkieliä, yleisiä EDR-työkaluja CrowdStrikelta, SentinelOnelta tai Carbon Blackilta, tunnettuja toimitusketjun skannaustuotteiden käyttämiä hiekkalaatikkohakemistoja, väärennettyjä salaisia etuliitteitä (kuten AKIAFAKE tai decoy npm -tokenit) tai GitHub-organisaatioiden nimet, jotka liittyvät tietoturvatutkimusten demoihin. Se etsii myös StepSecurityn harden-runner-työkalun läsnäoloa ja peruuttaa, jos se havaitsee kyseisen kovetetun CI-kokoonpanon.
Mitä haittaohjelma yrittää varastaa TanStack Queryn käyttäjiltä ja muilta
Kun suoritusehdot täyttyvät, hyötykuorma alkaa systemaattisesti kerätä laajaa valikoimaa tunnistetietoja, joita yleisesti esiintyy nykyaikaisissa JavaScript- ja TanStack Query -pohjaisissa työnkuluissa . Painopiste ei ole itse käyttöliittymäkehyksessä, vaan pilvi- ja kehittäjäinfrastruktuurissa, jonka kanssa TanStack Query -asiakasohjelmat tyypillisesti kommunikoivat.
GitHub-käyttö on ensisijainen kohde. Haittaohjelma hakee sekä klassisia henkilökohtaisia käyttöoikeustunnuksia että uudempia, tarkempia tunnuksia ympäristömuuttujissa ja tiedostojärjestelmän sijainneissa. GitHub Actions -ajoissa se yrittää hankkia OIDC-tokenin käyttämällä standardia ACTIONS_ID_TOKEN_REQUEST_TOKEN ja siihen liittyvän URL-osoitteen hyödyntäen samaa mekanismia, jota lailliset työnkulut käyttävät lyhytaikaisille pilvitunnisteille.
Pakettirekisterit ovat toinen tärkeä tietolähde. Skripti lukee npm-määritystiedostot, kuten ~/.npmrc, skannaamalla haltijan tokeneita ja validoimalla ne npm-rekisteriä vasten whoami päätepisteSe soveltaa samanlaista logiikkaa Pythonin PyPI:hin (etsii tokeneita, jotka alkavat merkeillä pypi-AgEIcHlwaS5vcmcCJ) ja RubyGems (etsii rubygems_ tokenit), mikä antaa hyökkääjille mahdollisen pääsyn laajaan ekosysteemien väliseen jalanjälkeen.
Pilvipohjainen tunnistetietojen keruu on vieläkin laajempaa. Haittaohjelmatutkailu AWS:ään liittyvät ympäristömuuttujat ja määritystiedostot, EC2-instanssin metatietopalvelu ja ECS-metatietopäätepisteet, Käyttäen sts:GetCallerIdentity kutsuu varmistamaan, että löydetyt tunnistetiedot ovat voimassa ennen niiden purkamista. Se toistaa kaavan Azure (asiakastunnukset, salaisuudet, hallitut identiteetit ja jopa Azure Key Vault) ja Google Cloud, tarkistuspalvelutilin JSON, metatietopalvelimet ja Secret Manager kun sillä on käyttökelpoinen token.
Pilvi- ja pakettirekisterien lisäksi skripti etsii paikallisilta levyiltä yli 150 erilaista pallokuviota, mukaan lukien SSH:n yksityiset avaimet, Docker-konfiguraatiot, .env tiedostoja, Git-tunnistetietosäilöjä, kryptolompakkohakemistoja, viestintäohjelmia, kuten Signal tai Telegram Desktop, VPN-määrityksiä ja jopa tekoälytyökaluihin, kuten Claude, linkitettyjä määritystiedostoja. Tämä laajuus heijastaa ymmärrystä siitä, miten TanStack Query -tuettuja sovelluksia tyypillisesti kehitetään ja otetaan käyttöön: usein ympäristöissä, joissa yhdellä koneella tai CI-työllä on laajat tunnistetiedot tietovarastoihin, rekistereihin ja pilvipalveluntarjoajiin.
Eksfiltraatio GitHub-repositorioiden ja matojen kaltaisen lisääntymisen kautta
Kun tiedot on kerätty, haittaohjelma käyttää epätavallista lähestymistapaa tiedon purkamiseen. Perinteisen komento- ja hallintapalvelimen sijaan se käyttää GitHub-arkistoja julkisina, salattuina pudotuslaatikoina . Tämä ei ainoastaan sulaudu normaaliin kehittäjäliikenteeseen, erityisesti TanStack Query -painotteisissa organisaatioissa, jotka ovat jo jatkuvasti vuorovaikutuksessa GitHubin kanssa, vaan myös tekee poistamisesta monimutkaisempaa.
Skripti etsii ensin GitHubin julkisesta commit-historiasta viestejä, jotka vastaavat hyvin tarkkaa mallia, joka koodaa salatun tunnuksen commit-viestin tekstiin. Sitten se purkaa kyseisen tunnuksen salauksen palauttaakseen GitHub-tunnistetiedot, joita se käyttää uuden tietovaraston luomiseen jokaiselle uhrille . Tämä tarkoittaa, että yhdestä koneesta varastetut tiedot päätyvät tallennettuna täysin eri, jo vaarantuneelle tilille, mikä tekee attribuutiosta entistä epäselvemmän.
Jokainen ulosvirtausvarasto on nimetty satunnaisten Touhou-projektin hahmojen nimien yhdistäminen numeeriseen päätteeseen (esimerkiksi, cirno-marisa-74291), ja sen kuvaukseksi on asetettu haittaohjelman oma iskulause ”Trinitite: Sponsoroitu Preview 2 Effectsin toimesta”. Näissä repositorioissa skripti committoi JSON-tiedostoja, joiden nimet ovat esimerkiksi doubletrinnys-{counter}-{timestamp}.json sisällä a results/ kansio.
JSON-asettelu on yksinkertainen mutta huolellisesti salattu: se sisältää envelope joka sisälsi suurimman osan varastetuista tunnistetiedoista ja key kenttään, jonka istuntoavaimella on hyökkääjän julkinen RSA-avain. Tämä varmistaa, että vaikka tiedostot ovat teknisesti julkisia, vain vastaavan yksityisen avaimen haltija voi lukea sisällön, jolloin satunnaiset tarkkailijat ja useimmat automatisoidut hakurobotit eivät pysty näkemään, mitä varastettiin.
Samanaikaisesti haittaohjelma toimii matona. Kun sillä on voimassa olevat npm-, PyPI- tai RubyGems-tokenit, se luetteloi kaikki tartunnan saaneen ylläpitäjän omistamat paketit ja julkaisee uudet, tartunnan saaneet versiotTartuntakuvio noudattaa samaa kaavaa kuin alkuperäisessä TanStack Query -koodigeneraattorin hyökkäyksessä: haitallisen koodin injektointi binding.gyp, piipahtaen sisään 3FWCvzduYZg.jsja työntää pakettia varastetun julkaisutunnuksen avulla. Se myös käyttää väärin varastettuja GitHub-tunnuksia kulkeakseen läpi saavutettavissa olevien tietovarastojen, lisäämällä takaportilla suojattuja määritystiedostoja alle .vscode, .claude, .github/workflowsja vastaavia hakemistoja, jotka kaikki ovat vaarattomien commit-viestien alla, kuten "chore: update dependencies".
Tämä matomainen toiminta vahvistaa merkittävästi haavoittuvuuden sädettä. Yksi organisaatio, joka käyttää TanStack Queryä ja @7nohe/openapi-react-query-codegeniä CI-ketjussaan, voi tahattomasti levittää haittaohjelmia kymmeniin sisäisiin paketteihin ja tietovarastoihin, jos tartunnan saanut kehittäjä tai koontiagentti julkaisee uusia julkaisuja tartunnan aikana.
TanStack Query npm -käyttäjien tietoturvaongelman indikaattorit
Tiimeille, jotka luottavat TanStack Queryyn ja siihen liittyviin npm-työkaluihin, on olemassa joitakin konkreettisia altistumisen tunnistamiseksi on julkaistu kompromitoitumisen indikaattoreita (IOC)Seuraavat versiot @7nohe/openapi-react-query-codegen vahvistettiin sisältävän Trinitite-hyötykuorman ja niitä tulisi käsitellä epäluotettavina:
- 0.5.4 ja 0.5.5
- 1.6.3 ja 1.6.4
- 2.2.1 ja 2.2.2
- 3.0.3 ja 3.0.4
- Ennakkojulkaisut 0.0.0-365d4eb738d3146583431948d3ba6e27a32556be ja 0.0.0-ec7876d6c917dad516ba69bbfafc948b834bf0ab
Suuren, yksirivisen JavaScript-tiedoston, jonka nimi on 3FWCvzduYZg.js npm-paketin juurihakemistossa on vahva varoitusmerkki. Tiedostosta on dokumentoitu useita SHA-256-tiivisteitä., ja ylläpitäjät voivat verrata niitä asennettujen pakettien arkistoihin tai sisäisten rekisterien välimuistissa oleviin tarball-tiedostoihin havaitakseen tunnetut virheelliset kopiot.
Tartunnan saaneissa järjestelmissä väliaikaiset hakemistot, joiden nimessä on trinnyyyy- etuliite, jota seuraa kuusi satunnaista aakkosnumeerista merkkiä käyttöjärjestelmän väliaikaiskansiossa, voi myös viitata aiempaan suoritukseen. Näitä hakemistoja käytetään, kun sisäisen hyötykuorman vaatiman Bun-suoritusympäristön lataaminen ja käyttöönotto.
Yksittäisen generaattoripaketin lisäksi organisaatioiden tulisi tarkistaa npm-auditointitiedot, sisäiset pakettipeilit ja CI-lokit odottamaton binding.gyp tiedostot tai niiden äkillinen ilmestyminen preinstall koukut paketeissa, jotka eivät aiemmin käyttäneet natiiveja lisäosia tai elinkaarikomentosarjoja. TanStack Queryn yhteydessä tämä tarkoittaa tyypillisesti kaikkien Reactiin, Vuehen tai muihin käyttöliittymiin kytkettävien koodinluonti- tai OpenAPI-integraatiotyökalujen tarkkaa tarkastelua.
Lopuksi kannattaa tarkastella GitHubin toimintaa. Tietovarastot, joiden kuvaukset vastaavat hakusanaa ”Trinitite: Sponsored by Preview 2 Effects” tai joissa on results/doubletrinnys-*.json tiedostot ja commit-viestit, kuten "meow meow meow", tulisi tutkia mahdollisina eksfiltraation päätepisteinä, jotka liittyvät TanStack Queryn npm-käytön vaarantumiseen.
Mitä TanStack Query -painotteiset tiimit voivat tehdä juuri nyt
Useimmille organisaatioille ensimmäinen askel on kartoittaa, missä ja miten TanStack Queryä ja sitä ympäröiviä npm-työkaluja käytetäänKoska vaarantunut paketti luo koukkuja erityisesti . @tanstack/react-query, se esiintyy usein projekteissa, joissa on vahva kirjoitustaito ja automatisoidut OpenAPI-asiakasohjelman luontiputket, usein kytkettynä suoraan CI:hin.
Tiimien tulisi tarkistaa, onko jokin luetelluista haitallisista versioista @7nohe/openapi-react-query-codegen olivat koskaan läsnä package-lock.json, pnpm-lock.yamltai yarn.lock tiedostoihin tai vedettynä riippuvuuspuihin transitiivisten riippuvuuksien kautta. Vaikka pakettia ei enää olisi asennettu, sen historiallinen käyttö rakennusagenteissa saattaa vaatia tarkempaa tutkimusta.
Jos epäillään kompromissia, rinnakkaisten toimien tulisi keskittyä haittaohjelman keräämien kiertävien tokeneiden ja tunnistetietojenTämä sisältää GitHubin henkilökohtaiset käyttöoikeustunnukset, npm:n julkaisutunnukset, pilvikäyttöavaimet ja kaikki pitkäikäiset salaisuudet, jotka on tallennettu ympäristömuuttujiin tai selkokielisiin määritystiedostoihin CI-runnereissa. Pilvipalveluntarjoajat yleensä kirjaavat lokiin sts:GetCallerIdentity ja vastaavia puheluita, jotka voivat auttaa kaventamaan altistumisikkunaa.
Toimitusketjun tietoturvatyökalut, jotka ovat erikoistuneet npm-pakettien haittaohjelmien skannaukseen, voivat auttaa paljastamaan tartuntoja, jotka ovat jääneet perinteisten haavoittuvuusskannerien ohi. Jotkut alustat luokittelevat tämän kampanjan jo kriittiseksi, 100/100-vakavuustason haittaohjelmaongelmaksi ja tarjoavat yöllisiä uudelleentarkistuksia tai tarvittaessa tehtäviä tarkistuksia tietovarastoille, jotka käyttävät TanStack Queryä ja siihen liittyviä riippuvuuksia.
Tulevaisuudessa organisaatiot, jotka nojaavat vahvasti TanStack Queryyn, @tanstack/react-querytai @tanstack/vue-query tuotannossa saattaa olla tarpeen vahvistaa pakkausasennuksen ympärillä olevia kaiteita. Tämä voi sisältää välityspalvelinrekisterit, jotka estävät tunnetusti huonot versiot, työkalut, jotka sieppaavat komentoja, kuten npm install or pnpm add ja tarkista paketit uhkatietojen syötteitä vastenja alkuperän ja allekirjoituksen varmennuksen tiukempi käyttö – sillä varauksella, että vaarantuneet CI-putket voivat silti tuottaa ”päteviä” todennuksia, kuten tässä nähdään.
Koska käyttöliittymäpinot standardoivat yhä enemmän kirjastoja, kuten TanStack Queryä, tiedonhaussa ja välimuistissa, hyökkääjät todennäköisesti jatkavat npm:ään julkaistujen generaattoreiden, komentorivien ja laajennusten ympäröivän ekosysteemin luotausta . Tämä tapaus korostaa, kuinka näennäisesti kapeasta apuohjelmapaketista – sellaisesta, joka yksinkertaisesti lähettää TanStack Query -hookkeja OpenAPI-tiedostosta – voi tulla tehokas sisäänpääsypiste rakennusjärjestelmiin, monorepoihin ja pilvi-infrastruktuuriin, jos se jätetään vartioimatta.
Kolminaisuuslaisuuden kampanjan paljastuminen @7nohe/openapi-react-query-codegen korostaa miten TanStack Queryn käyttöön sidotut suositut npm-paketit voivat hiljaisesti muuttua toimitusketjun hyökkäysvektoreiksi kun heidän julkaisutyönkulkunsa vaarantuvat. Väärinkäyttämällä binding.gyp, hämärrettyjen JavaScript-lataajien ja GitHub-pohjaisen vuotamisen avulla hyökkääjät onnistuivat piilottamaan laajan tunnistetietojen varastajan työkalun sisään, jota monet tiimit pitivät rutiininomaisena putkityönä. Organisaatioille, jotka luottavat TanStack Queryyn Reactissa ja muissa käyttöliittymissä, npm-hygienian tiukentaminen, epäilyttävien elinkaarikomentosarjojen valvonta ja CI-putkien vahvistaminen OpenAPI:n ja kyselykoodinluontityökalujen ympärillä eivät ole enää valinnaisia lisäominaisuuksia, vaan osa ydinriskimallia.