TL; DR
Trà u 1 d'aprile è u 3 di maghju di u 2026, un solu editore npm, user0001, registratu cù l'indirizzu Gmail micca verificatu tanvisoul9@gmail.com, hà spintu tranquillamente sei pacchetti cù nomi deliberatamente blandi, chì sunanu cum'è infrastrutture: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, e node-env-resolve.
L'ultime duie versioni di node-env-resolve, 1.0.7 è 1.0.8, sò state segnalate da u sistema Malware Early Warning (MEW) di Xygeni u 2 di maghju è cunfirmate cum'è maliziose u 3 di maghju.
L'implantu hè insolitu per ciò chì ùn hè micca: ùn ci sò micca bot Telegram, nè richiami OAST, nè obfuscation, è nisun tentativu di piglià credenziali AWS à u mumentu di l'installazione. Invece, postinstall.js pianta una entrata di persistenza di avvio di Windows, aduprendu una chjave Run HKCU chì lancia wscript.exe contr'à un stub VBS. Dopu, genera un agente Node.js staccatu chì raggruppa moduli per a cattura di microfoni, u furtu di a cronologia di u navigatore, a creazione di screenshots è a simulazione di mouse/tastiera.
Chjamemu stu cluster DevTap, dopu à u kit, parte in esecuzione nantu à a macchina di un sviluppatore.
Tutti i sei pacchetti eranu dispunibili nant'à npm à u mumentu di a scrittura. Li avemu sottumessi à u canale d'abusu di u registru. I difensori devenu caccià tutte l'installazioni da l'editore in attesa di a rimuzione.
U Cluster: Sei Pacchetti, Un Editore
U contu di l'editore user0001 ùn hè micca verificatu. Ùn hà micca SCM verificazione, nisun email ligatu à u duminiu, è nisuna storia precedente. L'indirizzu Gmail tanvisoul9 ùn appare micca in alcun altru registru di editore npm chì pudemu truvà.
Tutti i sei pacchetti elencanu u listessu mantenitore, sò stati publicati da u listessu contu, è spartenu u listessu package.json schedula standard. Ùn ci hè micca repository, Innò homepage, e micca description più longu chè una sola linea.
A strategia di numinazione hè a parte interessante. À u cuntrariu di una campagna classica di cunfusione di dipendenze o typosquat, nisunu di sti nomi hè destinatu à una biblioteca upstream specifica. Invece, sò calibrati per sparisce in un veru package.json or npm ls output.
| pacchettu | Prima Publicata | Ultima Versione | versioni | Ruolo in u Cluster |
|---|---|---|---|---|
| centralogger | 2026-04-01 12:46 UTC | 1.0.9 | 5, da 1.0.5 à 1.0.9 | Copertina di "utilità di logging" di u cluster; prima publicazione |
| dom-utils-lite | 2026-04-14 07:36 UTC | 1.0.3 | 3 | Copertina generica di DOM-helper |
| node-fetch-lite | 2026-04-19 10:22 UTC | 1.0.2 | 3 | Imita a famiglia di recuperu di nodi |
| agente di cunnettore | 2026-04-25 05:12 UTC | 1.0.0 | 1 | Nome genericu "agente" |
| node-gyp-runtime | 2026-04-25 05:17 UTC | 1.0.0 | 1 | Imita l'arnesi di custruzzione di moduli nativi |
| node-env-resolve | 2026-04-25 05:21 UTC | 1.0.9 | 10, da 1.0.0 à 1.0.9 | Contagocce attivu; impianto cumpletu |
Nomi cum'è centralogger, node-fetch-lite, e node-gyp-runtime sò cuncipiti per sembrà senza cuntruversia in a revisione di u codice. Sembranu cose chì serianu digià in l'arburu di dipendenze di un prughjettu.
Cumbinati cù un editore frescu è micca verificatu è ligami di repositoriu mancanti, formanu un mudellu ricunniscibile: un attore chì semina nomi à bassa attritu in u registru, poi iterà rapidamente nantu à quellu chì importa. In questu casu, node-env-resolve hà ricevutu dece versioni in ottu ghjorni.
Ciò chì sbarca nantu à una Windows Dev Box
A catena maligna annantu node-env-resolve:1.0.8 hè cortu, direttu è insolitamente riccu di funzioni per un RAT npm.
Postinstallazione: Persistenza è Agente Staccatu
package.json dichjara un unicu hook d'installazione:
{ "scripts": { "postinstall": "node postinstall.js" } }postinstall.js face trè cose in ordine.
Prima, mette in scena un cartulare d'installazione fora di l'arburu npm. U percorsu hè calculatu à l'esecuzione in u script cum'è INSTALL_DIRDopu esegue un internu execSync('npm install --production --silent ...') dentru per tirà e dipendenze di runtime di l'implantu. Questu mette l'agente nantu à u discu in qualchì locu un manuale node_modules l'audit ùn truverà micca.
Siconda, scrive un launcher VBS è u registra per a persistenza di l'avvio:
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run \ /v ${AGENT_NAME} \ /t REG_SZ \ /d "wscript.exe \"${vbsPath}\"" /fwscript.exe hè u Windows Script Host, un binariu Microsoft firmatu chì funziona .vbs schedari senza una finestra di cunsola. Què hè precisHè per quessa ch'ellu hè favuritu per i stubs d'autorun.
Ci hè ancu una currispundenza reg delete percorsu dentru src/index.js, ciò chì suggerisce chì l'implantu hè cuncipitu per esse rimovibile facilmente à u cumandamentu di l'operatore.
Terzu, genera un prucessu figliolu staccatu:
spawn(node, [path.join(INSTALL_DIR, 'src/index.js')], { detached: true, env: { ...process.env, SERVER_URL } })Dui ditaglii importanu quì.
SERVER_URL hè lettu da l'ambiente. Di cunsiguenza, u puntu finale C2 hè cunfigurabile per implementazione è ùn hè micca integratu in u pacchettu. Sta scelta chjuca ma deliberata scunfighja a maiò parte di i sweep statichi-IOC.
Inoltre, u zitellu generatu eredita l'ambiente parentale cumpletu. Dunque, qualsiasi NPM_TOKEN, AWS_*, GITHUB_TOKEN, o u socket di l'agente SSH prisente in u shell di sviluppatore à u mumentu di l'installazione viaghja in a memoria di l'agente à longa durata.
Ciò chì l'agente spedisce
U bundle src/ L'arburu include trè moduli chì i so nomi solu dicenu a storia: audioCapture.js, browserHistory.js, e systemInfo.js.
A lista di dipendenze in tempu reale, risolta durante a messa in scena npm install, li corrobora.
Questu approcciu trasforma un incidente caòticu in una risposta cuntrullata.
Invece di reagisce à l'aveugla, e squadre operanu cù priorità chjara è riparazione rapida.
| Dependenza | À chì serve in questu cuntestu |
|---|---|
| screenshot-desktop | Cattura di schermu periodica |
| @nut-tree-fork/nut-js | Automatizazione / simulazione di input di mouse è tastiera |
| megliu-sqlite3 | Letture dirette di e basi di dati SQLite di Chrome, Edge è Firefox History |
| adm-zip | Raggruppamentu di l'artefatti raccolti prima di l'esfiltrazione |
| Sharp | Ridimensionamentu / cumpressione di screenshots è artefatti d'imagine |
| socket.io-client | Canale C2 bidirezionale persistente |
| node-machine-id | Impronta digitale stabile per host per u tracciamentu di a vittima |
systemInfo.js chjama os.networkInterfaces() per impronte digitali supplementari prima di u primu faro.
Perchè a cattura audio hè u segnale eccezziunale
A maiò parte di i RAT npm chì triemu in MEW si fermanu à u furtu secretu in tempu d'installazione. Leghjenu ~/.npmrc, leghje ~/.aws/credentials, raschjà process.env, POST à un webhook, è surtite. Questu currisponde à un mudellu ecunomicu smash-and-grab. I credenziali anu una corta mezza vita, è l'attaccante hà bisognu di monetizà rapidamente.
node-env-resolve hè diversa in forma.
A persistenza hè cunfigurata per sopravvive à u riavviu. L'agente funziona staccatu è di longa durata sottu wscript.exeU kit ch'ellu porta hè per esse quì nantu à a macchina di un sviluppatore, micca per piglià è lascià: un registratore di microfonu, un driver di tastiera/mouse, ingestione di a storia cumpleta di u navigatore, cattura di schermu è un canale Socket.IO interattivu versu un C2 configurabile.
A cattura di u microfonu in particulare hè a linea chì sta campagna attraversa chì a maiò parte di i malware npm ùn attraversanu micca.
Una stazione di travagliu di sviluppatore hè, sempre di più, ancu a stazione di travagliu induve i sviluppatori piglianu stand-up, chjamate cù i clienti, discussioni di cuncepimentu è ponti di guardia. Un implantu chì registra u microfonu ùn hè micca veramente dopu à u token npm di u sviluppatore. Hè dopu à ciò chì u sviluppatore dice davanti à u laptop.
Quellu inseme di capacità, più a mancanza di offuscazione è l'assenza di qualsiasi esfiltrazione appariscente in tempu d'installazione, si legge cum'è un preposizionamentu per un accessu miratu piuttostu chè un furtu di credenziali opportunisticu.
Ùn dichjaremu micca l'attribuzione solu da questu. Nutemu u prufilu operativu.

A cadenza d'iterazione di ottu ghjorni node-env-resolve hè u dettagliu u più operativamente significativu in a cronologia.
Questu ùn hè micca un dropper di tipu "fire-and-forget". L'editore mantene attivamente u dropper, ciò chì di solitu significa una di e duie cose. O u stanu aghjustendu à l'ambienti di prova prima di una implementazione più larga, o anu digià a telemetria d'installazione chì torna è ci stanu rispondendu.
L'altri cinque pacchetti ùn anu vistu nisuna perdita dopu a so publicazione iniziale. Questu currisponde à un mudellu "mette in scena una volta, lasciate cù nome" per u cluster di supportu mentre u sforzu d'ingegneria si cuncentra nantu à u pacchettu chì face u travagliu.
Attribuzione: Picculi indizii, nisun verdettu fermu
Public OSINT I signali sò fini, è ùn li stenderemu micca. Ciò chì hè osservabile:
L'identificatore di Gmail tanvisoul9 s'assumiglia parzialmente à un nome di battesimu sud-asiaticu, "Tanvi". Questu hè un signale debule. I manichi Gmail ùn sò micca identità, è a fine soul9 hè genericu. Ùn hè micca sicuru di deduce a geugrafia da una parte lucale di email solu.
U stile di u codice ùn hè micca rimarchevule Node.js: standard chjamate di biblioteca cum'è os, child_process, spawn, e reg addÙn ci hè nisuna offuscazione, nisuna rotazione di stringa, è nisuna logica anti-debug. L'autore hè à l'aise cù e primitive di u registru di Windows è l'orchestrazione di prucessi detached-child, ma ùn pare micca circà tecniche più furtive chì puderianu plausibilmente aduprà.
E dipendenze sò cumpletamente dispunibili è ben cunnisciute: screenshot-desktop, nut-js, better-sqlite3, e socket.io-clientÙn ci hè micca protocolu persunalizatu, nisuna pila C2 riprodotta da zero, è nisun novu truccu di persistenza al di là di un manuale. Chjave di Esecuzione HKCUQuestu hè un integratore cumpetente, micca un autore di strumenti.
Ùn avemu trovu stringhe micca in inglese, cumenti integrati, dati lucali, o impronte digitali di fusu orariu di output di u compilatore in l'artefatti publicati.
Avemu verificatu a sovrapposizione di codice cù campagne precedenti chì digià seguitemu, cumprese Shai Hulud, Owlivion, Buildkite, è u recente heibai / claude-code-best Famiglia di cloni Anthropic-CLI. Ùn ne avemu trovu nimu: nisun mudellu C2 spartutu, nisun layout di file spartutu, è nisun idiomu spartutu.
Ciò chì ùn diceremu micca: chì questu hè un attore statale, un gruppu cunnisciutu, o geograficamente ligatu à qualsiasi paese specificu.
U prufilu operativu hè coerente cù una piccula squadra moderatamente qualificata chì face a surveglianza di a stazione di travagliu di i sviluppatori. Hè prubabilmente motivatu finanziariamente da l'usu downstream di l'accessu, ma forse ancu da a ricunniscenza cum'è serviziu per un cumpratore separatu.
Dui punti indiretti sustenenu questu: l'evità di meccaniche di esfiltrazione chì attiranu l'attenzione è chì brusgiarianu rapidamente u cluster, cum'è i bot di Telegram, oastify.com, o canarytokens, è i nomi di pacchetti deliberatamente blandi, chì favuriscenu installazioni tranquille à coda longa invece di un breve piccu di grande vulume.
Indicatori di Compromissione è Rilevazione
| Pacchetti è Editore | |
|---|---|
| campu | Value |
| editore npm | utilizatori0001 |
| E-mail di l'editore | tanvisoul9@gmail.com, micca verificatu |
| Packages | centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, node-env-resolve |
| Maliziosu cunfirmatu | node-env-resolve@1.0.7, node-env-resolve@1.0.8 |
| Artefatti di l'ospite | |
|---|---|
| Type | Value |
| Chjave di persistenza | HKCU\Software\Microsoft\Windows\Versione Attuale\Eseguisce |
| Valore di persistenza | Nome di a variabile; dati di a forma wscript.exe " \\ .vbs" |
| Installà u ganciu | postinstall: node postinstall.js in u manifestu di u pacchettu |
| Moduli d'implantu | src/audioCapture.js, src/browserHistory.js, src/systemInfo.js |
| Repertoriu di messa in scena | INSTALL_DIR risolta fora di i node_modules di u prugettu; locu definitu da postinstall.js à u mumentu di l'installazione |
| Network | |
|---|---|
| Type | Value |
| Trasportu C2 | socket.io-client, canale bidirezionale persistente |
| Puntu finale C2 | Furnitu à l'agente per mezu di a variabile d'ambiente SERVER_URL; micca codificatu in modu fissu in artefatti publicati |
Note di rilevazione
Dui reguli catturanu sta famiglia senza bisognu di u puntu finale C2.
Prima, signalate i scripts di postinstallazione chì eseguiscenu un'operazione interna npm install in un percorsu fora di u cartulare di u pacchettu. Ogni scaricatore di prebuild legittimu, cum'è node-gyp ricustruisce o scaricatori binari precustruiti, scrive in u pacchettu o in a piattaforma-standard percorsi di cache cù hash verificati. Ùn scrive micca in un novu schedariu creatu INSTALL_DIR in altrò nant'à u discu.
Siconda, signalate i scripts di postinstallazione chì presentanu prublemi reg add HKCU\…\Run cù wscript.exe cum'è u lanciatore. Questu ùn hè essenzialmente mai legittimu da un pacchettu npm. Segnalalu è mettelu in quarantena.
Una terza euristica hè utile per individuà u prossimu pacchettu fratellu prima ch'ellu sia cunfirmatu: un novu editore npm senza SCM verificazione, un email Gmail, nò repository campu, è parechji nomi di pacchetti corti, generici, chì sunanu cum'è infrastruttura publicati à pochi ghjorni l'unu da l'altru hè, di per sè, abbastanza per ghjustificà una revisione manuale.
Segnalatu à u registru npm. Aggiorneremu questu articulu quandu u contu di l'editore serà eliminatu.






