DevTap npm Typosquatting uzbrukums

DevTap npm typosquatting uzbrukums: sešas ļaunprātīgas pakotnes ir vērstas uz izstrādātāju darbstacijām

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.

PaketePirmais publicētsJaunākā versijaversijasLoma klasterī
centrālā logera2026-04-01 12:46 UTC1.0.95, no 1.0.5 līdz 1.0.9Klastera “reģistrēšanas utilīta” vāks; agrākā publikācija
dom-utils-lite2026-04-14 07:36 UTC1.0.33Vispārīgs DOM palīga vāks
node-fetch-lite2026-04-19 10:22 UTC1.0.23Atdarina mezglu ieneses saimi
savienotāja aģents2026-04-25 05:12 UTC1.0.01Vispārīgais nosaukums “aģents”
node-gyp-runtime2026-04-25 05:17 UTC1.0.01Atdarina vietējo moduļu veidošanas rīkus
node-env-resolve2026-04-25 05:21 UTC1.0.910, no 1.0.0 līdz 1.0.9Aktī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}\"" /f

wscript.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ībaKam tas paredzēts šajā kontekstā
ekrānuzņēmums-darbvirsmaPeriodiska ekrāna uzņemšana
@nut-tree-fork/nut-jsPeles un tastatūras automatizācija/ievades simulācija
labāks sqlite3Tieša Chrome, Edge un Firefox vēstures SQLite datubāzu lasīšana
adm-zipSavākto artefaktu grupēšana pirms eksfiltrācijas
assEkrānuzņēmumu un attēlu artefaktu izmēru maiņa/saspiešana
socket.io-clientPastāvīgs divvirzienu C2 kanāls
mezgla-mašīnas-idStabils 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.

npm typosquatting uzbrukums — DevTab

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
LauksVērtība
npm izdevējsuser0001
Izdevēja e-paststanvisoul9@gmail.com, nepārbaudīts
Paketescentralogger, dom-utils-lite, node-fetch-lite, savienotāja aģents, node-gyp-runtime, node-env-resolve
Apstiprināts ļaunprātīgsnode-env-resolve@1.0.7, node-env-resolve@1.0.8
Uzņēmēja artefakti
VeidsVērtība
Noturības atslēgaHKCU\Software\Microsoft\Windows\CurrentVersion\Run
Noturības vērtībaMainīgā nosaukums; dati formā wscript.exe " \\ .vbs"
Uzstādiet āķipostinstall: mezgls postinstall.js pakotnes manifestā
Implantu moduļisrc/audioCapture.js, src/browserHistory.js, src/systemInfo.js
Izstādes direktorijsINSTALL_DIR atrisināts ārpus projekta node_modules; atrašanās vietu iestatīja postinstall.js instalēšanas laikā
tīkls
VeidsVērtība
C2 transportssocket.io-client, pastāvīgs divvirzienu kanāls
C2 galapunktsTiek 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.

sca-tools-software-composition-analysis-tools
Prioritizējiet, novērsiet un aizsargājiet savus programmatūras riskus
Iegūstiet savu bezmaksas kontu.
Nepieciešama kredītkarte.

Nodrošiniet programmatūras izstrādi un piegādi

ar Xygeni produktu komplektu