- Vairākas @7nohe/openapi-react-query-codegen versijas npm platformā tika apdraudētas., ieguldot sarežģītu ļaunprogrammatūras lietderīgo slodzi, kas ļaunprātīgi izmanto uz TanStack Query balstītas darbplūsmas.
- Uzbrukumā tika izmantota binding.gyp sandbox izeja un iepriekšinstalēšanas skripti. lai npm instalēšanas laikā izpildītu daudzslāņu JavaScript zagli, pat bez skaidri izteiktiem dzīves cikla āķiem.
- Datu plūsma apkopoja plašu izstrādātāju un mākoņa akreditācijas datu klāstu. (GitHub, npm, AWS, Azure, GCP, Vault, Kubernetes un citi) un pārvietoja tos uz publiskām GitHub krātuvēm.
- Tārps ļaunprātīgi izmantoja nozagtus tokenus, lai inficētu papildu npm, PyPI, RubyGems pakotnes un GitHub repozitorijus., izceļot plašāku piegādes ķēdes risku, kas saistīts ar populārā TanStack Query npm lietojumu.
2026. gada augusta beigās drošības pētnieki atklāja mērķtiecīgs piegādes ķēdes uzbrukums, kas saistīts ar TanStack Query npm ekosistēmu izmantojot populāru OpenAPI koda ģeneratoru. Incidents ir saistīts ar pakotni @7nohe/openapi-react-query-codegen, rīks, kas automātiski ģenerē tipa drošus āķus TanStack vaicājumam tieši no OpenAPI shēmām un kas npm platformā tiek lejupielādēts vairāk nekā 150 000 reizes nedēļā.
Tā vietā, lai paši uzbruktu TanStack Query pamatbibliotēkām, uzbrucēji apdraudēja apkārtējos rīkus, kurus daudzas komandas izmanto, lai izveidotu TanStack Query āķus , ievietojot sarežģītu ļaunprogrammatūras slodzi vairākās ģeneratora versijās. Tā kā šie āķi tiek tieši pieslēgti React un TypeScript ražošanas koda bāzēm, ietekme sniedzas tālu aiz vienas pakotnes, skarot jebkuru CI cauruļvadu vai izstrādātāja datoru, kas instalēja inficētās versijas.
Kā uzbrukumā tika ļaunprātīgi izmantots TanStack vaicājumu koda ģenerators npm platformā
Skartā bibliotēka, @7nohe/openapi-react-query-codegen, tiek plaši izmantots TanStack Query āķa slāņu veidošanai no OpenAPI līgumiem, tādējādi pasargājot komandas no atkārtotas ieneses loģikas ar roku rakstīšanas. Aptuveni 20 minūšu laikā uzbrucējs ievietoja npm reģistrā desmit ļaunprātīgas šīs pakotnes versijas, un visām no tām bija derīgas izcelsmes apliecinājumi, kas ģenerēti, izmantojot GitHub Actions.
Šie apliecinājumi, kas parasti ir spēcīgs integritātes signāls, zaudēja savu nozīmi, jo pati projekta GitHub Actions darbplūsma bija apdraudēta . Izmantojot šīs darbplūsmas ievainojamību, apdraudējuma dalībnieks ieguva iespēju nosūtīt ar Trojas zirgu inficētas versijas, vienlaikus ģenerējot kriptogrāfiskus pierādījumus, ka tās nākušas no “oficiālās” versijas. Šķiet, ka atbilstošā GitHub repozitorija ir pārņemta tajā pašā darbībā, dodot uzbrucējam pilnīgu kontroli pār izlaišanas procesu.
Kampaņa atspoguļo agrākus piegādes ķēdes incidentus, kas saistīti ar npm, bet tai ir pievienots pavērsiens: tā īpaši ir vērsta uz OpenAPI rīku un TanStack vaicājumu lietošanas krustpunktsTā kā ģenerators emitē React kodu, kas ir atkarīgs no @tanstack/react-query, jebkura organizācija, kas to ir pievienojusi savai automatizētajai API klienta ģenerēšanai, riskē ievilināt ļaunprogrammatūru būvēšanas aģentos, CI palaistājos vai izstrādātāju klēpjdatoros.
Izmeklētāji arī atzīmēja, ka ļaunprogrammatūras zīmola nosaukums — “ Trinitite: Sponsored by Preview 2 Effects ” — atspoguļo iepriekšējo ar TeamPCP saistīto operāciju teatrālo stilu, lai gan joprojām nav skaidrs, vai tas ir kopētāju, atšķēlušās grupas vai nesaistīta aktiera darbs, kas aizņemas estētiku.
Binding.gyp smilškastes iziešana: ļaunprogrammatūras palaišana npm instalēšanas laikā
Viens no neparastākajiem tehniskajiem risinājumiem šajā TanStack Query blakus esošajā uzbrukumā ir ļaunprātīga izmantošana binding.gyp kā izpildes vektors npm instalēšanas laikāNormālos apstākļos binding.gyp apraksta, kā kompilēt vietējos Node.js papildinājumus. Kad npm sastopas ar šādu failu, tas izsauc node-gyp, kas savukārt novērtē conditions lauks, izmantojot Python.
Ļaunprātīgās versijas @7nohe/openapi-react-query-codegen izmantot šo uzvedību, iestrādājot Python smilškastes aizbēgšana conditions bloķētTā vietā, lai saturētu nekaitīgu būvēšanas konfigurāciju, fails iet cauri Python iekšējai klases hierarhijai, lai sasniegtu catch_warnings klase, pagriežas uz __builtins__, imports os, un visbeidzot zvana os.system lai izpildītu JavaScript lietderīgo slodzi ar Node.
Kad apmulsums ir novērsts, nosacījums sašaurinās līdz vienai komandai: node 3FWCvzduYZg.js izpildās automātiski instalēšanas laikāPārējā daļa binding.gyp saturs faktiski ir dūmu aizsegs: deklarētajam mērķa nosaukumam nav nozīmes, tips ir heksadecimālkodā none, un īsta vietējā kompilācija nenotiek.
Ne katrs sabojātais izlaidums paļāvās tikai uz šo triku. Divas pirmsizlaides atzīmes tika izmantotas parastā veidā preinstall skriptu vietā, viens, kas izsauc lokālo failu nu.js un vēl viens lejupielādē Bun izpildlaiku, izmantojot wget pa caurulīti uz bash pirms skripta palaišanas ar nekaunīgi nosauktu nosaukumu is_it_this_simple.jsVēlākās versijas tika dubultotas, apvienojot binding.gyp izmantot ar nepārprotamu "preinstall": "node 3FWCvzduYZg.js" ieraksts package.json lai palielinātu iespējas, ka lietderīgā slodze darbosies.
Daudzslāņu JavaScript lietderīgā slodze, kas izveidota, lai apietu smilškastes
Kompromitētā TanStack vaicājumu ģeneratora centrā atrodas 3FWCvzduYZg.js, vienas rindas fails, kura svars ir aptuveni 5.4 MB, kas ievietots npm pakotnes saknē. Šis skripts ir ļoti maskēts, izmantojot vairākus šifrēšanas posmus, lai palēninātu pārbaudi un traucētu statiskās analīzes rīku darbību.
Ārējais slānis ir Milzīgs veselu skaitļu masīvs, kas atšifrēts, izmantojot XOR ar fiksētu atslēgu, kas atklāj kodu, kas klusībā lejupielādē Bun izpildlaiku pagaidu direktorijā (ar tādiem nosaukumiem kā trinnyyyy-XXXXX (sistēmas pagaidu mapē). Pēc tam Bun tiek izmantots, lai izpildītu nākamo šifrēto segmentu, kas tiek saglabāts kā AES-128-GCM aizsargāti dati, kas iegulti skriptā.
Pēc pilnīgas atšifrēšanas un deobfuskācijas analītiķi atrada aptuveni 800 KB lielu iekšējo JavaScript failu, kas darbojas kā akreditācijas datu zaglis, pašizplatošs tārps un destruktīva utilīta . Šis iekšējais skripts lieto pielāgotu jauktas tabulas šifru, kas ir uzklāts virs labi zināmajām obfuscator.io transformācijām, vēlreiz signalizējot, ka autori īpaši centās pretoties automatizētai reversajai inženierijai.
Pirms reāla kaitējuma nodarīšanas ļaunprogrammatūra veic virkne vides pārbaužu, kas paredzētas, lai apietu drošības pētniekus un automatizētus skenerusTas klusībā aizveras, ja atrod Krievijas sistēmas lokalizācijas, izplatītus EDR rīkus no CrowdStrike, SentinelOne vai Carbon Black, zināmus piegādes ķēdes skenēšanas produktu izmantotos smilškastes direktorijus, viltotus slepenos prefiksus (piemēram, AKIAFAKE vai mānekļa npm žetoni), vai GitHub organizāciju nosaukumi, kas saistīti ar drošības pētījumu demonstrācijām. Tas arī meklē StepSecurity harden-runner rīka klātbūtni, atkāpjoties, ja pamana šo sacietējušo CI konfigurāciju.
Ko ļaunprogrammatūra mēģina nozagt no TanStack Query lietotājiem un citiem
Kad izpildes nosacījumi ir izpildīti, lietderīgā slodze sāk sistemātiski apkopot plašu akreditācijas datu klāstu, kas parasti ir sastopams mūsdienu JavaScript un TanStack Query balstītās darbplūsmās . Uzsvars netiek likts uz pašu front-end ietvaru, bet gan uz mākoņa un izstrādātāju infrastruktūru, ar kuru TanStack Query klienti parasti sazinās.
GitHub piekļuve ir galvenais mērķis. Ļaunprogrammatūra meklē gan klasiskās personīgās piekļuves pilnvaras, gan jaunākus detalizētus pilnvarus vides mainīgajos un failu sistēmas atrašanās vietās. GitHub darbību izpildītājos tas mēģina iegūt OIDC marķieri, izmantojot standarta ACTIONS_ID_TOKEN_REQUEST_TOKEN un saistīto URL, izmantojot to pašu mehānismu, ko likumīgas darbplūsmas izmanto īslaicīgiem mākoņa akreditācijas datiem.
Pakotņu reģistri ir vēl viens svarīgs datu avots. Skripts nolasa npm konfigurācijas faili, piemēram, ~/.npmrc, skenējot nesēja žetonus un validējot tos pret npm reģistra datiem whoami galapunktsTas piemēro līdzīgu loģiku Python PyPI (meklējot žetonus, kas sākas ar pypi-AgEIcHlwaS5vcmcCJ) un RubyGems (meklē rubygems_ žetoni), dodot uzbrucējiem potenciālu piekļuvi plašam starpekosistēmu nospiedumam.
Mākoņdatošanas akreditācijas datu ieguve ir vēl plašāka. Ļaunprogrammatūras izmeklējumi Ar AWS saistītie vides mainīgie un konfigurācijas faili, EC2 instances metadatu pakalpojums un ECS metadatu galapunkti, Izmantojot sts:GetCallerIdentity izsaukumi, lai pārbaudītu, vai visi atklātie akreditācijas dati ir derīgi, pirms to izvilkšanas. Tas atkārto modeli Azure (klientu ID, slepenie dati, pārvaldītās identitātes un pat Azure Key Vault) un par Google Cloud, pārbauda pakalpojuma konta JSON, metadatu serverus un slepeno pārvaldnieku kad tam ir izmantojams marķieris.
Papildus mākoņa un pakotņu reģistriem skripts pārmeklē lokālos diskus, lai atrastu vairāk nekā 150 dažādi globusa raksti, ieskaitot SSH privātās atslēgas, Docker konfigurācijas, .env faili, Git akreditācijas datu krātuves, kriptovalūtu maku direktoriji, ziņojumapmaiņas klienti, piemēram, Signal vai Telegram Desktop, VPN konfigurācijas un pat konfigurācijas faili, kas saistīti ar mākslīgā intelekta rīkiem, piemēram, Claude. Šis plašums atspoguļo izpratni par to, kā parasti tiek izstrādātas un izvietotas TanStack Query atbalstītas lietotnes: bieži vien vidēs, kur vienai mašīnai vai CI darbam ir plašs akreditācijas datu klāsts krātuvēm, reģistriem un mākoņpakalpojumu sniedzējiem.
Eksfiltrācija, izmantojot GitHub repozitorijus, un tārpu līdzīgu pavairošanu
Kad dati ir apkopoti, ļaunprogrammatūra izmanto neparastu pieeju to izfiltrācijai. Tā vietā, lai publicētu datus tradicionālā komandu un vadības serverī, tā izmanto GitHub repozitorijus kā publiskas, šifrētas datu nomešanas kastes . Tas ne tikai saplūst ar parasto izstrādātāju datplūsmu, īpaši organizācijās, kurās tiek izmantota liela TanStack Query funkcionalitāte un kuras jau tā pastāvīgi mijiedarbojas ar GitHub, bet arī padara noņemšanas procesu sarežģītāku.
Skripts vispirms meklē GitHub publiskajā izmaiņu vēsturē ziņojumus, kas atbilst ļoti specifiskam modelim, kurā ir šifrēts marķieris izmaiņu ziņojuma tekstā. Pēc tam tas atšifrē šo marķieri, lai atgūtu GitHub akreditācijas datus, kurus izmanto, lai katram upurim izveidotu jaunu repozitoriju . Tas nozīmē, ka no vienas iekārtas nozagtie dati tiek glabāti pilnīgi citā, jau kompromitētā kontā, vēl vairāk apgrūtinot attiecināšanu.
Katra eksfiltrācijas krātuve ir nosaukta pēc apvienojot nejaušus Touhou projekta varoņu nosaukumus ar skaitlisku sufiksu (piemēram, cirno-marisa-74291), un tā apraksts ir iestatīts uz ļaunprogrammatūras paša saukli “Trinitite: Sponsored by Preview 2 Effects”. Šajos repozitorijos skripts izveido JSON failus ar nosaukumiem, piemēram, doubletrinnys-{counter}-{timestamp}.json iekšpusē a results/ mapi.
JSON izkārtojums ir vienkāršs, bet rūpīgi šifrēts: tajā ir envelope kas satur lielāko daļu nozagto akreditācijas datu un key lauks ar sesijas atslēgu, kas šifrēta, izmantojot uzbrucēja publisko RSA atslēgu. Tas nodrošina, ka pat tad, ja faili tehniski ir publiski pieejami, saturu var lasīt tikai persona, kurai ir atbilstošā privātā atslēga, atstājot nejaušus novērotājus un lielāko daļu automatizēto rāpuļprogrammu nespētu redzēt, kas ir nozagts.
Paralēli ļaunprogrammatūra darbojas kā tārps. Ar derīgiem npm, PyPI vai RubyGems žetoniem tā… uzskaita visas kompromitētā uzturētāja īpašumā esošās pakotnes un publicē jaunas, inficētas versijasInfekcijas modelis atbilst tai pašai shēmai, kas tika izmantota sākotnējā TanStack Query koda ģeneratora kompromitēšanā: ļaunprātīgas programmatūras ievadīšana. binding.gyp, iekrītot 3FWCvzduYZg.jsun pakotnes nosūtīšanu, izmantojot nozagto publicēšanas žetonu. Tas arī ļaunprātīgi izmanto nozagtus GitHub žetonus, lai pārvietotos pa pieejamām krātuvēm, pievienojot aizmugurējās durvis konfigurācijas failus zem .vscode, .claude, .github/workflowsun līdzīgas direktorijas, visas zem nekaitīgiem apstiprinājuma ziņojumiem, piemēram, "chore: update dependencies".
Šī tārpam līdzīgā uzvedība ievērojami palielina sprādziena rādiusu. Viena organizācija, kas savā CI ķēdē izmanto TanStack Query un @7nohe/openapi-react-query-codegen, varētu netīšām ievietot ļaunprogrammatūru desmitiem iekšējo pakotņu un repozitoriju, ja apdraudēts izstrādātājs vai veidošanas aģents publicē jaunas versijas, kamēr ir inficēts.
Kompromitācijas indikatori TanStack Query npm lietotājiem
Komandām, kas paļaujas uz TanStack Query un saistītajiem npm rīkiem, daži konkrēti Ir publicēti kompromitācijas rādītāji (IOC), lai palīdzētu noteikt pakļaušanu riskamŠādas versijas @7nohe/openapi-react-query-codegen tika apstiprināts, ka tie satur Trinitite lietderīgo slodzi, un tie jāuzskata par neuzticamiem:
- 0.5.4 un 0.5.5
- 1.6.3 un 1.6.4
- 2.2.1 un 2.2.2
- 3.0.3 un 3.0.4
- Pirmsizlaidumi 0.0.0-365d4eb738d3146583431948d3ba6e27a32556be un 0.0.0-ec7876d6c917dad516ba69bbfafc948b834bf0ab
Jebkura liela, vienrindas JavaScript faila ar nosaukumu parādīšanās 3FWCvzduYZg.js npm pakotnes saknes direktorijā ir spēcīga brīdinājuma zīme. Ir dokumentētas vairākas šī faila SHA-256 jaucējkodas., un administratori var tos salīdzināt ar instalēto pakotņu arhīviem vai kešatmiņā saglabātajiem tarball failiem iekšējos reģistros, lai atklātu zināmas bojātas kopijas.
Inficētās sistēmās pagaidu direktoriji, kas nosaukti ar trinnyyyy- Prefikss, kam seko sešas nejaušas burtciparu rakstzīmes OS pagaidu mapē, var arī norādīt uz iepriekšējo izpildi. Šīs direktorijas tiek izmantotas, kad iekšējās lietderīgās slodzes nepieciešamā Bun izpildlaika lejupielāde un sagatavošana darbam.
Papildus konkrētajai ģeneratora pakotnei organizācijām jāpārskata npm audita dati, iekšējie pakotņu spoguļi un CI žurnāli, lai atrastu negaidīts binding.gyp faili vai pēkšņa parādīšanās preinstall āķi pakotnēs, kas iepriekš nepaļāvās uz vietējām pievienojumprogrammām vai dzīves cikla skriptiem. TanStack Query kontekstā tas parasti nozīmē rūpīgu jebkura koda ģenerēšanas vai OpenAPI integrācijas rīka izpēti, kas pieslēdzas React, Vue vai citām front-end sistēmām.
Visbeidzot, ir vērts rūpīgi izpētīt GitHub aktivitātes. Repozitoriji ar aprakstiem, kas atbilst “Trinitite: Sponsored by Preview 2 Effects” vai ar results/doubletrinnys-*.json faili un apstiprināšanas ziņojumi, piemēram, "meow meow meow", jāizpēta kā potenciāli eksfiltrācijas galapunkti, kas saistīti ar kompromitētu TanStack Query npm lietojumu.
Ko TanStack Query – ietilpīgas komandas var darīt tieši tagad
Lielākajai daļai organizāciju pirmais solis ir inventarizēt, kur un kā tiek izmantots TanStack Query un tā apkārtējie npm rīkiTā kā kompromitētā pakotne ģenerē āķus tieši priekš @tanstack/react-query, tas mēdz parādīties projektos ar spēcīgu tipizēšanu un automatizētiem OpenAPI klientu ģenerēšanas kanāliem, kas bieži vien ir tieši pieslēgti CI.
Komandām jāpārbauda, vai kāda no uzskaitītajām ļaunprātīgajām versijām @7nohe/openapi-react-query-codegen kādreiz bija klāt package-lock.json, pnpm-lock.yaml, vai yarn.lock failos vai ievilkt atkarību kokos, izmantojot tranzitīvas atkarības. Pat ja pakotne vairs nav instalēta, vēsturiskā lietošana būvēšanas aģentos varētu būt nepieciešama padziļinātāka izpēte.
Ja pastāv aizdomas par kompromisu, paralēli jākoncentrējas uz ļaunprogrammatūras ievākto rotējošo žetonu un akreditācijas datuTas ietver GitHub personiskās piekļuves žetonus, npm publicēšanas žetonus, mākoņa piekļuves atslēgas un visus ilgtermiņa noslēpumus, kas glabājas vides mainīgajos vai vienkārša teksta konfigurācijas failos CI runners platformās. Mākoņpakalpojumu sniedzēji parasti reģistrē sts:GetCallerIdentity un līdzīgi zvani, kas var palīdzēt sašaurināt iedarbības logu.
Piegādes ķēdes drošības rīki, kas specializējas npm pakotņu ļaunprogrammatūras skenēšanā , var palīdzēt atklāt infekcijas, kuras tradicionālie ievainojamību skeneri ir paslīdējuši garām. Dažas platformas šo kampaņu jau klasificē kā kritisku 100/100 nopietnības ļaunprogrammatūras problēmu un nodrošina atkārtotu skenēšanu vai pārbaudes pēc pieprasījuma krātuvēm, kas paļaujas uz TanStack Query un saistītajām atkarībām.
Raugoties nākotnē, organizācijas, kas lielā mērā paļaujas uz TanStack Query, @tanstack/react-query, vai @tanstack/vue-query ražošanā, iespējams, vēlēsies nostiprināt aizsargbarjeras ap iepakojuma uzstādīšanu. Tas var ietvert starpniekservera reģistri, kas bloķē zināmas sliktas versijas, rīki, kas pārtver komandas, piemēram, npm install or pnpm add un pārbaudīt paketes, salīdzinot tās ar apdraudējumu informācijas plūsmām, un stingrāka izcelsmes un paraksta verifikācijas izmantošana — ar atrunu, ka kompromitēti CI cauruļvadi joprojām var radīt “derīgus” apliecinājumus, kā redzams šeit.
Tā kā front-end steki arvien vairāk standartizē tādas bibliotēkas kā TanStack Query datu izgūšanai un kešatmiņai, uzbrucēji, visticamāk, turpinās pārbaudīt apkārtējo ģeneratoru, komandrindas saskarņu un spraudņu ekosistēmu, kas publicēta npm . Šis incidents uzsver, kā šķietami šaura utilītu pakotne — tāda, kas vienkārši izstaro TanStack Query āķus no OpenAPI faila — var kļūt par ietekmīgu ieejas punktu būvēšanas sistēmās, monorepo un mākoņinfrastruktūrā, ja to neaizsargā.
Trīsvienības kampaņas pret atklājums @7nohe/openapi-react-query-codegen izceļ, kā Populārās npm pakotnes, kas saistītas ar TanStack Query lietošanu, var nemanāmi pārvērsties par piegādes ķēdes uzbrukuma vektoriem kad tiek apdraudētas viņu izlaišanas darbplūsmas. Ļaunprātīgi izmantojot binding.gyp, apmulsinātiem JavaScript ielādētājiem un uz GitHub balstītai eksfiltrācijai uzbrucējiem izdevās paslēpt tālejošu akreditācijas datu zagli rīkā, ko daudzas komandas uzskatīja par ikdienišķu santehniku. Organizācijām, kas paļaujas uz TanStack Query React un citās front-end sistēmās, npm higiēnas pastiprināšana, aizdomīgu dzīves cikla skriptu uzraudzība un CI cauruļvadu nostiprināšana ap OpenAPI un vaicājumu koda ģenerēšanas rīkiem vairs nav papildu funkcijas, bet gan daļa no galvenā riska modeļa.