TL; DR
Ajavahemikul 1. aprillist kuni 3. maini 2026 üks npm-i väljaandja user0001, registreeritud kinnitamata Gmaili aadressiga tanvisoul9@gmail.com, lükkas vaikselt edasi kuus paketti tahtlikult maitsetute, infrastruktuuri meenutavate nimedega: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtimeja node-env-resolve.
Kaks viimast versiooni node-env-resolve, 1.0.7 ja 1.0.8, märgistas Xygeni pahavara varajase hoiatamise süsteem (MEW) 2. mail ja kinnitas pahatahtlikkuse 3. mail.
Implantaat on ebatavaline selle poolest, mis see pole: puuduvad Telegrami robotid, OAST-i tagasihelistamised, lukustumineja mitte proovida installimise ajal AWS-i volitusi hankida. Selle asemel postinstall.js istutab Windowsi käivituspüsivuse kirje, kasutades HKCU Run-võtit, mis käivitab wscript.exe VBS-i tüve vastu. Seejärel loob see eraldiseisva Node.js-i agendi, mis koondab mooduleid mikrofoni jäädvustamiseks, brauseriajaloo varguseks, ekraanipiltide tegemiseks ja hiire/klaviatuuri simulatsiooniks.
Me nimetame seda klastriks DevTap, pärast komplekti lahkumist arendaja masinas töötamast.
Kõik kuus paketti olid kirjutamise ajal npm-is saadaval. Oleme need esitanud registri kuritarvitamise kanalile. Kaitsjad peaksid eemaldama kõik eemaldamist ootavad installid avaldajalt.
Klaster: kuus paketti, üks kirjastaja
Väljaandja konto user0001 on kontrollimata. Sellel puudub SCM kinnitus, domeeniga seotud e-kirju pole ja varasemat ajalugu pole. Gmaili kasutajanimi tanvisoul9 ei esine üheski teises npm-i väljaandja kirjes, mida me leidsime.
Kõik kuus paketti loetlevad sama hooldaja, on avaldatud samalt kontolt ja jagavad sama package.json standardne versioon. Puudub repositoryJuures homepage, ja ei description pikem kui üks rida.
Nimetamisstrateegia on huvitav osa. Erinevalt klassikalisest sõltuvuste segaduse või typosquat-kampaaniast ei ole ükski neist nimedest suunatud konkreetsele ülesvoolu teekile. Selle asemel on need kalibreeritud nii, et need kaovad reaalsesse package.json or npm ls väljund.
| Pakend | Esimene avaldatud | Uusim versioon | Variandid | Roll klastris |
|---|---|---|---|---|
| keskne leht | 2026-04-01 12:46 UTC | 1.0.9 | 5, versioonilt 1.0.5 versioonile 1.0.9 | Klastri „logimisutiliidi” kaas; varaseim avaldatud versioon |
| dom-utils-lite | 2026-04-14 07:36 UTC | 1.0.3 | 3 | Üldine DOM-abilise kate |
| node-fetch-lite | 2026-04-19 10:22 UTC | 1.0.2 | 3 | Jäljendab sõlmede toomise perekonda |
| ühendusagent | 2026-04-25 05:12 UTC | 1.0.0 | 1 | Üldnimetus „agent” |
| node-gyp-runtime | 2026-04-25 05:17 UTC | 1.0.0 | 1 | Jäljendab natiivsete moodulite ehitustööriistu |
| node-env-resolve | 2026-04-25 05:21 UTC | 1.0.9 | 10, versioonilt 1.0.0 versioonile 1.0.9 | Aktiivne tilguti; täielik implantaat |
Nimed nagu centralogger, node-fetch-liteja node-gyp-runtime on loodud koodiülevaatuses vastuoludeta paistma. Need kõlavad nagu asjad, mis oleksid juba projekti sõltuvuspuus olemas.
Koos värske, kontrollimata avaldaja ja puuduvate repositooriumi linkidega moodustavad need äratuntava mustri: toimija külvab registrisse väikese hõõrdumisega nimesid ja seejärel itereerib kiiresti olulise nime kallal. Antud juhul node-env-resolve sai kaheksa päeva jooksul kümme versiooni.
Mis Windowsi arenduskasti maandub
Pahatahtlik kett peal node-env-resolve:1.0.8 on lühike, otsekohene ja npm RAT-i kohta ebatavaliselt funktsiooniderikas.
Installijärgne: püsivus ja eraldatud agent
package.json deklareerib ühe installikonksu:
{ "scripts": { "postinstall": "node postinstall.js" } }postinstall.js teeb kolme asja järjest.
Esmalt loob see npm-puust väljaspool asuva installikataloogi. Tee arvutatakse skriptis käitusajal järgmiselt: INSTALL_DIRSeejärel käivitab see sisemise execSync('npm install --production --silent ...') selle sees, et tõmmata implantaadi käitusaja sõltuvusi. See asetab agendi kettale kuhugi käsiraamatusse node_modules audit ei leia.
Teiseks kirjutab see VBS-käivitusfaili ja registreerib selle alglaadimise püsivuse tagamiseks:
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run \ /v ${AGENT_NAME} \ /t REG_SZ \ /d "wscript.exe \"${vbsPath}\"" /fwscript.exe on Windows Script Host, allkirjastatud Microsofti binaarfail, mis töötab .vbs failid ilma konsooliaknata. See on eelnevcisely, miks seda eelistatakse autorun-tõlgede puhul.
Samuti on olemas sobiv reg delete tee sees src/index.js, mis viitab sellele, et implantaat on konstrueeritud nii, et seda saab operaatori käsul puhtalt eemaldada.
Kolmandaks, see loob eraldiseisva lapseprotsessi:
spawn(node, [path.join(INSTALL_DIR, 'src/index.js')], { detached: true, env: { ...process.env, SERVER_URL } })Siin on olulised kaks detaili.
SERVER_URL loetakse keskkonnast. Seetõttu on C2 lõpp-punkt iga juurutuse jaoks konfigureeritav ja see ei ole paketti sisse ehitatud. See väike, kuid teadlik valik nurjab enamiku staatiliste IOC-i pühkimisi.
Samuti pärib loodud laps täieliku vanema keskkonna. Seega iga NPM_TOKEN, AWS_*, GITHUB_TOKEN, või installimise ajal arendaja kestas olev SSH-agendi sokkel liigub pikaealise agendi mällu.
Mida agent saadab
Komplektis src/ puu sisaldab kolme moodulit, mille nimed juba iseenesest räägivad loo: audioCapture.js, browserHistory.jsja systemInfo.js.
Käitusaja sõltuvuste loend, mis lahendati etapiviisilise töötlemise ajal npm install, kinnitab neid.
See lähenemisviis muudab kaootilise intsidendi kontrollitud reageeringuks.
Pimesi reageerimise asemel tegutsevad meeskonnad selge prioriseerimine ja kiire parandus.
| Sõltuvus | Milleks see antud kontekstis mõeldud on |
|---|---|
| ekraanipilt-töölaud | Perioodiline ekraanipildi jäädvustamine |
| @nut-tree-fork/nut-js | Hiire ja klaviatuuri automatiseerimine / sisendi simulatsioon |
| parem-sqlite3 | Chrome'i, Edge'i ja Firefoxi ajaloo SQLite andmebaaside otselugemine |
| adm-zip | Kogutud esemete koondamine enne väljaviimist |
| terav | Ekraanipiltide ja pildiartefaktide suuruse muutmine / tihendamine |
| socket.io-klient | Püsiv kahesuunaline C2 kanal |
| sõlme-masina-id | Stabiilne sõrmejälg iga hosti kohta ohvri jälgimiseks |
systemInfo.js kõned os.networkInterfaces() enne esimest majakat täiendava sõrmejälgede võtmiseks.
Miks on heli salvestamine silmapaistev signaal
Enamik npm RAT-e, mida me MEW-is triažeerime, peatub installimise ajal salajase varguse korral. Nad loevad. ~/.npmrc, loe ~/.aws/credentials, kraapima process.env, saada POST veebihooki ja välju. See sobib smash-and-grab majandusmudeliga. Volitustel on lühike poolestusaeg ja ründaja peab kiiresti raha teenima.
node-env-resolve on kuju poolest erinev.
Püsivus on seadistatud taaskäivituse üle elama. Agent töötab eraldi ja pikaealiselt wscript.exeKomplekt, mida see kaasas kannab, on arendaja masinas olemiseks, mitte haaramiseks ja sealt lahkumiseks: mikrofoni salvesti, klaviatuuri/hiire draiver, täieliku brauseriajaloo salvestamine, ekraanipildi jäädvustamine ja interaktiivne Socket.IO kanal tagasi konfigureeritavale C2-le.
Mikrofonide jäädvustamine on see piir, mida see kampaania ületab, enamik npm-pahavarasid ei ületa.
Arendaja tööjaam on üha enam ka tööjaam, kus arendajad peavad stand-up'e, kliendikõnesid, disainiarutelusid ja valvesillasid. Mikrofoni salvestav implantaat ei ole tegelikult arendaja npm-tokeni taga, vaid selle taga, mida arendaja sülearvuti ees ütleb.
See võimete komplekt koos hägustamise puudumise ja igasuguse toretseva installimise ajal toimuva väljapressimise puudumisega loetakse pigem sihipärase juurdepääsu eelpositsioneerimiseks kui oportunistlikuks volituste varguseks.
Me ei väida omistamist ainult selle põhjal. Me märgime ka tegevusprofiili.

Kaheksapäevane iteratsioonikadents peal node-env-resolve on ajajoone kõige operatiivsemalt kõnekas detail.
See ei ole „tule ja unusta” tüüpi installeerimine. Avaldaja haldab installeerimiskeskkonda aktiivselt, mis tavaliselt tähendab ühte kahest asjast. Nad kas häälestavad seda enne laiemat juurutamist testkeskkondadele või neil on juba olemas installimise telemeetria, millele nad vastavad.
Ülejäänud viis paketti ei kogenud pärast esialgset avaldamist sisuliselt mingit voolavust. See sobib tugiklastri puhul põhimõttega „lavasta üks kord, jäta nimega alles“, samal ajal kui inseneritöö keskendub paketile, mis töö ära teeb.
Omistamine: Väikesed vihjed, kindlat otsust pole
avalik OSINT Signaalid on õhukesed ja me ei hakka neid venitama. Mis on jälgitav:
Gmaili käepide tanvisoul9 meenutab osaliselt Lõuna-Aasia eesnime „Tanvi“. See on nõrk signaal. Gmaili käepidemed ei ole identiteet ja lõpus olev soul9 on üldine. Ainult e-posti aadressi kohaliku osa põhjal ei ole ohutu geograafilist asukohta järeldada.
Koodistiil on tähelepandamatu Node.js: standard raamatukogukõned, näiteks os, child_process, spawnja reg addPuudub hägustamine, stringide rotatsioon ja silumisvastane loogika. Autor tunneb end Windowsi registri primitiivide ja eraldatud lapseprotsesside orkestreerimisega mugavalt, kuid ei paista püüdvat leida salapärasemaid tööriistu, mida nad usutavalt kasutada võiksid.
Sõltuvused on täiesti tavalised ja hästi teada: screenshot-desktop, nut-js, better-sqlite3ja socket.io-clientPuudub kohandatud protokoll, nullist üles ehitatud C2-virn ja uudne püsivuse nipp, mis ületaks õpiku piire. HKCU käivitusklahvSee on pädev integraator, mitte tööriistade autor.
Avaldatud artefaktidest ei leidnud me mitte-ingliskeelseid stringe, manustatud kommentaare, lokaadiandmeid ega kompilaatori väljundi ajavööndi jälgi.
Kontrollisime koodi kattumist varasemate kampaaniatega, mida juba jälgime, sh Shai Hulud, Owlivion, Buildkite ja hiljutine heibai / claude-code-best Anthropic-CLI kloonide perekond. Me ei leidnud ühtegi: ühiseid C2 mustreid, ühiseid failipaigutusi ega ühiseid idioome.
Mida me ei ütleks: et tegemist on riikliku tegutseja, tuntud rühmitusega või geograafiliselt ühegi konkreetse riigiga seotud isikuga.
Tegevusprofiil on kooskõlas väikese, keskmise kvalifikatsiooniga meeskonnaga, kes tegeleb arendaja tööjaamade seirega. See on tõenäoliselt rahaliselt motiveeritud juurdepääsu hilisema kasutamise kaudu, aga võimalik, et ka luureteenusena eraldi ostja jaoks.
Seda toetavad kaks kaudset punkti: tähelepanu köitvate ja klastri kiiresti põletavate eksfiltratsioonimehaanikatest, näiteks Telegrami robotitest, hoidumine. oastify.comvõi canarytokens ja tahtlikult igavad paketinimed, mis eelistavad vaikseid pika sabaga installimisi lühikesele suurele mahule.
Kompromiteerimise ja avastamise näitajad
| Paketid ja avaldaja | |
|---|---|
| Väli | Väärtus |
| npm-i väljaandja | user0001 |
| Väljaandja e-posti aadress | tanvisoul9@gmail.com, kinnitamata |
| Paketid | centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, node-env-resolve |
| Kinnitatud pahatahtlikkus | node-env-resolve@1.0.7, node-env-resolve@1.0.8 |
| Hosti artefaktid | |
|---|---|
| KASUTUSALA | Väärtus |
| Püsivuse võti | HKCU\Tarkvara\Microsoft\Windows\PraeguneVersioon\Käivita |
| Püsivuse väärtus | Muutuja nimi; andmed kujul wscript.exe " \\ .vbs" |
| Paigaldage konks | postinstall: paketi manifestis olev sõlm postinstall.js |
| Implantaadi moodulid | src/audioCapture.js, src/browserHistory.js, src/systemInfo.js |
| Lavastuskataloog | INSTALL_DIR lahendati väljaspool projekti node_modules'i; asukoha määras installimise ajal postinstall.js |
| võrk | |
|---|---|
| KASUTUSALA | Väärtus |
| C2 transport | socket.io-client, püsiv kahesuunaline kanal |
| C2 lõpp-punkt | Agendile edastatakse keskkonnamuutuja SERVER_URL kaudu; avaldatud artefaktidesse kõvakodeerimata |
Tuvastusmärkused
Kaks reeglit püüavad selle perekonna kinni ilma C2 lõpp-punkti vajamata.
Esmalt märgistage installijärgsed skriptid, mis teostavad sisemist toimingut npm install paketi enda kataloogist väljaspool asuvasse teekonda. Iga legitiimne eelinstallitud allalaadija, näiteks node-gyp ümberehitused või eelinstallitud binaarfailide allalaadijad, kirjutab paketi sees või platvormilestandard vahemälu teed kontrollitud räsidega. See ei kirjuta värskelt loodud faili. INSTALL_DIR mujal kettal.
Teiseks, märgista pärast installimist esinevad skriptid, mis tekitavad probleeme reg add HKCU\…\Run koos wscript.exe käivitajana. See pole npm-paketi puhul põhimõtteliselt kunagi õigustatud. Märgistage ja pange see karantiini.
Kolmas heuristik on kasulik järgmise suguluspaketi tuvastamiseks enne selle kinnitamist: värske npm-i avaldaja ilma SCM kinnitus, Gmaili e-kiri, ei repository väli ja mitu lühikest, üldist, infrastruktuuri meenutavat paketinime, mis avaldatakse üksteisest mõne päeva jooksul, on iseenesest piisav, et õigustada käsitsi läbivaatamist.
Teatatud npm registrile. Värskendame seda postitust, kui avaldaja konto on eemaldatud.






