Sulmi DevTap npm Typosquatting

Sulmi DevTap npm Typosquatting: Gjashtë paketa keqdashëse synojnë stacionet e punës të zhvilluesve

TL; DR

Midis 1 prillit dhe 3 majit 2026, një botues i vetëm i npm, user0001, i regjistruar me adresën e paverifikuar të Gmail-it tanvisoul9@gmail.com, shtyu në heshtje gjashtë paketa me emra qëllimisht të thjeshtë, që tingëllonin si infrastrukturë: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtimedhe node-env-resolve.

Dy versionet më të fundit të node-env-resolve, 1.0.7 dhe 1.0.8, u raportuan nga sistemi i Paralajmërimit të Hershëm për Malware (MEW) i Xygeni-t më 2 maj dhe u konfirmuan si keqdashës më 3 maj.

Implanti është i pazakontë për atë që nuk është: nuk ka robotë Telegram, nuk ka thirrje kthyese OAST, nuk ka obfuscation, dhe asnjë përpjekje për të marrë kredencialet e AWS në kohën e instalimit. Në vend të kësaj, postinstall.js instalon një hyrje të persistencës së nisjes së Windows, duke përdorur një çelës HKCU Run që niset. wscript.exe kundër një cungu VBS. Pastaj krijon një agjent të shkëputur Node.js që bashkon module për kapjen e mikrofonit, vjedhjen e historikut të shfletuesit, krijimin e ekranit të ekranit dhe simulimin e miut/tastierës.

Ne e quajmë këtë grumbull DevTap, pas kompletit, ai del duke u ekzekutuar në makinën e zhvilluesit.

Të gjashtë paketat ishin aktive në npm në kohën e shkrimit. Ne i kemi paraqitur ato në kanalin e abuzimit të regjistrit. Mbrojtësit duhet të tërheqin çdo instalim nga botuesi në pritje të heqjes.

Grumbulli: Gjashtë Paketa, Një Botues

Llogaria e botuesit user0001 është i paverifikuar. Nuk ka SCM verifikim, asnjë email i lidhur me domenin dhe asnjë historik i mëparshëm. Adresa e Gmail-it tanvisoul9 nuk shfaqet në asnjë regjistrim tjetër të botuesit npm që mundëm të gjenim.

Të gjashtë paketat rendisin të njëjtin mirëmbajtës, u publikuan nga e njëjta llogari dhe ndajnë të njëjtën gjë. package.json standard. Nuk ka repositoryhomepage, dhe jo description më i gjatë se një rresht i vetëm.

Strategjia e emërtimit është pjesa interesante. Ndryshe nga një fushatë klasike e ngatërrimit të varësisë ose typosquat, asnjë nga këto emra nuk synon një bibliotekë specifike në rrjedhën e sipërme. Në vend të kësaj, ato janë të kalibruar për t'u zhdukur në një bibliotekë të vërtetë. package.json or npm ls output.

paketëI parë u botuaVersioni i funditVersioneRoli në Klaster
centralogger2026-04-01 12:46 UTC1.0.95, nga 1.0.5 në 1.0.9Mbulesa e "shërbimit të regjistrimit" të klasterit; publikimi më i hershëm
dom-utils-lite2026-04-14 07:36 UTC1.0.33Mbulesë gjenerike e ndihmësit DOM
node-fetch-lite2026-04-19 10:22 UTC1.0.23Familja e marrjes së nyjeve të imitimit
agjent lidhës2026-04-25 05:12 UTC1.0.01Emri gjenerik "agjent"
koha-e-kryerjes-së-nyjës-gyp2026-04-25 05:17 UTC1.0.01Mimics native-module-building me mjete
zgjidhja-e-nodës-së-env-së2026-04-25 05:21 UTC1.0.910, nga 1.0.0 në 1.0.9Pikatore aktive; implant i plotë

Emrat si centralogger, node-fetch-litedhe node-gyp-runtime janë të dizajnuara të duken të pakontestueshme në shqyrtimin e kodit. Ato tingëllojnë si gjëra që do të ishin tashmë në pemën e varësisë së një projekti.

Të kombinuara me një botues të ri, të paverifikuar dhe lidhje të humbura të depove, ato formojnë një model të dallueshëm: një aktor që mbjell emra me fërkime të ulëta në regjistër, pastaj përsërit shpejt atë që ka rëndësi. Në këtë rast, node-env-resolve mori dhjetë versione në tetë ditë.

Çfarë ndodh në një Windows Dev Box

Zinxhiri keqdashës në node-env-resolve:1.0.8 është i shkurtër, i drejtpërdrejtë dhe jashtëzakonisht i pasur me karakteristika për një RAT npm.

Pas instalimit: Qëndrueshmëri dhe Agjent i Shkëputur

package.json deklaron një grep të vetëm instalimi:

{ "scripts": { "postinstall": "node postinstall.js" } }

postinstall.js bën tre gjëra me radhë.

Së pari, ai vendos në fazë një direktori instalimi jashtë pemës npm. Shtegu llogaritet në kohën e ekzekutimit në skript si INSTALL_DIRPastaj ekzekuton një të brendshëm execSync('npm install --production --silent ...') brenda tij për të tërhequr varësitë e kohës së ekzekutimit të implantit. Kjo e vendos agjentin në disk diku në një manual node_modules Auditimi nuk do të gjejë.

Së dyti, shkruan një lëshues VBS dhe e regjistron atë për qëndrueshmëri të nisjes:

reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run \     /v ${AGENT_NAME} \     /t REG_SZ \     /d "wscript.exe \"${vbsPath}\"" /f

wscript.exe është Windows Script Host, një skedar binar i nënshkruar i Microsoft që ekzekutohet .vbs skedarë pa një dritare konsole. Kjo është paraprakishtcispikërisht pse preferohet për stub-et e autorun-it.

Ekziston edhe një përputhje reg delete shteg brenda src/index.js, duke sugjeruar që implanti është projektuar të hiqet lehtësisht me komandën e operatorit.

Së treti, krijon një proces fëmijë të shkëputur:

spawn(node, [path.join(INSTALL_DIR, 'src/index.js')], {   detached: true,   env: { ...process.env, SERVER_URL } })

Dy detaje kanë rëndësi këtu.

SERVER_URL lexohet nga mjedisi. Si rezultat, pika fundore C2 është e konfigurueshme për çdo vendosje dhe nuk është e integruar në paketë. Kjo zgjedhje e vogël por e qëllimshme mposht shumicën e spastrimeve statike-IOC.

Gjithashtu, fëmija i lindur trashëgon mjedisin e plotë të prindërve. Prandaj, çdo NPM_TOKEN, AWS_*, GITHUB_TOKEN, ose soketi i agjentit SSH i pranishëm në shell-in e zhvilluesit në kohën e instalimit udhëton në kujtesën e agjentit jetëgjatë.

Me çfarë transporton agjenti

Paketimi src/ tree përfshin tre module, emrat e të cilëve vetëm tregojnë historinë: audioCapture.js, browserHistory.jsdhe systemInfo.js.

Lista e varësive në kohën e ekzekutimit, e zgjidhur gjatë fazës së instalimit. npm install, i vërteton ato.

Kjo qasje e kthen një incident kaotik në një përgjigje të kontrolluar.

Në vend që të reagojnë verbërisht, ekipet veprojnë me përcaktim i qartë i përparësive dhe zgjidhje e shpejtë.

varësiPër çfarë shërben në këtë kontekst
pamje e ekranit-desktopKapje periodike e ekranit
@pirun-peme-arrash/js-arrashAutomatizimi/simulimi i hyrjes së mausit dhe tastierës
better-sqlite3Lexime të drejtpërdrejta të bazave të të dhënave SQLite të Chrome, Edge dhe Firefox History
adm-zipGrumbullimi i objekteve të mbledhura para nxjerrjes
i mprehtëNdryshimi i madhësisë/kompresimi i pamjeve të ekranit dhe artefakteve të imazhit
klienti-socket.ioKanal C2 bidireksional i vazhdueshëm
id-i-makinës-së-nyjësGjurmët e gishtërinjve të qëndrueshëm për secilin host për gjurmimin e viktimave

systemInfo.js thirrjet os.networkInterfaces() për marrje shtesë të gjurmëve të gishtërinjve para sinjalizuesit të parë.

Pse kapja audio është sinjali më i spikatur

Shumica e RAT-ve npm që ne i triazhojmë në MEW ndalojnë në vjedhjen sekrete në kohën e instalimit. Ato lexojnë ~/.npmrc, lexo ~/.aws/credentials, gërvisht process.env, POST në një webhook dhe dil. Kjo i përshtatet një modeli ekonomik "shkatërro dhe kap". Kredencialet kanë një gjysmë-jetë të shkurtër dhe sulmuesi duhet të fitojë para shpejt.

node-env-resolve është i ndryshëm në formë.

Persistenca është konfiguruar për të mbijetuar rinisjen. Agjenti funksionon i shkëputur dhe jetëgjatë nën wscript.exePaketa që mbart është për të qenë aty në makinën e një zhvilluesi, jo për ta marrë dhe për ta lënë: një regjistrues mikrofoni, një drajver tastiere/mausi, marrje të plotë të historikut të shfletuesit, kapje të ekranit dhe një kanal interaktiv Socket.IO përsëri në një C2 të konfigurueshëm.

Kapja e mikrofonit në veçanti është vija që kjo fushatë e kalon, të cilën shumica e malware-ve npm nuk e kalojnë.

Një stacion pune për zhvilluesit është, gjithnjë e më shumë, edhe vendi ku zhvilluesit marrin takime në pritje, telefonata me klientët, diskutime mbi dizajnin dhe takime në gatishmëri. Një implant që regjistron mikrofonin nuk është në të vërtetë pas tokenit npm të zhvilluesit. Por pas asaj që zhvilluesi thotë përpara laptopit.

Ky grup aftësish, plus mungesa e errësirës dhe mungesa e ndonjë nxjerrjeje të dukshme në kohën e instalimit, lexohet si para-pozicionim për akses të synuar në vend të vjedhjes oportuniste të kredencialeve.

Ne nuk po e pohojmë atribuimin vetëm nga kjo. Po e vërejmë profilin operacional.

sulm npm typosquatting - DevTab

Kadenca e përsëritjes tetëditore në node-env-resolve është detaji më domethënës nga ana operative në vijën kohore.

Ky nuk është një lëshim i menjëhershëm. Botuesi po e mirëmban në mënyrë aktive lëshuesin, që zakonisht do të thotë një nga dy gjërat. Ose po e akordojnë atë sipas mjediseve të testimit para vendosjes më të gjerë, ose tashmë e kanë instaluar telemetrinë që po kthehet dhe po i përgjigjen asaj.

Pesë paketat e tjera praktikisht nuk panë asnjë ndërprerje pas publikimit të tyre fillestar. Kjo i përshtatet një modeli "një herë fazë, lëre emrin" për klasterin mbështetës, ndërsa përpjekja inxhinierike përqendrohet në paketën që bën punën.

Atribuimi: Të dhëna të vogla, pa vendim të prerë

Publike OSINT Sinjalet janë të holla dhe ne nuk do t'i zgjasim ato. Çfarë është e vëzhgueshme:

Doreza e Gmail-it tanvisoul9 pjesërisht i ngjan një emri të dhënë nga Azia Jugore, "Tanvi". Ky është një sinjal i dobët. Emrat e përdoruesit në Gmail nuk janë identitet dhe emri i fundit soul9 është gjenerik. Nuk është e sigurt të nxirret përfundimi i gjeografisë vetëm nga një pjesë lokale e email-it.

Stili i kodit është i thjeshtë për t'u vënë re në Node.js: standard thirrjet e bibliotekës, të tilla si p.sh. os, child_process, spawndhe reg addNuk ka asnjë lloj errësire, asnjë rrotullim vargjesh dhe asnjë logjikë kundër debugimit. Autori ndihet rehat me primitivët e regjistrit të Windows dhe orkestrimin e proceseve të shkëputura-fëmijë, por nuk duket se po synon teknika më të fshehta që mund të jenë duke përdorur.

Varësitë janë tërësisht të padiskutueshme dhe të njohura mirë: screenshot-desktop, nut-js, better-sqlite3dhe socket.io-clientNuk ka protokoll të personalizuar, asnjë grumbull C2 të krijuar nga e para dhe asnjë truk të ri për qëndrueshmëri përtej një libri shkollor. Çelësi i ekzekutimit të HKCU-sëKy është një integrues kompetent, jo një autor mjetesh.

Ne nuk gjetëm vargje jo në anglisht, komente të ngulitura, të dhëna lokale ose gjurmë gishtash të zonës kohore të daljes së përpiluesit brenda artefakteve të publikuara.

Ne kontrolluam për mbivendosje kodi me fushatat e mëparshme që tashmë i ndjekim, duke përfshirë Shai Hulud, Owlivion, Buildkite, dhe heibai i fundit / claude-code-best Familja e kloneve Antropike-CLI. Nuk gjetëm asnjë: asnjë model C2 të përbashkët, asnjë paraqitje skedarësh të përbashkët dhe asnjë idioma të përbashkëta.

Ajo që nuk do të thoshim: që ky është një aktor shtetëror, një grup i njohur ose i lidhur gjeografikisht me ndonjë vend specifik.

Profili operacional është në përputhje me një ekip të vogël, me aftësi të moderuara, që kryen mbikëqyrjen e stacionit të punës nga zhvilluesi. Ka të ngjarë që kjo të jetë e motivuar financiarisht përmes përdorimit të aksesit në rrjedhën e mëvonshme, por ndoshta edhe përmes zbulimit si shërbim për një blerës të veçantë.

Dy pika indirekte e mbështesin këtë lexim: shmangia e mekanizmave tërheqës të nxjerrjes që do ta digjnin shpejt grumbullin, siç janë robotët e Telegramit, oastify.com, ose canarytokens, dhe emrat e paketave qëllimisht të thjeshtë, të cilët favorizojnë instalimet e qeta me bisht të gjatë në vend të një rritjeje të shkurtër me vëllim të lartë.

Treguesit e Kompromentimit dhe Zbulimit

Paketat dhe Botuesi
Fushëvlerë
botuesi i npmuser0001
Email-i i botuesittanvisoul9@gmail.com, i paverifikuar
Paketatcentralogger, dom-utils-lite, node-fetch-lite, agjent-lidhës, kohë-ekzekutimi i node-gyp, zgjidhje-e-nodës-së-env-it
I konfirmuar keqdashësnyje-e-mjedisit-e-nyjës-zgjidh@1.0.7, nyje-e-mjedisit-e-nyjës-zgjidh@1.0.8
Artefaktet e Pritësit
Tipivlerë
Çelësi i qëndrueshmërisëHKCU\Software\Microsoft\Windows\Versioni i Ri\Run
Vlera e qëndrueshmërisëEmri i variablit; të dhënat e formularit wscript.exe " \\ .vbs"
Instaloni grepinpostinstall: nyja postinstall.js në manifestin e paketës
Modulet e implantevesrc/audioCapture.js, src/browserHistory.js, src/systemInfo.js
Drejtoria e skenaveINSTALL_DIR u zgjidh jashtë node_modules të projektit; vendndodhja u vendos nga postinstall.js në kohën e instalimit
Rrjet
Tipivlerë
Transporti C2socket.io-client, kanal bidireksional i vazhdueshëm
Pika fundore C2I jepet agjentit përmes variablit të mjedisit SERVER_URL; nuk është i koduar në objekte të publikuara.

Shënime Zbulimi

Dy rregulla e kapin këtë familje pa pasur nevojë për pikën fundore C2.

Së pari, shënoni skriptet e postinstallit që kryejnë një veprim të brendshëm npm install në një shteg jashtë direktorisë së vetë paketës. Çdo shkarkues legjitim i para-ndërtimit, si p.sh. node-gyp rindërtime ose shkarkues binarë të parapërgatitur, shkrime brenda paketës ose në platformë-standard shtigje të memorjes së përkohshme me hashe të verifikuara. Nuk shkruan në një skedar të sapokrijuar INSTALL_DIR diku tjetër në disk.

Së dyti, sinjalizoni skriptet pas instalimit që kanë probleme reg add HKCU\…\Run me wscript.exe si lëshuesi. Kjo në thelb nuk është kurrë legjitime nga një paketë npm. Vendoseni flamurin dhe vendoseni në karantinë.

Një heuristikë e tretë është e dobishme për të dalluar paketën tjetër simotër përpara se të konfirmohet: një botues i ri npm pa SCM verifikim, një email në Gmail, jo repository fushë, dhe emra të shumtë paketash të shkurtër, gjenerikë, që tingëllojnë si infrastrukturë, të publikuar brenda disa ditësh nga njëri-tjetri, është, në vetvete, e mjaftueshme për të justifikuar shqyrtim manual.

Raportuar në regjistrin e npm. Ne do ta përditësojmë këtë postim kur llogaria e botuesit të hiqet.

mjetet-e-për-përbërjes-së-softuerit-sca-tools
Përparësoni, korrigjoni dhe siguroni rreziqet e softuerit tuaj
Merrni Llogarinë tuaj Falas.
Nuk kërkohet kartë krediti.

Siguroni Zhvillimin dhe Ofrimin e Softuerit tuaj

me Xygeni Product Suite