TL; DR
1 aprel və 3 may 2026-cı il tarixləri arasında tək bir npm naşiri, user0001, təsdiqlənməmiş Gmail ünvanı ilə qeydiyyatdan keçib tanvisoul9@gmail.com, qəsdən sadəlövh, infrastruktur səsləndirən adlarla altı paketi səssizcə irəli sürdü: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtimevə node-env-resolve.
Ən son iki versiya node-env-resolve, 1.0.7 və 1.0.8 versiyaları 2 mayda Xygeni-nin Zərərli Proqram Erkən Xəbərdarlıq (MEW) sistemi tərəfindən qeydə alınıb və 3 mayda zərərli olduğu təsdiqlənib.
İmplant qeyri-adidir, amma əslində qeyri-adi deyil: Telegram botları, OAST geri çağırışları yoxdur, yox obfuscationvə quraşdırma zamanı AWS etimadnaməsini əldə etmək cəhdi yoxdur. Bunun əvəzinə, postinstall.js işə salan HKCU Run düyməsini istifadə edərək Windows açılış davamlılığı girişini yaradır wscript.exe VBS stub-una qarşı. Daha sonra mikrofon ələ keçirmə, brauzer tarixçəsinin oğurlanması, ekran görüntüsü çəkmə və siçan/klaviatura simulyasiyası üçün modulları birləşdirən ayrıca Node.js agentini işə salır.
Biz bu klasteri çağırırıq DevTap, dəstdən sonra geliştiricinin maşınında işləməyə davam edir.
Yazı yazıldığı zaman altı paketin hamısı npm-də aktiv idi. Biz onları reyestrin sui-istifadə kanalına təqdim etdik. Müdafiəçilər naşirdən silinməni gözləyən bütün quraşdırmaları ləğv etməlidirlər.
Klaster: Altı Paket, Bir Naşir
Naşir hesabı user0001 təsdiqlənməyib. Onun heç bir SCM Doğrulama, domenlə əlaqəli e-poçt və əvvəlki tarixçə yoxdur. Gmail ünvanı tanvisoul9 Tapa biləcəyimiz başqa heç bir npm naşir qeydində görünmür.
Altı paketin hamısı eyni texniki xidmətçini siyahıya alır, eyni hesabdan dərc olunub və eyni paylaşımı paylaşır package.json Qazan lövhəsi. Yoxdur repository, yox homepagevə yox description tək bir xəttdən daha uzun.
Adlandırma strategiyası maraqlı hissədir. Klassik asılılıq qarışıqlığı və ya yazı tipli kampaniyadan fərqli olaraq, bu adların heç biri müəyyən bir yuxarı axın kitabxanasını hədəf almır. Bunun əvəzinə, onlar real bir mühitə çevrilmək üçün kalibrlənir. package.json or npm ls çıxdı.
| Paketi | Birinci nəşr | Son Sürüm | Sürümleri | Klasterdəki rol |
|---|---|---|---|---|
| mərkəzi loqer | 2026-04-01 12:46 UTC | 1.0.9 | 5, 1.0.5-dan 1.0.9-a qədər | Klasterin “qeydiyyat proqramı” üz qabığı; ən erkən nəşr |
| dom-utils-lite | 2026-04-14 07:36 UTC | 1.0.3 | 3 | Generic DOM-köməkçi örtüyü |
| node-fetch-lite | 2026-04-19 10:22 UTC | 1.0.2 | 3 | Mimics node-fetch ailəsi |
| bağlayıcı-agent | 2026-04-25 05:12 UTC | 1.0.0 | 1 | Ümumi ad "agent" |
| node-gyp-runtime | 2026-04-25 05:17 UTC | 1.0.0 | 1 | Mimics doğma modul qurma alətləri |
| node-env-həll | 2026-04-25 05:21 UTC | 1.0.9 | 10, 1.0.0-dan 1.0.9-a qədər | Aktiv damcı; tam implant |
Kimi adlar centralogger, node-fetch-litevə node-gyp-runtime kod icmalında mübahisəsiz görünmək üçün hazırlanmışdır. Onlar artıq layihənin asılılıq ağacında olan şeylər kimi səslənir.
Təzə, təsdiqlənməmiş naşir və depo bağlantılarının olmaması ilə birlikdə, onlar tanınan bir nümunə yaradır: aktyor reyestrə aşağı sürtünməli adlar səpir, sonra isə vacib olan ad üzərində tez bir zamanda təkrarlayır. Bu halda, node-env-resolve səkkiz gün ərzində on versiya aldı.
Windows Dev Box-a Nə Düşür
Zərərli zəncir işə düşüb node-env-resolve:1.0.8 npm RAT üçün qısa, birbaşa və qeyri-adi dərəcədə xüsusiyyətlərlə zəngindir.
Postinstall: Davamlılıq və Ayrılmış Agent
package.json tək bir quraşdırma çəngəlini elan edir:
{ "scripts": { "postinstall": "node postinstall.js" } }postinstall.js ardıcıl olaraq üç işi görür.
Əvvəlcə, npm ağacının xaricində quraşdırma qovluğunu mərhələləşdirir. Yol skriptdə icra vaxtında aşağıdakı kimi hesablanır INSTALL_DIRSonra daxili bir işlədir execSync('npm install --production --silent ...') İmplantın işləmə müddətindən asılılıqları çıxarmaq üçün onun içərisindədir. Bu, agenti diskdə bir yerdə təlimat olaraq yerləşdirir node_modules audit tapmayacaq.
İkincisi, o, VBS başlatma cihazını yazır və onu açılış davamlılığı üçün qeydiyyatdan keçirir:
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run \ /v ${AGENT_NAME} \ /t REG_SZ \ /d "wscript.exe \"${vbsPath}\"" /fwscript.exe işləyən imzalı Microsoft ikili faylı olan Windows Script Host-dur .vbs konsol pəncərəsi olmayan fayllar. Bu əvvəlcədəndircisNiyə autorun stubları üçün üstünlük verilir.
Uyğunluq da var reg delete içəridəki yol src/index.js, implantın operatorun əmri ilə təmiz şəkildə çıxarıla bilən şəkildə dizayn edildiyini göstərir.
Üçüncüsü, bu, ayrıca bir uşaq prosesini yaradır:
spawn(node, [path.join(INSTALL_DIR, 'src/index.js')], { detached: true, env: { ...process.env, SERVER_URL } })Burada iki detal vacibdir.
SERVER_URL mühitdən oxunur. Nəticədə, C2 son nöqtəsi hər yerləşdirmə üçün konfiqurasiya edilə bilər və paketə daxil edilmir. Bu kiçik, lakin düşünülmüş seçim əksər statik-IOC süpürmələrini məğlub edir.
Həmçinin, dünyaya gələn uşaq tam valideyn mühitini miras alır. Buna görə də, istənilən NPM_TOKEN, AWS_*, GITHUB_TOKEN, və ya quraşdırma zamanı geliştirici qabığında mövcud olan SSH-agent yuvası uzunömürlü agentin yaddaşına keçir.
Agent nə ilə göndərir
Paketli src/ Ağac, yalnız adları hekayəni izah edən üç moduldan ibarətdir: audioCapture.js, browserHistory.jsvə systemInfo.js.
Mərhələli rejimdə həll edilən iş vaxtı asılılığı siyahısı npm install, onları təsdiqləyir.
Bu yanaşma xaotik bir hadisəni nəzarətli bir reaksiyaya çevirir.
Komandalar kor-koranə reaksiya vermək əvəzinə, aşağıdakılarla fəaliyyət göstərirlər aydın prioritetləşdirmə və sürətli düzəliş.
| asılılıq | Bu Kontekstdə Nə Üçündür |
|---|---|
| ekran görüntüsü-masaüstü | Periodik ekran görüntüsü |
| @nut-tree-fork/nut-js | Siçan və klaviatura avtomatlaşdırılması / giriş simulyasiyası |
| daha yaxşı-sqlite3 | Chrome, Edge və Firefox Tarix SQLite verilənlər bazalarının birbaşa oxunması |
| adm-zip | Eksfiltrasiyadan əvvəl toplanmış artefaktların birləşdirilməsi |
| kəskin | Ekran görüntülərinin və şəkil artefaktlarının ölçüsünü dəyişdirmək/sıxışdırmaq |
| socket.io-müştəri | Davamlı iki istiqamətli C2 kanalı |
| node-machine-id | Qurban izləmə üçün hər ev sahibi üçün sabit barmaq izi |
systemInfo.js zənglər os.networkInterfaces() ilk mayakdan əvvəl əlavə barmaq izi üçün.
Səs çəkilişi niyə əsas siqnaldır
MEW-də çeşidlədiyimiz əksər npm RAT-lar quraşdırma zamanı gizli oğurluqda dayanır. Onlar oxuyurlar ~/.npmrc, oxuyun ~/.aws/credentials, qaşımaq process.env, Vebhook-a POST göndərin və çıxın. Bu, "sındır və ələ keçir" iqtisadi modelinə uyğundur. Etimadnamələrin qısa yarımömrü var və hücumçu tez bir zamanda pul qazanmalıdır.
node-env-resolve formasına görə fərqlidir.
Davamlılıq yenidən başlatmadan sağ çıxmaq üçün qurulub. Agent ayrıca işləyir və uzun müddət işləyir wscript.exeDəsti götürüb tərk etmək üçün deyil, geliştiricinin maşınında olmaq üçündür: mikrofon yazıcısı, klaviatura/siçan drayveri, tam brauzer tarixçəsinin qəbulu, ekran görüntüsü və konfiqurasiya edilə bilən C2-yə geri qaytarılması üçün interaktiv Socket.IO kanalı.
Xüsusilə mikrofon ələ keçirmə, bu kampaniyanın əksər npm zərərli proqramlarının keçmədiyi xəttdir.
Geliştirici iş stansiyası getdikcə daha çox geliştiricilərin stand-up, müştəri zəngləri, dizayn müzakirələri və növbətçi körpülər qəbul etdiyi iş stansiyasıdır. Mikrofonu qeyd edən implant əslində geliştiricinin npm tokenindən deyil, geliştiricinin noutbukun qarşısında dediyi sözlərdən sonra olur.
Bu imkan dəsti, üstəgəl qarışıqlığın olmaması və hər hansı bir parlaq quraşdırma zamanı ifrazatın olmaması, fürsətçi etimadnamə oğurluğundan daha çox hədəf giriş üçün əvvəlcədən yerləşdirmə kimi oxunur.
Biz yalnız buna istinad etmirik. Əməliyyat profilini qeyd edirik.

Səkkiz günlük iterasiya kadensiyası node-env-resolve zaman xəttindəki ən əməliyyat baxımından ən çox məlumat verən detaldır.
Bu, "atəş et və unut" drop deyil. Naşir dropper-i aktiv şəkildə saxlayır ki, bu da adətən iki şeydən birini ifadə edir. Ya onlar daha geniş yerləşdirmədən əvvəl onu sınaq mühitlərinə uyğunlaşdırırlar, ya da artıq quraşdırma telemetriyası geri qayıdır və ona cavab verirlər.
Digər beş paket ilkin dərcindən sonra faktiki olaraq heç bir dəyişiklik görmədi. Bu, dəstəkləyici klaster üçün "mərhələni bitirdikdən sonra adlandırılmış vəziyyətdən çıxın" şablonuna uyğun gəlir, mühəndislik səyləri isə işi görən paketə yönəlib.
İstinad: Kiçik ipucları, Qəti hökm yoxdur
Ictimai OSINT siqnallar nazikdir və biz onları uzatmayacağıq. Müşahidə edilə bilən nədir:
Gmail ünvanı tanvisoul9 qismən Cənubi Asiyalılara məxsus "Tanvi" adına bənzəyir. Bu, zəif bir siqnaldır. Gmail ünvanları şəxsiyyət deyil və arxada qalanlar soul9 ümumidir. Coğrafiyanı yalnız e-poçtun lokal hissəsindən çıxarmaq təhlükəsiz deyil.
Kod stili diqqətəlayiq deyil. Node.js: standard kimi kitabxana zəngləri os, child_process, spawnvə reg addHeç bir qarışıqlıq, sətir fırlanması və səhvləri aradan qaldırma məntiqi yoxdur. Müəllif Windows qeyd dəftəri primitivləri və ayrılmış uşaq proseslərinin orkestrasiyası ilə rahatdır, lakin istifadə edə biləcəkləri daha gizli sənətkarlıqlara əl atmır.
Asılılıqlar tamamilə rəfdən kənardadır və hamıya məlumdur: screenshot-desktop, nut-js, better-sqlite3və socket.io-clientXüsusi protokol, sıfırdan tətbiq olunan C2 yığını və dərslikdən başqa yeni bir davamlılıq hiyləsi yoxdur. HKCU Run düyməsiBu, alət müəllifi deyil, səriştəli inteqratordur.
Dərc olunmuş artefaktların içərisində ingilis dilində olmayan sətirlər, daxil edilmiş şərhlər, yerli məlumatlar və ya kompilyator çıxışı vaxt qurşağı izləri tapmadıq.
Artıq izlədiyimiz əvvəlki kampaniyalarla kod üst-üstə düşməsini yoxladıq, o cümlədən Şai Hulud, Bayquş, Buildkite və son heibai / claude-code-best Antropik-CLI klon ailəsi. Heç birini tapmadıq: ortaq C2 şablonları, ortaq fayl düzülüşləri və ortaq idiomlar yox idi.
Biz nə deməzdik: bu, dövlət aktyoru, məlum qrup və ya coğrafi olaraq hər hansı bir konkret ölkə ilə əlaqəlidir.
Əməliyyat profili, kiçik, orta ixtisaslı bir komandanın geliştirici iş stansiyası nəzarəti ilə uyğun gəlir. Bu, çox güman ki, girişin sonrakı istifadəsi ilə maliyyə cəhətdən motivasiya olunur, lakin ayrı bir alıcı üçün xidmət kimi kəşfiyyat da mümkündür.
İki dolayı məqamı dəstəkləyir: Telegram botları kimi klasteri tez yandıracaq diqqət çəkən eksfiltrasiya mexanikasından qaçınmaq. oastify.com, və ya canarytokens və qısa, yüksək həcmli sıçrayış əvəzinə sakit uzunquyruqlu quraşdırmalara üstünlük verən qəsdən sadə paket adları.
Güzəşt və Aşkarlama Göstəriciləri
| Paketlər və Naşir | |
|---|---|
| Sahə | Dəyər |
| npm naşiri | user0001 |
| Naşirin e-poçtu | tanvisoul9@gmail.com, təsdiqlənməmiş |
| Paketlər | centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, node-env-resolve |
| Zərərli olduğu təsdiqləndi | node-env-resolve@1.0.7, node-env-resolve@1.0.8 |
| Ev sahibi artefaktlar | |
|---|---|
| növü | Dəyər |
| Davamlılıq açarı | HKCU\Software\Microsoft\Windows\CariVersion\Run |
| Davamlılıq dəyəri | Dəyişənin adı; wscript.exe formasının məlumatları " \\ .vbs" |
| Qarmağı quraşdırın | postinstall: paket manifestində postinstall.js node |
| İmplant modulları | src/audioCapture.js, src/browserHistory.js, src/systemInfo.js |
| Səhnələşdirmə kataloqu | INSTALL_DIR layihənin node_modules xaricində həll edildi; yer quraşdırma zamanı postinstall.js tərəfindən təyin edildi |
| şəbəkə | |
|---|---|
| növü | Dəyər |
| C2 daşınması | socket.io-klient, davamlı iki istiqamətli kanal |
| C2 son nöqtəsi | Agentə SERVER_URL mühit dəyişəni vasitəsilə təqdim olunur; dərc olunmuş artefaktlara sərt şəkildə kodlaşdırılmayıb |
Aşkarlama Qeydləri
C2 son nöqtəsinə ehtiyac olmadan bu ailəni iki qayda ilə tuturuq.
Əvvəlcə, daxili bir əməliyyat yerinə yetirən postinstall skriptlərini işarələyin npm install paketin öz qovluğundan kənar bir yola. İstənilən qanuni əvvəlcədən qurulmuş yükləyici, məsələn node-gyp ikili yükləyiciləri yenidən qurur və ya əvvəlcədən qurur, paketin içərisinə və ya platformaya yazır-standard Təsdiqlənmiş heşləri olan keş yolları. Yeni yaradılmış qovluğa yazmır INSTALL_DIR diskin başqa yerində.
İkincisi, problem yaradan postinstall skriptlərini işarələyin reg add HKCU\…\Run donor yumurtaları, wscript.exe başlatma cihazı kimi. Bu, əslində heç vaxt npm paketindən qanuni deyil. Onu işarələyin və karantinə alın.
Üçüncü evristika növbəti qardaş paketini təsdiqlənməzdən əvvəl aşkar etmək üçün faydalıdır: yeni npm naşiri, no. SCM doğrulama, Gmail e-poçtu, yox repository sahə və bir-birindən günlərlə fasilələrlə dərc olunmuş çoxsaylı qısa, ümumi, infrastruktur səsləndirən paket adları özlüyündə əl ilə nəzərdən keçirməyə əsas verir.
npm reyestrinə bildirildi. Naşir hesabı silindikdə bu paylaşımı yeniləyəcəyik.






