- Mitu ohustatud versiooni @7nohe/openapi-react-query-codegen süstis projektidesse pahavara, kasutades TanStacki päringupõhiseid konksusid.
- Ründaja kuritarvitas a binding.gyp liivakasti põgenemine ja eelinstallida skripte, et käivitada npm-i installimise ajal hägustatud JavaScripti kasulik koormus.
- Kasulik koormus kogub ulatuslikke pilve- ja arendaja volitusi, filtreerides need ründaja poolt kontrollitavatesse GitHubi repositooriumidesse.
- Varastatud žetoone kasutatakse seejärel levitada pahavara rohkematele npm-pakettidele ja GitHubi repositooriumidele, mürgitades laiemat JavaScripti tarneahelat.
Meeskondade jaoks, kes toetuvad TanStack Queryle kui oma peamisele npm-paketile serveri oleku haldamiseks Reactis ja teistes esiotsa raamistikes, näitab hiljutine tarneahela intsident, kui kiiresti seda usaldust saab õõnestada. Populaarne kaastööriist, mis oli loodud spetsiaalselt tüübikindlate TanStack Query konksude genereerimiseks OpenAPI skeemidest, muudeti vaikselt relvaks ja suruti npm-i registrisse koos keeruka pahavara paketi sisse kodeerimisega.
Turvauurijad kirjeldavad rünnakut kui TeamPCP-stiilis kampaaniat , mis taaskasutab paljusid varasemates intsidentides nähtud teatraalseid ja tehnilisi mustreid. Seekord on aga tähelepanu keskpunktis arendajad, kes loovad oma andmekihi, kasutades paketti @7nohe/openapi-react-query-codegen – utiliiti, mis lubab aega kokku hoida TanStacki päringukonksude automaatse genereerimisega, selle asemel et käsitsi malli kirjutada.
Kuidas TanStack Query koodigeneraatorist sai pahavara edastamise sõiduk
Juhtumi keskmes olev pakett @7nohe/openapi-react-query-codegen on loodud OpenAPI spetsifikatsiooni vastuvõtmiseks ja TanStack Queryga ühilduvate täielikult tüüpitud konksude genereerimiseks. Üle 150 000 iganädalase allalaadimisega on see kriitilise tähtsusega paljude meeskondade jaoks, kes standardiseerivad TanStack Queryt, et korraldada taustandmete toomist, vahemällu salvestamist ja sünkroonimist oma React-põhistes esiotstes.
Lahkamise kohaselt õnnestus ründajal rikkuda nii npm-pakett kui ka selle GitHubi repositoorium . Turvarikkumine saavutati projekti ühe GitHub Actionsi töövoo haavatavuse ärakasutamise teel, mis tähendas, et pahatahtlikud versioonid näisid ikkagi pärinevat legitiimsest konfidentsiaalsest andmevoost ja neil olid kehtivad päritolutõendid. Need krüptograafilised tõendid, mis tavaliselt on npm-i kasutajate jaoks tugev usaldussignaal, muutusid eksitavaks, kui töövoog ise sattus vaenuliku kontrolli alla.
Umbes kahekümne minuti jooksul avaldas ründaja npm-is kümme paketi mürgitatud versiooni , millest igaüks sisaldas koodi, mis oli loodud installimise ajal käivituma ja mitmeastmelise pahavara alglaadima. Mõjutatud versioonid hõlmavad mitmeid väiksemaid ja parandusversioone, mida kõiki tuleks nüüd käsitleda ebausaldusväärsetena.
- @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
Kõigil neil variantidel on sama põhieesmärk: ära kasutada paketi populaarsust TanStack Query kasutajate seas, et saavutada koodi käivitamise kiirus npm-i installimise ajal ja seejärel hajutada see laiemasse JavaScripti tarneahelasse.
„Trinitite” kasulik koormus ja selle installimise ajal teostatavad nipid
Pahavara identifitseerib end iroonilise sildiga „Trinitite: Preview 2 Effectsi sponsorlus”, viide tuumakatsetuste käigus tekkinud klaasjale materjalile. Varasemad sisemised kirjasüsteemi nimed, näiteks is_it_this_simple.js vihjab ründaja muretule suhtumisele, kuid aluseks olev tehnika on kõike muud kui lihtsustatud.
Peamine teostuskonks hingeldub a-ga binding.gyp liivakasti põgenemineTavalistes Node.js projektides kasutatakse faili binding.gyp node-gyp kompileeritud natiivsete lisandmoodulite konfigureerimiseks, kuid siin on see relvana kasutatav. Kui npm kohtub failiga binding.gyp, hindab node-gyp selle conditions välja Pythoni abil. Ründaja lisab sellele väljale hoolikalt koostatud Pythoni avaldise, kasutades ära Pythoni klassihierarhiat, et eeldatavast liivakastist välja murda ja suvalisi shellikäsklusi käivitada.
Ohustatud paketis on tingimuste avaldis tugevalt segatud ... Unicode ja heksaediskoodide põgenemiskoodidPärast dekodeerimist läbib see Pythoni sisemise __subclasses__ puu, et leida catch_warnings klass, kasutab seda pöördepunktina jõudmiseks __builtins__, impordib os moodul ja lõpuks kutsub os.system() peamise kasuliku koormuse käivitamiseks Node'iga. type väli failis binding.gyp on kodeeritud kuueteistkümnendsüsteemis järgmiselt: none, seega ei püüta luua tõelist natiivset ehitust; konfiguratsioon eksisteerib ainult ühe shellikäsu sissesmugeldamiseks.
See lähenemisviis tähendab, et pakett saab käivitage installimise ajal pahatahtlikku koodi isegi kui puudub otsene preinstall skript, mis on defineeritud failis package.json. Kõik mürgitatud versioonid ei tugine siiski täpselt sellele nipile. Kaks eelväljalaske versiooni kasutavad lihtsamaid eelinstalli konksusid: üks käivitab Node'i skripti nimega nu.js otse, samas kui teine hangib Buni käitusaja läbi wget torujuhtme kaudu bash ja seejärel käivitab sobivalt nimetatud is_it_this_simple.jsHilisemad versioonid ühendavad mõlemad meetodid, edastades pahatahtliku binding.gyp faili. ja a preinstall kirje, mis osutab koondamise eesmärgil samale peamisele JavaScripti kasulikule koormusele.
Hägustamiskihid ja liivakastist kõrvalehoidumine peamises JavaScripti kasulikus koormuses
Kui esialgne konks käivitub, suunatakse rünnak suureks JavaScripti failiks nimega 3FWCvzduYZg.js , mis paigutatakse npm-paketi juurkataloogi. Umbes 5.4 MB suurune ja üherealiseks lühendatud skript on loodud võimalikult läbipaistmatuks esmapilgul ning edasine analüüs näitab, et seda kaitsevad mitmed erinevad krüpteerimis- ja hägustamiskihid.
Kõige välimine kiht koosneb 1.6 miljoni elemendiga täisarvude massiiv, dekrüpteeritakse lihtsa XOR-operatsiooniga konstandi 29 suhtes. See dekrüpteerimine annab tulemuseks teisese skripti, mille ülesanne on vaikselt Buni käituskeskkonda hankida, salvestades selle ajutise failinimega, mille nimi on trinnyyyy-XXXXX mustri süsteemi ajutises kataloogis ja seejärel kasutab Buni tegeliku põhikoormuse käivitamiseks. Tuum ise mähitakse AES-128-GCM krüptimisega ja seejärel läbib see kohandatud šifreid lisaks standardsetele JavaScripti hägustamistehnikatele, sealhulgas neile, mida näeb populaarsetes tööriistades nagu obfuscator.io.
Täielikult lahti pakituna paljastab see sügavalt kihiline koormus mitmete võimete segu: volituste koguja, mis on suunatud laiale hulgale pilve- ja arendusplatvormidele, ussikomponent, mis suudab nakkust uutele sihtmärkidele levitada, ja hävitav käsukanal. Enne ükskõik millise neist aktiveerimist teeb skript rea keskkonnakontrolle, et vältida liivakaste ja turvatööriistu, väljudes vaikselt, kui teatud ilmsed tingimused on täidetud.
Kontrollide hulgas on lokaadi, keskkonna ja failisüsteemi indikaatorid tavaliselt seostatakse uurimiskeskkondadega. Pahavara pääseb välja, kui süsteemi lokaadiks on vene keel, kui leidub katalooge, mis kuuluvad lõpp-punkti turbetoodetele nagu CrowdStrike, SentinelOne või Carbon Black, kui praegune töökataloog vastab teadaolevate tarneahela skannimistööriistade kasutatavatele teedele või kui keskkonnamuutujad sisaldavad turvaskannerite poolt kasutatavaid võltsitud volitusi. Samuti uurib see GITHUB_REPOSITORY_OWNER ja karastustööriistade, näiteks StepSecurity'i, olemasolu harden-runner, hoidudes eemale GitHubi kontodest, mis teadaolevalt kuuluvad turvauurijatele.
Mida pahavara varastab TanStacki päringupõhistest arenduskeskkondadest
Kui keskkonnakontrollid on läbitud, hakkab pahavara laia võrgu abil volitusi koguma. Kuigi algne pakett on loodud TanStack Query kasutajate abivahendina, ulatub tegelik sihtmärk kaugemale ühest teekist, puudutades peaaegu iga tänapäevase JavaScripti arendaja tööriistaketi ja pilvepaketi kihti.
Arendaja poolel otsib kasulik koormus järgmist: GitHubi isiklikud juurdepääsutokenid mitmes vormingus, sealhulgas klassikalistes žetoonides, mis algavad gho or ghp ja uuemad peeneteralised märgid, mis algavad tähega github_pat_GitHub Actionsi käivitajate puhul taotleb see dokumenteeritud kaudu ka OpenID Connecti märke. ACTIONS_ID_TOKEN_REQUEST_TOKEN ja ACTIONS_ID_TOKEN_REQUEST_URL keskkonnamuutujad, andes ründajale võimaluse eeldada töökoormuse identiteete, mitte ainult staatilisi saladusi.
Seejärel pöördub skript üldkeele registrite poole. See loeb npm, PyPI ja RubyGemsi märgid konfiguratsioonifailidest, näiteks ~/.npmrc, otsib lisateavet projektikohaliku kohta .npmrc faile ja proovib avastatud npm-i kandja tokeneid valideerida, kutsudes funktsiooni /-/whoami avaliku registri lõpp-punkt. Sarnaseid mustreid kasutatakse PyPI ja RubyGemsi puhul, kaevandades autentimisandmeid ja kinnitades enne iga tokeni väljafiltreerimist, et see saab vastava registriga edukalt suhelda.
Pilve jalajälg on veelgi suurem. Amazon Web Services'is loetleb pahavara keskkonnamuutujaid, näiteks AWS_ACCESS_KEY_ID ja AWS_SECRET_ACCESS_KEY, parsib ~/.aws/credentials ja ~/.aws/configja esitab päringu EC2 eksemplari metaandmete teenusele aadressil 169.254.169.254, eelistades IMDSv2, kuid vajadusel ka tagasi. Konteineri töökoormuste puhul suhtleb see ECS-i metaandmete lõpp-punktiga aadressil 169.254.170.2Kõik taastatud volitused või ajutised märgid testitakse sts:GetCallerIdentity kehtivuse kinnitamiseks enne väljafiltreerimise järjekorda panemist.
Sarnane loogika on olemas ka teiste pilveteenuse pakkujate puhul. Skript saab koguda Azure'i kliendi mandaadid ja hallatavad identiteedid, Sealhulgas AZURE_CLIENT_ID, AZURE_CLIENT_SECRET ja AZURE_TENANT_IDja seejärel pääseb pärast autentimist juurde Azure Key Vaultile, Azure Resource Managerile ja Microsoft Graphile. Google Cloudi puhul otsib see GOOGLE_APPLICATION_CREDENTIALS failid, esitab päringu GCP metaandmete serverile aadressil metadata.google.internal ja võimaluse korral kasutab saadud märke Google Secret Manageri kutsumiseks. Nimekirjas on ka HashiCorp Vaulti juurutused: kasulik koormus otsib Vaulti aadresse ja märke keskkonnamuutujate ja märkefailide kaudu ning seejärel sondeerib Vaulti HTTP API-t ligipääsetavate saladuste loetlemiseks.
Lisaks pilvepõhisele IAM-ile teeb pahavara ulatuslikku tööd failisüsteemi pühkimine, kasutades üle 150 globaalse mustriSee otsib SSH privaatvõtmeid, Dockeri konfiguratsioone, .env failid, Giti volituste salvestusruumid, .npmrc ja .pypirc faile, Terraformi ja cargo mandaate, shelli ajaloo faile, krüptovaluuta rahakoti andmeid ja konfiguratsioonikatalooge laialdaselt kasutatavatele sõnumsiderakendustele nagu Signal, Telegram Desktop, Discord, Slack ja Element. Samuti kontrollib see VPN-i konfiguratsioonifaile teenustest, sealhulgas NordVPN, ProtonVPN, CyberGhost, PIA ja teised, koos binaarhoidlate haldurite, näiteks JFrog Artifactory, tokenite ja domeenidega.
Väljafiltreerimine GitHubi repositooriumide ja „meow meow meow” commit'ide kaudu
Pärast kõigi nende saladuste kogumist vajab pahavara kohta, kuhu need saata. Fikseeritud ja hõlpsasti blokeeritava käsklus- ja kontrolldomeeni asemel toetuvad ründajad avalikele GitHubi repositooriumidele väljavoolukanalina , sulandades varastatud andmed arendajate tavapärasesse liiklusvoogu.
Esmalt otsib kasulik koormus GitHubi avalikust muudatuste ajaloost sõnumeid, mis vastavad kindlale mustrile, mis sisaldab nähtavale kohale krüpteeritud märgi, kasutades fraasi, mis noomib kasutajaid selle tühistamise eest. Kui selline muudatuste muudatus on leitud, dekrüpteerib pahavara manustatud märgi ja kasutab seotud kontot uue hoidla loomiseks, kuhu varastatud andmeid salvestatakse. See kaudne lähenemine tähendab, et ühelt ohvrilt võetud volitused salvestatakse hoidlatesse, mis tehniliselt kuuluvad teisele GitHubi kasutajale, mistõttu on ohustatud hoidlate võrgustiku jälgimine ühe ründaja identiteedini raskem.
Äsja loodud repositooriumidel on veidrad, automaatselt genereeritud nimed koosneb kahest Touhou projekti sarja tegelasest ja juhuslikust arvust, mille tulemuseks on sellised kombinatsioonid nagu cirno-marisa-74291 or reimu-kogasa-12048Nende kirjeldused on seatud sama fraasiga „Trinitite: Sponsored by Preview 2 Effects”, mida näeb ka kasulikus koormuses, pakkudes kaitsjatele ühte vähestest selgetest markeritest, kes püüavad neid repositooriume suuremas mahus tuvastada.
Varastatud volitused edastatakse krüpteeritud JSON-failidena a-s. results/ kataloog, kasutades failinimesid, mis algavad doubletrinnys- millele järgneb loendur ja ajatempel. Iga fail sisaldab envelope krüpteeritud andmepaketti sisaldav väli ja key väli, mis sisaldab krüpteerimisvõtit ennast, mis on omakorda pakitud ründaja RSA avaliku võtme abil. Pealiskaudselt vaadates näevad need välja nagu suvalised krüpteeritud plekid. Ainult keegi, kellel on vastav privaatvõti, saab protsessi tagasi pöörata, seega isegi kui hoidlad leitakse, tegelikud saladused jäävad kolmandatele isikutele läbipaistmatuksCommit-sõnumid on tavaliselt lühikesed ja kergemeelsed, kasutades korduvalt selliseid tekste nagu „miau miau miau“.
Ussilaadne levimine teistesse npm-pakettidesse ja GitHubi projektidesse
Üks Trinitite'i kampaania kõige murettekitavamaid aspekte on selle võime varastatud tokeneid uuesti kasutada täiendavate pakettide ja repositooriumide kahjustamiseks . Selle asemel, et piirduda ainult algse TanStack Query koodigeneraatori paketiga, käitub pahavara nagu uss, otsides süstemaatiliselt levimisviise.
Kehtiva npm-tokeni olemasolul esitab kasulik koormus npm API-le päringu, et loetleda kõik kontoga seotud tokenid, valides kõige privilegeerituma avaldamistokeni. Seejärel otsib see kõiki selle hooldaja omanduses olevaid pakette, laadib alla igaühe olemasoleva tarballi ja süstib paketi sisusse sama binding.gyp sandbox escape'i ja peamise kasuliku koormuse faili. Pärast muudatusi avaldab see npm-is uue versiooni õigustatud hooldaja nime all, muutes usaldusväärsed paketid uuteks nakkusvektoriteks . Sarnast käitumist rakendatakse PyPI ja RubyGemsi jaoks nende vastavate üleslaadimise lõpp-punktide kaudu, kusjuures TLS-sertifikaatide kontrollid on väljaminevates päringutes keelatud, et vältida kliendipoolseid kinnitamisprobleeme.
GitHubi repositooriume käsitletakse sarnasel viisil. Kui pahavara saab piisava ulatusega GitHubi tokeni, loetleb see kõik ligipääsetavad repositooriumid ja harud, jättes vahele mõned teadaolevad automatiseerimisharud, näiteks need, mille eesliide on release/, dependabot/, renovate/ or copilot/Ülejäänud harude jaoks lisab see commit'i hoolikalt valitud failide komplekti, mis toimivad nii tagauksena kui ka konksudena kaasaegsetesse arendustööriistadesse.
Nende hulgas on tagaukse abil kaitstud VS Code'i ja Claude'i konfiguratsioonifailid, Sealhulgas .vscode/tasks.json, .claude/settings.json ja skriptid nagu setup.mjs mis käivitatakse siis, kui arendaja avab projekti teatud tehisintellekti abil töötavates redaktorites. Pahavara lisab ka võltsingu .github/workflows/codeql.yml töövoog, mis maskeerub turvaskannimiseks, pakkudes samal ajal CI-s koodi käivitamiseks teist kanalit. Täiendavad failid on suunatud teistele redaktoritele ja tööriistadele, näiteks Gemini, Cursor ja mitmesugused koodiassistendid, aidates ründajal säilitada püsivust kõikjal, kus arendajad tegelikult töötavad.
Kõik need muudatused on loodud vastavalt github-actions identiteet, mille sõnumid näevad välja nagu rutiinne hooldus, näiteks „töö: sõltuvuste värskendamine” ja haagise märgistamine skip-checks:true kohustuslikest kontrollidest mööda libiseda. Kiirelt logisid läbi lugeva meeskonna jaoks võib neid muudatusi kergesti ekslikult pidada kahjutud automatiseerimisuuendused.
TanStacki päringutööriistu kasutavate meeskondade kompromissi näitajad
Organisatsioonide jaoks, mis tuginevad TanStack Queryle ja on oma töövoogu integreerinud @7nohe/openapi-react-query-codegen, alustatakse võimaliku ohu tuvastamist versiooni- ja failitaseme indikaatoritest, mida mitmed allikad on nüüdseks esile tõstnud. Need vihjed aitavad kindlaks teha, millised projektid võisid installimisetappide ajal ohustatud koodi käivitada.
Eelpool loetletud @7nohe/openapi-react-query-codegeni mõjutatud versioonide mis tahes kasutamist tuleks käsitleda kahtlasena, eriti kui versioonid on loodud jagatud CI-infrastruktuuril või arendaja sülearvutitel, millel on juurdepääs tundlikele volitustele. Turvameeskondadel soovitatakse auditeerida lukustusfaile, package.json-i ajalugu ja versioonilogisid, et kinnitada, kas need versioonid on kunagi tootmis- või testimiskeskkondadesse lisatud.
Kettal on peamine märk kompromiteerimisest paketi juurkataloogis oleva faili 3FWCvzduYZg.js olemasolu . Uurijad on katalooginud mitu SHA-256 räsi, mis on seotud selle skripti erinevate hägustatud versioonidega ja kõik seotud sama alusfunktsionaalsusega:
- 8e5d1af68ca340ae0c6e8132cb00c686ec2d60502c1994d94ce353d1472ad5a3
- b49afb7dba04cd99b357ce7c652c823a3707f28e130bd5c6645851a7adc030d6
- 59370c67b54a0ccaedd265e2356f04540b2fba1e1845300ef6de4d5437d99380
- 778d6f0058045d6a2ab9a7e1d3e3be8e7e6b4d9cc217d13949bf1dfbab759a7c
- b24d121667f21f492cb9db34fbfd515d5922a8dd30b9c45215c7220abbb10ca8
- e1f1162ece9a6e6ea21a20399cbf31c563a8149d433a68711f4223870c203d5a
- b6012b2ff87f08f93ee53921c48db907ddbcf5461b03bb988083b01a36886237
- 709af2fdeb50324229e94c44c679a0fab18bd8e17d3864405989c526cbb63ad8
Lisaks loovad paljud nakatunud hostid ajutisi katalooge, mille nimed algavad tähega trinnyyyy- millele järgneb lühike juhuslike tähtnumbriliste märkide jada süsteemi ajutises kaustas. Kuigi see muster üksi ei tõesta ohtu sattumist, suurendab see koos kahtlase binding.gyp faili ja ühe teadaoleva kasuliku koormuse räsiga märkimisväärselt tõenäosust, et Trinitite pahavara on selles süsteemis käivitunud.
Mõned turvatarkvara pakkujad on need indikaatorid juba oma tuvastusvoogudesse lisanud. Näiteks platvormid, mis keskenduvad arendajatööriistadele ja tarneahela turvalisusele, märgistavad nüüd iga repositooriumi või projekti, mis impordib mõjutatud versioone, kriitilise pahavaraprobleemina , määrates sellele sageli maksimaalse raskusastme, et algatada kohene uurimine. Meeskondi julgustatakse oma organisatsioonides uuesti skannima, eriti keskkondades, kus TanStack Query on rakenduste arhitektuuri keskmes ja koodi genereerimise tööriistu kasutatakse laialdaselt.
npm-i, yarni, pnpm-i ja nendega seotud paketihaldurite ees on tekkimas spetsiaalsed tööriistad ja avatud lähtekoodiga utiliidid, mis kontrollivad enne installimist paketiversioone kureeritud luurevoogude alusel. Idee seisneb pahatahtlike või kahtlaste pakettide, eriti selliste juhtumitega seotud pakettide, pealtkuulamises enne, kui need üldse arvutisse jõuavad. node_modules, vähendades ohtu, et ohustatud abiraamatukogu võib kaudselt paljastada TanStacki päringupõhised rakendused ja nendega seotud infrastruktuur.
Arendusmeeskondade jaoks rõhutab see juhtum, kuidas pealtnäha süütust mugavuspaketist – mis lihtsalt genereerib OpenAPI spetsifikatsioonist TanStack Query jaoks tüüpkonksud – võib saada võimas rünnakuvektor, kui selle CI-torustik ja jaotuskanal õõnestatakse. Kaitsemeetmed peavad nüüd laienema peamiste rakenduse sõltuvuste kontrollimisest kaugemale, hõlmates generaatoreid, CLI-sid ja automatiseerimisskripte, mis vaikselt kujundavad nende sõltuvuste igapäevast kasutamist.