Napad s tipkanjem v npm-ju v DevTapu

Napad s tipkanjem v DevTap npm: Šest zlonamernih paketov cilja na delovne postaje razvijalcev

TL; DR

Med 1. aprilom in 3. majem 2026 je en sam založnik npm, user0001, registriran z nepreverjenim Gmail naslovom tanvisoul9@gmail.com, je tiho promoviral šest paketov z namerno neizrazitimi imeni, ki zvenejo kot infrastruktura: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtimein node-env-resolve.

Najnovejši dve različici node-env-resolveRazličice , 1.0.7 in 1.0.8 je Xygenijev sistem za zgodnje opozarjanje pred zlonamerno programsko opremo (MEW) 2. maja označil, zlonamerne pa so bile 3. maja potrjene.

Vsadek je nenavaden zaradi tega, kar ni: ni Telegram botov, povratnih klicev OAST, obfuscationin brez poskusa pridobivanja poverilnic AWS med namestitvijo. Namesto tega, postinstall.js vstavi vnos za zagonsko vztrajnost sistema Windows z uporabo tipke HKCU Run, ki zažene wscript.exe proti VBS-zagozditvi. Nato ustvari ločenega agenta Node.js, ki združuje module za zajem mikrofona, krajo zgodovine brskalnika, snemanje posnetkov zaslona in simulacijo miške/tipkovnice.

To gručo imenujemo DevTap, po namestitvi kompleta se zažene na razvijalčevem računalniku.

Vseh šest paketov je bilo v času pisanja objavljenih na npm. Poslali smo jih na kanal za zlorabe registra. Zagovorniki naj umaknejo vse namestitve od založnika, ki čakajo na odstranitev.

Grozd: Šest paketov, en založnik

Račun založnika user0001 ni preverjeno. Nima SCM preverjanje, brez e-pošte, vezane na domeno, in brez predhodne zgodovine. Gmailov uporabniški imenik tanvisoul9 se ne pojavlja v nobenem drugem zapisu založnika npm, ki smo ga lahko našli.

Vseh šest paketov navaja istega vzdrževalca, so bili objavljeni iz istega računa in si delijo isti package.json standardnega. Ni repository, ne homepage, in ne description daljši od ene same vrstice.

Strategija poimenovanja je zanimiv del. Za razliko od klasične kampanje zmede odvisnosti ali tipografskih napak nobeno od teh imen ne cilja na določeno knjižnico, ki je del glavnega gradiva. Namesto tega so umerjena tako, da izginejo v resničnem package.json or npm ls Izhod.

paketPrva objavaNajnovejša različicarazličiceVloga v grozdu
centralogger2026-04-01 12:46 UTC1.0.95, od 1.0.5 do 1.0.9Naslovnica »pripomočka za beleženje« grozda; najzgodnejša objava
dom-utils-lite2026-04-14 07:36 UTC1.0.33Generični pokrovček za pomoč pri DOM-u
node-fetch-lite2026-04-19 10:22 UTC1.0.23Posnema družino pridobivanja vozlišč
povezovalni agent2026-04-25 05:12 UTC1.0.01Generično ime »agent«
node-gyp-runtime2026-04-25 05:17 UTC1.0.01Posnema orodja za gradnjo izvornih modulov
razrešitev-okolja-vozlišča2026-04-25 05:21 UTC1.0.910, od 1.0.0 do 1.0.9Aktivna kapalka; celoten vsadek

Imena všeč centralogger, node-fetch-litein node-gyp-runtime so zasnovani tako, da v pregledu kode ne izgledajo kontroverzno. Slišijo se kot stvari, ki bi že bile v drevesu odvisnosti projekta.

V kombinaciji s svežim, nepreverjenim založnikom in manjkajočimi povezavami do repozitorij tvorijo prepoznaven vzorec: akter v register vnaša imena z nizkim trenjem, nato pa hitro iterira na tistem, ki je pomembno. V tem primeru, node-env-resolve v osmih dneh prejel deset različic.

Kaj pristane na škatli za razvijalce sistema Windows

Zlonamerna veriga naprej node-env-resolve:1.0.8 je kratek, neposreden in nenavadno bogat z funkcijami za npm RAT.

Po namestitvi: Vztrajnost in ločen agent

package.json deklarira en sam namestitveni kavelj:

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

postinstall.js naredi tri stvari po vrsti.

Najprej pripravi namestitveni imenik zunaj drevesa npm. Pot se med izvajanjem v skriptu izračuna kot INSTALL_DIRNato izvede notranji execSync('npm install --production --silent ...') znotraj njega, da potegne odvisnosti izvajalnega okolja vsadka. To agenta shrani na disk nekam, kjer je priročnik node_modules revizija ne bo našla.

Drugič, napiše zaganjalnik VBS in ga registrira za zagonsko vztrajnost:

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

wscript.exe je gostitelj skriptov sistema Windows, podpisana binarna datoteka Microsoft, ki se izvaja .vbs datoteke brez konzolnega okna. To je predhodnocisRes je, zakaj je priljubljen za samodejne zagonske škrbine.

Obstaja tudi ujemanje reg delete pot znotraj src/index.js, kar nakazuje, da je vsadek zasnovan tako, da ga je mogoče na ukaz operaterja enostavno odstraniti.

Tretjič, ustvari ločen podrejeni proces:

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

Tukaj sta pomembni dve podrobnosti.

SERVER_URL se bere iz okolja. Posledično je končno točko C2 mogoče konfigurirati za vsako uvedbo posebej in ni vdelana v paket. Ta majhna, a premišljena izbira prepreči večino statičnih pregledov IOC.

Prav tako rojeni otrok podeduje celotno starševsko okolje. Zato vsak NPM_TOKEN, AWS_*, GITHUB_TOKEN, ali vtičnica SSH-agenta, ki je prisotna v razvijalski lupini ob namestitvi, potuje v pomnilnik dolgo živečega agenta.

Kaj agent dostavi

Paket src/ Drevo vključuje tri module, katerih že sama imena povedo zgodbo: audioCapture.js, browserHistory.jsin systemInfo.js.

Seznam odvisnosti med izvajanjem, razrešen med uvajanjem npm install, jih potrjuje.

Ta pristop spremeni kaotičen incident v nadzorovan odziv.

Namesto slepega reagiranja ekipe delujejo z jasna določitev prioritet in hitro odpravljanje težav.

OdvisnostČemu služi v tem kontekstu
posnetek zaslona-namizjaPeriodični zajem zaslona
@oreh-tree-fork/oreh-jsAvtomatizacija/simulacija vnosa z miško in tipkovnico
boljši-sqlite3Neposredno branje podatkovnih baz SQLite za zgodovino brskalnikov Chrome, Edge in Firefox
adm-zipZdruževanje zbranih artefaktov pred eksfiltracijo
osterSpreminjanje velikosti/stiskanje posnetkov zaslona in slikovnih artefaktov
socket.io-odjemalecTrajni dvosmerni kanal C2
ID-vozlišča-strojaStabilen prstni odtis na gostitelja za sledenje žrtvam

systemInfo.js klici os.networkInterfaces() za dodatno odvzemanje prstnih odtisov pred prvim signalnim signalom.

Zakaj je zajem zvoka izstopajoč signal

Večina npm RAT-ov, ki jih triažiramo v MEW, se ustavi pri tajni kraji med namestitvijo. Berejo ~/.npmrc, preberi ~/.aws/credentials, strganje process.env, POST na spletni kavelj in izhod. To ustreza ekonomskemu modelu "razbij in zgrabi". Poverilnice imajo kratko razpolovno dobo in napadalec jih mora hitro monetizirati.

node-env-resolve je drugačne oblike.

Vztrajnost je nastavljena tako, da preživi ponovni zagon. Agent deluje ločeno in ima dolgo življenjsko dobo pod wscript.exeKomplet, ki ga vsebuje, je namenjen prisotnosti na razvijalčevem računalniku, ne pa za prevzem in odhod: snemalnik mikrofona, gonilnik tipkovnice/miške, popolno zajemanje zgodovine brskalnika, zajem zaslona in interaktivni kanal Socket.IO nazaj do konfiguriranega C2.

Predvsem zajemanje mikrofonov je meja, ki jo ta kampanja presega, večina zlonamerne programske opreme za npm pa ne.

Razvijalčeva delovna postaja je vse bolj tudi delovna postaja, kjer razvijalci sprejemajo stand-up govore, klice s strankami, razprave o oblikovanju in dežurne pogovore. Vsadek, ki snema mikrofon, v resnici ne išče razvijalčevega npm žetona. Gre za to, kar razvijalec pove pred prenosnikom.

Ta nabor zmogljivosti, skupaj z odsotnostjo zakrivanja in kakršne koli bliskovite izkrcanja med namestitvijo, se bere kot predhodna priprava za ciljni dostop in ne kot oportunistično krajo poverilnic.

Pripisovanja ne zagovarjamo zgolj na podlagi tega. Upoštevamo operativni profil.

Napad s tipkanjem v npm - DevTab

Osemdnevna iteracijska kadenca na node-env-resolve je najbolj operativno povedna podrobnost v časovnici.

To ni namestitev po principu »odpri in pozabi«. Založnik aktivno vzdržuje namestitev, kar običajno pomeni eno od dveh stvari. Ali jo pred širšo uvedbo prilagaja testnim okoljem ali pa že ima podatke o telemetriji namestitve in se nanje odziva.

Pri ostalih petih paketih po prvi objavi dejansko ni bilo nobenega odliva. To ustreza vzorcu »enkrat postavi na fazo, pusti poimenovano« za podporno gručo, medtem ko se inženirsko delo osredotoča na paket, ki opravlja delo.

Pripis: Majhni namigi, brez trdne razsodbe

javno OSINT signali so tanki in jih ne bomo raztegovali. Kaj je opazno:

Gmailov ročaj tanvisoul9 delno spominja na južnoazijsko ime »Tanvi«. To je šibek signal. Gmailovi uporabniški imeniki niso identitetni podatki, končni soul9 je generično. Ni varno sklepati o geografiji samo iz lokalnega dela e-pošte.

Slog kode je v Node.js neznačilen: standard klici v knjižnico, kot npr. os, child_process, spawnin reg addNi zakrivanja, rotacije nizov in logike proti odpravljanju napak. Avtor se dobro spozna na primitive registra sistema Windows in orkestracijo ločenih podrejenih procesov, vendar se zdi, da ne posega po prikritih tehnikah, ki bi jih lahko verjetno uporabljal.

Odvisnosti so povsem standardne in dobro znane: screenshot-desktop, nut-js, better-sqlite3in socket.io-clientNi protokola po meri, ni sklada C2, ki bi bil sestavljen iz nič, in ni novega trika za vztrajnost, ki bi presegel učbenik. Ključ HKCU RunTo je kompetenten integrator, ne avtor orodij.

V objavljenih artefaktih nismo našli nizov, ki niso v angleščini, vdelanih komentarjev, podatkov o jezikovnih nastavitvah ali prstnih odtisov časovnih pasov, ki jih izpiše prevajalnik.

Preverili smo, ali se koda prekriva s prejšnjimi kampanjami, ki jih že spremljamo, vključno z Shai Hulud, Owlivion, Buildkite in nedavni heibai / claude-code-best Družina klonov Anthropic-CLI. Nismo jih našli: ni skupnih vzorcev C2, ni skupnih postavitev datotek in ni skupnih idiomov.

Česar ne bi rekli: da gre za državnega akterja, znano skupino ali da je geografsko vezan na določeno državo.

Operativni profil je skladen z majhno, zmerno usposobljeno ekipo, ki izvaja nadzor delovnih postaj razvijalcev. Verjetno je finančno motiviran z uporabo dostopa v nadaljnji fazi, morda pa tudi z izvidovanjem kot storitvijo za ločenega kupca.

Dve posredni točki podpirata to: izogibanje vzbujajočim mehanizmom izkoriščanja, ki bi hitro uničile gručo, kot so Telegram boti, oastify.comali canarytokens in namerno neizrazita imena paketov, ki dajejo prednost tihim namestitvam z dolgim ​​repom pred kratkim porastom velike količine.

Kazalniki kompromitacije in odkrivanja

Paketi in založnik
PoljeVrednost
založnik npmuser0001
E-poštni naslov založnikatanvisoul9@gmail.com, nepreverjeno
Paketicentralogger, dom-utils-lite, node-fetch-lite, konektor-agent, node-gyp-runtime, node-env-resolve
Potrjeno zlonamernonode-env-resolve@1.0.7, node-env-resolve@1.0.8
Artefakti gostitelja
tipVrednost
Ključ vztrajnostiHKCU\Programska oprema\Microsoft\Windows\Trenutna različica\Zaženi
Vrednost obstojnostiIme spremenljivke; podatki oblike wscript.exe " \\ .vbs"
Namestite kaveljpostinstall: vozlišče postinstall.js v manifestu paketa
Implantni modulisrc/audioCapture.js, src/browserHistory.js, src/systemInfo.js
Pripravljalni imenikINSTALL_DIR razrešen zunaj node_modules projekta; lokacija je določena z postinstall.js ob namestitvi
mreža
tipVrednost
Prevoz C2socket.io-client, trajni dvosmerni kanal
Končna točka C2Zagotovljeno agentu prek okoljske spremenljivke SERVER_URL; ni trdo kodirano v objavljenih artefaktih

Opombe o zaznavanju

To družino ujameta dva pravila, ne da bi potrebovala končno točko C2.

Najprej označite skripte po namestitvi, ki izvajajo interno npm install v pot zunaj lastnega imenika paketa. Vsak legitimni program za prenos predgradnje, kot je node-gyp obnovitve ali prenos vnaprej vgrajenih binarnih datotek, piše znotraj paketa ali v platformo-standard poti predpomnilnika s preverjenimi zgoščenimi vrednostmi. Ne zapisuje v novo ustvarjeno INSTALL_DIR drugje na disku.

Drugič, označite skripte po namestitvi, ki povzročajo težave reg add HKCU\…\Run z wscript.exe kot zaganjalnik. To v bistvu ni nikoli legitimno iz npm paketa. Označite ga in ga dajte v karanteno.

Tretja hevristika je uporabna za prepoznavanje naslednjega sorodnega paketa, preden je potrjen: nov založnik npm brez SCM preverjanje, e-poštni naslov Gmail, ne repository polje in več kratkih, generičnih imen paketov, ki zvenejo kot infrastruktura, objavljenih v nekaj dneh, je samo po sebi dovolj, da upraviči ročni pregled.

Prijavljeno v register npm. To objavo bomo posodobili, ko bo račun založnika odstranjen.

orodja-za-analizo-sestave-programske-programske-orodja-sca
Določite prednostne naloge, odpravite in zavarujte tveganja programske opreme
Pridobite svoj brezplačni račun.
Ni potrebna kreditna kartica.

Zagotovite si razvoj in dostavo programske opreme

z Xygeni Product Suite