Pakej npm Pertanyaan TanStack disasarkan melalui penjana kod OpenAPI yang dikompromi pada npm

Kemaskini terakhir: 08/29/2026
Pengarang C SourceTrail
  • Pelbagai versi @7nohe/openapi-react-query-codegen pada npm telah dikompromi, membenamkan muatan perisian hasad yang canggih yang menyalahgunakan aliran kerja berasaskan Pertanyaan TanStack.
  • Serangan itu menggunakan skrip pelepasan kotak pasir binding.gyp dan prapasang untuk melaksanakan pencuri JavaScript berbilang lapisan semasa pemasangan npm, walaupun tanpa cangkuk kitaran hayat yang eksplisit.
  • Muatan tersebut telah memperoleh pelbagai kelayakan pembangun dan awan (GitHub, npm, AWS, Azure, GCP, Vault, Kubernetes dan banyak lagi) dan mengeluarkannya ke repositori GitHub awam.
  • Cacing itu menyalahgunakan token yang dicuri untuk menjangkiti pakej npm, PyPI, RubyGems dan repo GitHub tambahan, menonjolkan risiko rantaian bekalan yang lebih luas di sekitar penggunaan npm TanStack Query yang popular.

Pakej npm Pertanyaan TanStack

Pada akhir Ogos 2026, penyelidik keselamatan menemui satu serangan rantaian bekalan yang disasarkan dikaitkan dengan ekosistem npm Pertanyaan TanStack melalui penjana kod OpenAPI yang popular. Insiden ini tertumpu pada pakej @7nohe/openapi-react-query-codegen, alat yang menjana cangkuk selamat jenis secara automatik untuk Pertanyaan TanStack terus daripada skema OpenAPI, dan telah menyaksikan lebih daripada 150,000 muat turun mingguan pada npm.

Daripada mengejar pustaka teras TanStack Query itu sendiri, penyerang telah menjejaskan perkakasan sekitar yang banyak pasukan andalkan untuk menghasilkan cangkuk TanStack Query , memasukkan muatan perisian hasad yang kompleks ke dalam berbilang keluaran penjana. Oleh kerana cangkuk ini dipasang terus ke dalam pangkalan kod pengeluaran React dan TypeScript, impaknya melangkaui satu pakej, menyentuh mana-mana saluran paip CI atau mesin pembangun yang memasang versi tercemar.

estado estable de javascript 2025
Artikel berkaitan:
Keadaan Stabil JavaScript Moden

Bagaimana serangan itu menyalahgunakan penjana kod Pertanyaan TanStack pada npm

Perpustakaan yang terjejas, @7nohe/openapi-react-query-codegen, digunakan secara meluas untuk membentuk lapisan cangkuk Pertanyaan TanStack daripada kontrak OpenAPI, menyelamatkan pasukan daripada logik pengambilan berulang yang ditulis tangan. Dalam tempoh kira-kira 20 minit, penyerang menolak sepuluh versi berniat jahat pakej ini ke daftar npm, semuanya mempunyai pengesahan asal usul yang sah yang dihasilkan melalui GitHub Actions.

Pengesahan tersebut, biasanya merupakan isyarat integriti yang kuat, menjadi tidak bermakna kerana aliran kerja GitHub Actions projek itu sendiri telah dikompromi . Dengan mengeksploitasi kerentanan dalam aliran kerja tersebut, pelaku ancaman memperoleh keupayaan untuk menghantar binaan trojan sambil masih menjana bukti kriptografi bahawa ia datang daripada saluran paip "rasmi". Repositori GitHub yang sepadan nampaknya telah diambil alih dalam langkah yang sama, memberikan penyerang kawalan penuh terhadap proses pelepasan.

Kempen ini mencerminkan insiden rantaian bekalan terdahulu yang berkaitan dengan npm tetapi menambah kelainan: ia secara khusus menyasarkan persilangan penggunaan perkakasan OpenAPI dan Pertanyaan TanStackOleh kerana penjana memancarkan kod React yang bergantung pada @tanstack/react-query, mana-mana organisasi yang memasukkannya ke dalam penjanaan klien API automatik mereka berisiko menarik perisian hasad ke dalam ejen binaan, pelari CI atau komputer riba pembangun.

Penyiasat juga menyatakan bahawa penjenamaan perisian hasad itu—yang menggelarkan dirinya sebagai “ Trinitite: Ditaja oleh Preview 2 Effects ”—menggemakan gaya teater operasi berkaitan TeamPCP sebelumnya, walaupun masih tidak jelas sama ada ini adalah kerja peniru, kumpulan serpihan atau pelakon yang tidak berkaitan yang meminjam estetika tersebut.

Pelarian kotak pasir Binding.gyp: melancarkan perisian hasad semasa pemasangan npm

Salah satu pilihan teknikal yang lebih luar biasa dalam serangan TanStack Query–bersebelahan ini ialah penyalahgunaan binding.gyp sebagai vektor pelaksanaan semasa pemasangan npmDalam keadaan biasa, binding.gyp menerangkan cara mengkompilasi addon Node.js asli. Apabila npm menemui fail sedemikian, ia akan memanggil node-gyp, yang seterusnya menilai conditions medan menggunakan Python.

Versi berniat jahat bagi @7nohe/openapi-react-query-codegen mengeksploitasi tingkah laku ini dengan memasukkan Pelarian kotak pasir Python dalam conditions menyekatDaripada mengandungi konfigurasi binaan yang tidak berbahaya, fail tersebut menjalankan hierarki kelas dalaman Python untuk mencapai catch_warnings kelas, berpusing ke __builtins__, import os, dan akhirnya memanggil os.system untuk melaksanakan muatan JavaScript dengan Node.

Sebaik sahaja pengeliruan itu dilucutkan, keadaannya bermuara kepada satu arahan: node 3FWCvzduYZg.js dilaksanakan secara automatik semasa pemasangan. Selebihnya binding.gyp kandungan secara efektifnya hanyalah tabir asap: nama sasaran yang diisytiharkan tidak bermakna, jenisnya dikodkan heksadesimal none, dan tiada kompilasi natif sebenar berlaku.

Tidak semua keluaran tercemar hanya bergantung pada helah ini. Dua tag pra-pelepasan yang digunakan secara konvensional preinstall skrip sebaliknya, satu yang menggunakan fail setempat nu.js dan satu lagi memuat turun masa jalan Bun melalui wget paip ke bash sebelum memulakan skrip yang dinamakan dengan berani is_it_this_simple.jsVersi-versi kemudian digandakan, menggabungkan binding.gyp mengeksploitasi dengan cara yang eksplisit "preinstall": "node 3FWCvzduYZg.js" kemasukan di package.json untuk memaksimumkan peluang muatan akan berjalan.

Muatan JavaScript berbilang lapisan yang dibina untuk mengelakkan kotak pasir

Di tengah-tengah penjana Pertanyaan TanStack yang dikompromi terletak 3FWCvzduYZg.js, fail satu baris dengan berat kira-kira 5.4 MB, diletakkan di dalam root pakej npm. Skrip ini sangat dikaburkan, menggunakan pelbagai peringkat penyulitan untuk memperlahankan pemeriksaan dan untuk menggagalkan alat analisis statik.

Lapisan paling luar ialah tatasusunan integer gergasi didekripsi melalui XOR dengan kunci tetap, yang mendedahkan kod yang memuat turun masa jalan Bun secara senyap ke dalam direktori sementara (di bawah nama seperti trinnyyyy-XXXXX dalam folder sementara sistem). Bun kemudiannya digunakan untuk melaksanakan segmen yang disulitkan seterusnya, yang disimpan sebagai data yang dilindungi AES-128-GCM yang terbenam di dalam skrip.

Setelah dinyahsulit dan dinyahkelirukan sepenuhnya, penganalisis menemui muatan dalaman sekitar 800 KB JavaScript yang berfungsi sebagai pencuri kelayakan, cacing penyebaran sendiri dan utiliti pemusnah . Skrip dalaman ini menggunakan sifer jadual tersuai yang dikocok berlapis di atas transformasi obfuscator.io yang terkenal, sekali lagi menandakan bahawa penulis bertujuan khusus untuk menentang kejuruteraan terbalik automatik.

Sebelum melakukan sebarang kerosakan sebenar, perisian hasad tersebut melakukan siri pemeriksaan persekitaran yang direka untuk mengelak daripada penyelidik keselamatan dan pengimbas automatikIa keluar secara senyap jika ia mengesan lokasi sistem Rusia, alat EDR biasa daripada CrowdStrike, SentinelOne atau Carbon Black, direktori kotak pasir yang diketahui digunakan oleh produk pengimbasan rantaian bekalan, awalan rahsia palsu (seperti AKIAFAKE atau token npm decoy), atau nama organisasi GitHub yang berkaitan dengan demo penyelidikan keselamatan. Ia juga mencari kehadiran alat harden-runner StepSecurity, dan akan berundur jika ia melihat konfigurasi CI yang telah dikeraskan itu.

Apa yang cuba dicuri oleh perisian hasad daripada pengguna TanStack Query dan seterusnya

Sebaik sahaja syarat pelaksanaan dipenuhi, muatan mula mengumpul pelbagai kelayakan secara sistematik yang lazimnya terdapat dalam aliran kerja berasaskan JavaScript dan TanStack Query moden . Tumpuannya bukan pada rangka kerja bahagian hadapan itu sendiri, tetapi pada infrastruktur awan dan pembangun yang biasanya digunakan oleh klien TanStack Query.

Akses GitHub adalah sasaran utama. Perisian hasad mencari token akses peribadi klasik dan token berbutir halus yang lebih baharu dalam pembolehubah persekitaran dan lokasi sistem fail. Pada pelari Tindakan GitHub, ia cuba mendapatkan token OIDC menggunakan standard ACTIONS_ID_TOKEN_REQUEST_TOKEN dan URL yang berkaitan, memanfaatkan mekanisme yang sama yang digunakan oleh aliran kerja sah untuk kelayakan awan yang berjangka pendek.

Daftar pakej merupakan satu lagi sumber data utama. Skrip tersebut berbunyi fail konfigurasi npm seperti ~/.npmrc, mengimbas token pembawa dan mengesahkannya terhadap pendaftaran npm whoami titik akhirIa menggunakan logik yang serupa untuk PyPI Python (mencari token bermula dengan pypi-AgEIcHlwaS5vcmcCJ) dan RubyGems (mencari rubygems_ token), memberikan penyerang akses berpotensi kepada jejak merentas ekosistem yang luas.

Penuaian kelayakan awan adalah lebih meluas. Siasatan perisian hasad Pembolehubah persekitaran dan fail konfigurasi berkaitan AWS, perkhidmatan metadata tika EC2 dan titik akhir metadata ECS, Dengan menggunakan sts:GetCallerIdentity panggilan untuk mengesahkan bahawa sebarang kelayakan yang ditemui adalah sah sebelum mengeluarkannya. Ia mengulangi corak untuk Azure (ID klien, rahsia, identiti terurus dan juga Azure Key Vault) dan untuk Google Cloud, akaun perkhidmatan semak JSON, pelayan metadata dan Pengurus Rahsia sebaik sahaja ia mempunyai token yang boleh digunakan.

Di luar pendaftaran awan dan pakej, skrip tersebut mencari cakera setempat untuk lebih 150 corak glob yang berbeza, termasuk kunci peribadi SSH, konfigurasi Docker, .env fail, stor kelayakan Git, direktori dompet kripto, klien pemesejan seperti Signal atau Telegram Desktop, konfigurasi VPN dan juga fail konfigurasi yang dipautkan kepada alatan AI seperti Claude. Keluasan ini mencerminkan pemahaman tentang cara aplikasi yang disokong oleh TanStack Query biasanya dibangunkan dan digunakan: selalunya dalam persekitaran di mana satu mesin atau kerja CI mempunyai kelayakan yang luas untuk repositori, pendaftaran dan penyedia awan.

Pengekstrakan melalui repos GitHub dan penyebaran seperti cacing

Sebaik sahaja data dikumpul, perisian hasad ini mengambil pendekatan yang luar biasa terhadap penyusupan keluar. Daripada menyiarkan ke pelayan arahan dan kawalan tradisional, ia menggunakan repositori GitHub sebagai kotak drop awam yang disulitkan . Ini bukan sahaja sebati dengan trafik pembangun biasa, terutamanya dalam organisasi yang banyak menggunakan TanStack Query yang sudah berinteraksi dengan GitHub secara berterusan, tetapi juga menjadikan penghapusan lebih rumit.

Skrip tersebut mula-mula mencari dalam sejarah komit awam GitHub untuk mesej yang sepadan dengan corak yang sangat spesifik yang mengekod token yang disulitkan di dalam teks mesej komit. Ia kemudian menyahsulit token tersebut untuk mendapatkan semula kelayakan GitHub, yang digunakannya untuk mencipta repositori baharu untuk setiap mangsa . Ini bermakna data yang dicuri daripada satu mesin akhirnya disimpan di bawah akaun yang sama sekali berbeza dan telah dikompromi, sekali gus mengeruhkan lagi atribusi.

Setiap repositori penapisan dinamakan oleh menggabungkan nama watak Projek Touhou rawak dengan akhiran angka (sebagai contoh, cirno-marisa-74291), dan penerangannya ditetapkan kepada slogan perisian hasad itu sendiri, “Trinitit: Ditaja oleh Preview 2 Effects.” Dalam repo ini, skrip tersebut mengkomit fail JSON yang dinamakan seperti doubletrinnys-{counter}-{timestamp}.json di dalam a results/ folder.

Susun atur JSON adalah ringkas tetapi disulitkan dengan teliti: ia menyimpan envelope mengandungi sebahagian besar kelayakan yang dicuri dan a key medan dengan kunci sesi yang disulitkan melalui kunci RSA awam penyerang. Ini memastikan bahawa walaupun fail tersebut secara teknikalnya awam, hanya seseorang yang memegang kunci peribadi yang sepadan boleh membaca kandungannya, menyebabkan pemerhati kasual dan kebanyakan perayap automatik tidak dapat melihat apa yang telah dicuri.

Secara selari, perisian hasad bertindak sebagai cacing. Dengan token npm, PyPI atau RubyGems yang sah di tangan, ia menyenaraikan setiap pakej yang dimiliki oleh penyelenggara yang dikompromi dan menerbitkan versi baharu yang dijangkitiCorak jangkitan mengikuti skema yang sama yang digunakan dalam kompromi penjana kod Pertanyaan TanStack asal: menyuntik perisian berniat jahat binding.gyp, singgah 3FWCvzduYZg.js, dan menolak pakej menggunakan token penerbitan yang dicuri. Ia juga menyalahgunakan token GitHub yang dicuri untuk melalui repositori yang boleh diakses, menambah fail konfigurasi pintu belakang di bawah .vscode, .claude, .github/workflows, dan direktori yang serupa, semuanya di bawah mesej komit yang tidak berbahaya seperti "chore: update dependencies".

Tingkah laku seperti cacing ini menguatkan jejari letupan secara mendadak. Sebuah organisasi tunggal yang menggunakan TanStack Query dan @7nohe/openapi-react-query-codegen dalam rantaian CInya secara tidak sengaja boleh menyemai perisian hasad ke dalam berpuluh-puluh pakej dan repositori dalaman jika pembangun atau ejen binaan yang dikompromi menerbitkan keluaran baharu semasa dijangkiti.

Petunjuk kompromi untuk pengguna npm Pertanyaan TanStack

Bagi pasukan yang bergantung pada TanStack Query dan perkakasan npm yang berkaitan, beberapa perkara konkrit penunjuk kompromi (IOC) telah diterbitkan untuk membantu mengenal pasti pendedahanVersi berikut bagi @7nohe/openapi-react-query-codegen telah disahkan mengandungi muatan Trinitit dan harus dianggap tidak dipercayai:

  • 0.5.4 dan 0.5.5
  • 1.6.3 dan 1.6.4
  • 2.2.1 dan 2.2.2
  • 3.0.3 dan 3.0.4
  • Pra-keluaran 0.0.0-365d4eb738d3146583431948d3ba6e27a32556be dan 0.0.0-ec7876d6c917dad516ba69bbfafc948b834bf0ab

Sebarang penampilan fail JavaScript besar satu baris bernama 3FWCvzduYZg.js dalam direktori root pakej npm terdapat bendera merah yang kuat. Pelbagai hash SHA-256 bagi fail tersebut telah didokumenkan, dan pentadbir boleh membandingkannya dengan arkib pakej yang dipasang atau tarball yang disimpan dalam cache dalam daftar dalaman untuk mengenal pasti salinan yang diketahui rosak.

Pada sistem yang dijangkiti, direktori sementara yang dinamakan dengan trinnyyyy- awalan diikuti oleh enam aksara abjad angka rawak dalam folder sementara OS juga mungkin menunjukkan pelaksanaan sebelumnya. Direktori ini digunakan apabila memuat turun dan mementaskan masa jalan Bun yang diperlukan oleh muatan dalaman.

Selain pakej penjana khusus, organisasi harus menyemak data audit npm, cermin pakej dalaman dan log CI untuk yang tidak dijangka binding.gyp fail atau kemunculan secara tiba-tiba preinstall cangkuk dalam pakej yang sebelum ini tidak bergantung pada addon asli atau skrip kitaran hayat. Dalam konteks TanStack Query, ini biasanya bermaksud melihat dengan teliti sebarang penjanaan kod atau perkakasan integrasi OpenAPI yang dipasang pada React, Vue atau bahagian hadapan lain.

Akhir sekali, aktiviti GitHub perlu diteliti. Repositori dengan penerangan yang sepadan dengan “Trinitit: Ditaja oleh Kesan Pratonton 2”, atau dengan results/doubletrinnys-*.json fail dan mesej komit seperti "meow meow meow", harus disiasat sebagai titik akhir pengekstrakan yang berpotensi dikaitkan dengan penggunaan npm Pertanyaan TanStack yang terjejas.

Apa yang boleh dilakukan oleh pasukan TanStack-heavy Query sekarang

Bagi kebanyakan organisasi, langkah pertama adalah untuk inventori di mana dan bagaimana Pertanyaan TanStack dan perkakasan npm sekitarnya digunakanKerana pakej yang dikompromi menjana cangkuk khusus untuk @tanstack/react-query, ia cenderung muncul dalam projek dengan saluran paip penjanaan klien OpenAPI automatik dan penaipan yang kuat, selalunya disambungkan terus ke CI.

Pasukan harus mengesahkan sama ada mana-mana versi berniat jahat yang disenaraikan @7nohe/openapi-react-query-codegen pernah hadir dalam package-lock.json, pnpm-lock.yaml, Atau yarn.lock fail, atau ditarik ke dalam pokok kebergantungan melalui kebergantungan transitif. Walaupun pakej tidak lagi dipasang, penggunaan sejarah pada ejen binaan mungkin memerlukan siasatan yang lebih mendalam.

Jika terdapat kecurigaan kompromi, usaha selari harus difokuskan pada token dan kelayakan berputar yang dituai oleh perisian hasadIni termasuk token akses peribadi GitHub, token penerbitan npm, kunci akses awan dan sebarang rahsia tahan lama yang disimpan dalam pembolehubah persekitaran atau fail konfigurasi teks biasa pada pelari CI. Penyedia awan biasanya merekod sts:GetCallerIdentity dan panggilan serupa, yang boleh membantu mengecilkan tempoh pendedahan.

Alat keselamatan rantaian bekalan yang pakar dalam pengimbasan perisian hasad untuk pakej npm boleh membantu mengatasi jangkitan yang terlepas daripada pengimbas kerentanan tradisional. Sesetengah platform sudah mengklasifikasikan kempen ini sebagai isu perisian hasad yang kritikal, 100/100 tahap keterukan dan menyediakan imbasan semula setiap malam atau pemeriksaan atas permintaan untuk repositori yang bergantung pada Pertanyaan TanStack dan kebergantungan yang berkaitan.

Menjelang masa hadapan, organisasi yang banyak bergantung pada TanStack Query, @tanstack/react-query, Atau @tanstack/vue-query dalam pengeluaran mungkin mahu mengukuhkan pagar pengadang di sekitar pemasangan pakej. Itu boleh termasuk daftar proksi yang menyekat versi yang diketahui buruk, alat yang memintas arahan seperti npm install or pnpm add dan pakej semakan silang terhadap suapan risikan ancaman, dan penggunaan asal usul dan pengesahan tandatangan yang lebih ketat—dengan peringatan bahawa saluran paip CI yang terjejas masih boleh menghasilkan pengesahan "sah", seperti yang dilihat di sini.

Memandangkan tindanan bahagian hadapan semakin diseragamkan pada pustaka seperti TanStack Query untuk pengambilan dan penyimpanan data, penyerang berkemungkinan akan terus menyelidiki ekosistem sekitar penjana, CLI dan pemalam yang diterbitkan ke npm . Insiden ini menggariskan bagaimana pakej utiliti yang kelihatan sempit—yang hanya memancarkan cangkuk TanStack Query daripada fail OpenAPI—boleh menjadi titik masuk berimpak tinggi ke dalam sistem binaan, monorepos dan infrastruktur awan apabila dibiarkan tanpa pengawasan.

Penemuan kempen Trinitite menentang @7nohe/openapi-react-query-codegen mengetengahkan bagaimana Pakej npm popular yang dikaitkan dengan penggunaan Pertanyaan TanStack secara senyap boleh bertukar menjadi vektor serangan rantaian bekalan apabila aliran kerja pelepasan mereka terjejas. Dengan menyalahgunakan binding.gyp, pemuat JavaScript yang dikaburkan dan penapisan berasaskan GitHub, penyerang berjaya menyembunyikan pencuri kelayakan yang meluas di dalam alat yang dianggap oleh banyak pasukan sebagai sistem paip rutin. Bagi organisasi yang bergantung pada TanStack Query merentasi React dan bahagian hadapan lain, mengetatkan kebersihan npm, memantau skrip kitaran hayat yang mencurigakan dan mengeraskan saluran paip CI di sekitar OpenAPI dan perkakasan query-codegen bukan lagi tambahan pilihan tetapi sebahagian daripada model risiko teras.

Related posts: