TL, д-р
Паміж 1 красавіка і 3 мая 2026 года адзін выдавец npm, user0001зарэгістраваны з неправераным адрасам Gmail tanvisoul9@gmail.comціха прасунуў шэсць пакетаў з наўмысна непрыкметнымі назвамі, якія гучаць як інфраструктура: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, і node-env-resolve.
Дзве апошнія версіі node-env-resolveВерсіі , 1.0.7 і 1.0.8 былі пазначаны сістэмай ранняга папярэджання аб шкоднасных праграмах (MEW) кампаніі Xygeni 2 мая і пацверджаны як шкоднасныя 3 мая.
Імплантат незвычайны тым, чым ён не з'яўляецца: у ім няма ботаў Telegram, няма зваротных выклікаў OAST, няма зацямненнеі ніякіх спроб атрымання ўліковых дадзеных AWS падчас усталёўкі. Замест гэтага, postinstall.js усталёўвае запіс загрузкі Windows з дапамогай ключа HKCU Run, які запускае wscript.exe супраць VBS-заглушкі. Затым ён стварае асобны агент Node.js, які аб'ядноўвае модулі для захопу мікрафона, крадзяжу гісторыі браўзера, стварэння скрыншотаў і сімуляцыі мышы/клавіятуры.
Мы называем гэты кластар DevTap, пасля таго, як камплект скончыцца, ён будзе працаваць на машыне распрацоўшчыка.
На момант напісання гэтага артыкула ўсе шэсць пакетаў былі даступныя на npm. Мы адправілі іх у канал злоўжыванняў рэестра. Абаронцам варта выдаліць усе ўсталёўкі ад выдаўца, якія чакаюць выдалення.
Кластар: шэсць пакетаў, адзін выдавец
Уліковы запіс выдаўца user0001 не правераны. Ён не мае SCM праверка, адсутнасць электроннай пошты, прывязанай да дамена, і адсутнасць папярэдняй гісторыі. Дэсктоп Gmail tanvisoul9 не з'яўляецца ні ў адным іншым запісе выдаўца npm, якога нам удалося знайсці.
Усе шэсць пакетаў маюць аднаго і таго ж распрацоўшчыка, былі апублікаваныя з аднаго і таго ж акаўнта і маюць адны і тыя ж даныя. package.json шаблоннага тыпу. Няма repositoryНя homepageІ няма description даўжэйшы за адзін радок.
Цікавая частка — гэта стратэгія наймення. У адрозненне ад класічнай кампаніі па барацьбе з блытанінай залежнасцей або памылкамі тыпаскопа, ніводная з гэтых назваў не накіравана на канкрэтную бібліятэку, якая распрацоўваецца ў асноўнай бібліятэцы. Замест гэтага яны адкалібраваны так, каб знікнуць у рэальнай package.json or npm ls выхад.
| пакет | Упершыню апублікавана | Апошняя версія | версіі | Роля ў кластары |
|---|---|---|---|---|
| цэнтралоггер | 2026-04-01 12:46 UTC | 1.0.9 | 5, з 1.0.5 да 1.0.9 | Вокладка кластара «ўтыліты рэгістрацыі»; самая ранняя публікацыя |
| dom-utils-lite | 2026-04-14 07:36 UTC | 1.0.3 | 3 | Агульная вокладка DOM-helper |
| вузел-выбарка-ліміт | 2026-04-19 10:22 UTC | 1.0.2 | 3 | Імітуе сямейства выбаркі вузлоў |
| агент-злучальнік | 2026-04-25 05:12 UTC | 1.0.0 | 1 | Агульная назва «агента» |
| вузел-gyp-выкананне | 2026-04-25 05:17 UTC | 1.0.0 | 1 | Імітуе інструменты зборкі натыўных модуляў |
| вузел-асяроддзе-вырашэння | 2026-04-25 05:21 UTC | 1.0.9 | 10, з 1.0.0 да 1.0.9 | Актыўная кропельніца; поўны імплантат |
Назвы, як centralogger, node-fetch-lite, і node-gyp-runtime распрацаваны так, каб выглядаць беспрэцэдэнтна падчас праверкі кода. Яны гучаць як рэчы, якія ўжо ёсць у дрэве залежнасцей праекта.
У спалучэнні са свежым, неправераным выдаўцом і адсутнымі спасылкамі на рэпазіторыі яны ўтвараюць пазнавальную схему: удзельнік дадае ў рэестр імёны з нізкім трэннем, а затым хутка перабірае тое, што мае значэнне. У гэтым выпадку, node-env-resolve атрымаў дзесяць версій за восем дзён.
Што трапляе на скрынку распрацоўшчыка Windows
Зламысны ланцужок node-env-resolve:1.0.8 кароткі, прамы і незвычайна багаты на функцыі для npm RAT.
Пасля ўсталёўкі: захаванасць і адлучаны агент
package.json аб'яўляе адзін перахопнік усталёўкі:
{ "scripts": { "postinstall": "node postinstall.js" } }postinstall.js робіць тры рэчы па парадку.
Спачатку ён стварае каталог усталёўкі па-за дрэвам npm. Шлях вылічваецца падчас выканання ў скрыпце наступным чынам: INSTALL_DIRЗатым ён запускае ўнутраны execSync('npm install --production --silent ...') ўнутры яго, каб атрымаць залежнасці імплантата падчас выканання. Гэта змяшчае агент на дыск недзе ў ручным рэжыме node_modules аўдыт не знойдзе.
Па-другое, ён запісвае пускавую праграму VBS і рэгіструе яе для захавання загрузкі:
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run \ /v ${AGENT_NAME} \ /t REG_SZ \ /d "wscript.exe \"${vbsPath}\"" /fwscript.exe гэта хост сцэнарыяў Windows, падпісаны бінарны файл Microsoft, які запускаецца .vbs файлы без акна кансолі. Гэта загадзяcisВось чаму яго аддаюць перавагу для аўтазапускавых заглушак.
Таксама ёсць супадзенне reg delete шлях унутры src/index.js, што сведчыць аб тым, што імплантат распрацаваны такім чынам, каб яго можна было лёгка выдаліць па камандзе аператара.
Па-трэцяе, гэта спараджае асобны даччыны працэс:
spawn(node, [path.join(INSTALL_DIR, 'src/index.js')], { detached: true, env: { ...process.env, SERVER_URL } })Тут важныя дзве дэталі.
SERVER_URL зчытваецца з асяроддзя. У выніку, канцавая кропка C2 наладжваецца для кожнага разгортвання і не ўбудаваная ў пакет. Гэты невялікі, але свядомы выбар перашкаджае большасці статычных IOC-праверак.
Акрамя таго, створаны даччыны аб'ект атрымлівае ў спадчыну поўнае бацькоўскае асяроддзе. Такім чынам, любы NPM_TOKEN, AWS_*, GITHUB_TOKEN, або сокет SSH-агента, які прысутнічае ў абалонцы распрацоўшчыка падчас усталёўкі, перамяшчаецца ў памяць доўгажывучага агента.
Што дастаўляе агент
У камплекце src/ дрэва ўключае ў сябе тры модулі, адны толькі назвы якіх распавядаюць пра ўсё: audioCapture.js, browserHistory.js, і systemInfo.js.
Спіс залежнасцей асяроддзя выканання, вырашаны падчас паэтапнай распрацоўкі npm install, пацвярджае іх.
Такі падыход ператварае хаатычны інцыдэнт у кантраляваную рэакцыю.
Замест таго, каб рэагаваць сляпо, каманды дзейнічаюць з выразная прыярытэтызацыя і хуткае выпраўленне.
| залежнасць | Для чаго гэта патрэбна ў дадзеным кантэксце |
|---|---|
| скрыншот працоўнага стала | Перыядычны захоп экрана |
| @nut-tree-fork/nut-js | Аўтаматызацыя / мадэляванне ўводу мышы і клавіятуры |
| лепш-sqlite3 | Прамое чытанне гісторыі баз дадзеных SQLite з Chrome, Edge і Firefox |
| admin-zip | Аб'яднанне сабраных артэфактаў перад вывазам |
| востры | Змена памеру / сцісканне скрыншотаў і артэфактаў выявы |
| socket.io-кліент | Пастаянны двухнакіраваны канал C2 |
| ідэнтыфікатар машыны-вузла | Стабільны адбітак пальца для кожнага хоста для адсочвання ахвяры |
systemInfo.js званкі os.networkInterfaces() для дадатковага зняцця адбіткаў пальцаў перад першым маяком.
Чаму аўдыёзапіс з'яўляецца найлепшым сігналам
Большасць npm RAT, якіх мы правяралі ў MEW, спыняюцца на крадзяжы сакрэтаў падчас усталёўкі. Яны чытаюць ~/.npmrc, чытайце ~/.aws/credentials, драпаць process.env, адправіць POST на вэбхук і выйсці. Гэта адпавядае эканамічнай мадэлі «разбі і захапі». Уліковыя дадзеныя маюць кароткі перыяд паўраспаду, і зламысніку трэба хутка іх манетызаваць.
node-env-resolve адрозніваецца па форме.
Персістантнасць настроена так, каб вытрымаць перазагрузку. Агент працуе асобна і доўга пад wscript.exeКамплект, які ў ім ёсць, прызначаны для працы на машыне распрацоўшчыка, а не для таго, каб яго можна было ўзяць і пакінуць: мікрафонны дыктафон, драйвер клавіятуры/мышы, поўная гісторыя браўзера, захоп экрана і інтэрактыўны канал Socket.IO назад да наладжвальнага C2.
У прыватнасці, гэтая кампанія перасякае мяжу захопу мікрафонаў, якую не перасякае большасць шкоднасных праграм npm.
Рабочая станцыя распрацоўшчыка ўсё часцей становіцца месцам, дзе распрацоўшчыкі выступаюць са стэндапамі, тэлефануюць кліентам, абмяркоўваюць дызайн і дзяжураць па мастах. Імплантат, які запісвае мікрафон, насамрэч не шукае npm-токен распрацоўшчыка. Ён шукае тое, што распрацоўшчык кажа перад ноўтбукам.
Гэты набор магчымасцей, а таксама адсутнасць заблытвання і адсутнасць якога-небудзь паказнога выкрадання дадзеных падчас усталёўкі, чытаецца як падрыхтоўка да мэтанакіраванага доступу, а не як апартуністычная крадзеж уліковых дадзеных.
Мы не толькі зыходзячы з гэтага, сцвярджаем пра прыналежнасць. Мы ўлічваем аперацыйны профіль.

Васьмідзённая рытмічнасць ітэрацый node-env-resolve з'яўляецца найбольш аператыўна паказальнай дэталлю ў часовай шкале.
Гэта не дроп па прынцыпе «запусціў і забыўся». Выдавец актыўна падтрымлівае дроппер, што звычайна азначае адно з двух. Альбо яны наладжваюць яго для тэставых асяроддзяў перад больш шырокім разгортваннем, альбо ў іх ужо ёсць тэлеметрыя ўсталёвак і яны рэагуюць на яе.
Астатнія пяць пакетаў фактычна не адставалі пасля першапачатковай публікацыі. Гэта адпавядае шаблону «адзін этап, пакінуць па імені» для кластара падтрымкі, у той час як інжынерныя намаганні сканцэнтраваны на пакеце, які выконвае працу.
Аўтарства: Дробныя падказкі, няма цвёрдага вердыкту
грамадскага OSINT сігналы тонкія, і мы не будзем іх расцягваць. Што можна назіраць:
Дэсктоп Gmail tanvisoul9 часткова нагадвае паўднёваазіяцкае імя «Танві». Гэта слабы сігнал. Дэсктопы Gmail не з'яўляюцца ідэнтыфікацыйнымі дадзенымі, а завяршаючы soul9 з'яўляецца агульным. Небяспечна рабіць высновы аб геаграфіі толькі па лакальнай частцы электроннай пошты.
Стыль кода Node.js нічым не характэрны: standard званкі ў бібліятэку, такія як os, child_process, spawn, і reg addНяма абфускацыі, ратацыі радкоў і логікі абароны ад адладкі. Аўтар добра знаёмы з прымітывамі рэестра Windows і аркестрацыяй асобных даччыных працэсаў, але, здаецца, не імкнецца да больш схаваных хітрых метадаў, якія яны маглі б выкарыстоўваць.
Залежнасці цалкам гатовыя і добра вядомыя: screenshot-desktop, nut-js, better-sqlite3, і socket.io-clientНяма ніякага карыстальніцкага пратаколу, ніякага створанага з нуля стэка C2 і ніякага новага прыёму захавання паслядоўнасці, акрамя таго, што ёсць у падручніку. Ключ запуску HKCUГэта кампетэнтны інтэгратар, а не аўтар інструментаў.
У апублікаваных артэфактах мы не знайшлі радкоў на іншых мовах, убудаваных каментарыяў, лакальных дадзеных або адбіткаў часавых паясоў, атрыманых кампілятарам.
Мы праверылі на наяўнасць перакрыццяў кода з папярэднімі кампаніямі, якія мы ўжо адсочваем, у тым ліку Шай-Хулуд, Саўлівіён, Buildkite і нядаўні heibai / claude-code-best Сямейства клонаў Anthropic-CLI. Мы не знайшлі ніводнага: агульных шаблонаў C2, агульных макетаў файлаў і агульных ідыём.
Чаго мы б не сказалі: што гэта дзяржаўны дзеяч, вядомая група або геаграфічна звязаны з якой-небудзь канкрэтнай краінай.
Аперацыйны профіль адпавядае невялікай камандзе сярэдняй кваліфікацыі, якая займаецца назіраннем за працоўнымі месцамі распрацоўшчыкаў. Верагодна, гэта фінансава матывавана праз выкарыстанне доступу ў будучыні, але, магчыма, таксама разведка як паслуга для асобнага пакупніка.
Два ўскосныя аргументы на карысць гэтага гучаць наступным чынам: пазбяганне прыцягваючых увагу механізмаў выцяснення, якія могуць хутка знішчыць кластар, такіх як боты Telegram, oastify.com, або canarytokens, і наўмысна непрыкметныя назвы пакетаў, якія спрыяюць ціхім усталёўкам з доўгім хвастом, а не кароткачасоваму рэзкаму росту аб'ёмаў.
Паказчыкі кампраметацыі і выяўлення
| Пакеты і выдавец | |
|---|---|
| Поле | значэнне |
| выдавец npm | user0001 |
| Электронная пошта выдаўца | tanvisoul9@gmail.com, неправераны |
| Пакеты | centralogger, dom-utils-lite, node-fetch-lite, агент-злучальніка, node-gyp-runtime, node-env-resolve |
| Пацверджана шкоднаснае | вузел-энў-рэзолве@1.0.7, вузел-энў-рэзолве@1.0.8 |
| Артэфакты гаспадара | |
|---|---|
| тып | значэнне |
| Ключ пастаяннасці | HKCU\Праграмнае забеспячэнне\Microsoft\Windows\Бягучая версія\Выканаць |
| Значэнне ўстойлівасці | Імя зменнай; даныя выгляду wscript.exe " \\ .vbs" |
| Усталяваць кручок | postinstall: вузел postinstall.js у маніфесце пакета |
| Модулі імплантаў | src/audioCapture.js, src/browserHistory.js, src/systemInfo.js |
| Падрыхтоўчы каталог | INSTALL_DIR вырашаецца па-за межамі node_modules праекта; месцазнаходжанне задаецца postinstall.js падчас усталёўкі |
| сетка | |
|---|---|
| тып | значэнне |
| Транспарт С2 | socket.io-client, пастаянны двухнакіраваны канал |
| Канчатковая кропка C2 | Прадастаўляецца агенту праз зменную асяроддзя SERVER_URL; не ўбудавана ў апублікаваныя артэфакты. |
Заўвагі па выяўленні
Два правілы ловяць гэтае сямейства без неабходнасці канчатковай кропкі C2.
Спачатку пазначце постўсталяцыйныя скрыпты, якія выконваюць унутраную npm install у шлях па-за ўласным каталогам пакета. Любы легітымны загрузнік папярэдне сабраных файлаў, напрыклад node-gyp перабудоўвае або запампоўвае загадзя падрыхтаваныя бінарныя файлы, запісвае ўнутр пакета або ў платформу-standard шляхі кэша з праверанымі хэшамі. Ён не запісвае ў свежаствораны INSTALL_DIR у іншым месцы на дыску.
Па-другое, пазначце пасляўсталёўныя скрыпты, якія выклікаюць reg add HKCU\…\Run з wscript.exe як запускавую праграму. Гэта па сутнасці ніколі не працуе з npm-пакета. Пазначце і змясціце яго ў каранцін.
Трэцяя эўрыстыка карысная для выяўлення наступнага падобных пакетаў да таго, як яны будуць пацверджаны: новы npm-выдавец без SCM праверка, электронная пошта Gmail, не repository поле, а некалькі кароткіх, агульных назваў пакетаў, якія гучаць як інфраструктура, апублікаваных з розніцай у некалькі дзён, саміх па сабе дастаткова, каб заслужыць ручную праверку.
Паведамленне пададзена ў рэестр npm. Мы абновім гэтую публікацыю, калі ўліковы запіс выдаўца будзе выдалены.






