TL. DR
2026 թվականի ապրիլի 1-ից մայիսի 3-ը ընկած ժամանակահատվածում մեկ 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 տարբերակները նշվել են Xygeni-ի վնասակար ծրագրերի վաղ նախազգուշացման (MEW) համակարգի կողմից մայիսի 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 ավելի երկար, քան մեկ տողը։
Անվանման ռազմավարությունը հետաքրքիր մասն է։ Ի տարբերություն դասական կախվածության խառնաշփոթի կամ typosquat արշավի, այս անուններից ոչ մեկը չի ուղղված որոշակի վերին հոսանքի գրադարանի։ Դրա փոխարեն, դրանք կարգավորված են իրականի մեջ անհետանալու համար։ package.json or npm ls արտադրանքի.
| Փաթեթ | Առաջին թողարկվեց | Վերջին տարբերակը | Versions | Դերը կլաստերում |
|---|---|---|---|---|
| կենտրոնական կառավարիչ | 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-օգնական ծածկույթ |
| node-fetch-lite | 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 Dev Box-ում
Չարամիտ շղթան 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 Script Host-ն է, որը ստորագրված Microsoft-ի երկուական ֆայլ է, որը գործարկվում է։ .vbs ֆայլեր առանց կոնսոլի պատուհանի։ Դա նախնական էcisհենց այդ պատճառով էլ այն նախընտրելի է autorun stub-ների համար։
Կա նաև համընկնում 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-agent սոքեթը, որը առկա է մշակողի shell-ում տեղադրման ժամանակ, տեղափոխվում է երկարատև գործող գործակալի հիշողություն։
Ինչ է գործակալը առաքում
Համալրված src/ tree-ն ներառում է երեք մոդուլ, որոնց անուններն արդեն իսկ պատմում են պատմությունը. audioCapture.js, browserHistory.js, եւ systemInfo.js.
Գործարկման ժամանակի կախվածությունների ցանկը, որը լուծվել է փուլային մշակման ընթացքում։ npm install, հաստատում է դրանք։
Այս մոտեցումը քաոսային միջադեպը վերածում է վերահսկվող արձագանքի։
Կուրորեն արձագանքելու փոխարեն, թիմերը գործում են հստակ առաջնահերթություն և արագ շտկում.
| Կախվածություն | Ինչի համար է այն նախատեսված այս համատեքստում |
|---|---|
| էկրանի նկար-աշխատասեղան | Պարբերաբար էկրանի նկարահանում |
| @nut-tree-fork/nut-js | Մկնիկի և ստեղնաշարի ավտոմատացում / մուտքագրման մոդելավորում |
| better-sqlite3 | Chrome, Edge և Firefox History SQLite տվյալների բազաների ուղղակի ընթերցումներ |
| adm-zip | Հավաքված արտեֆակտների փաթեթավորումը դուրսբերումից առաջ |
| սուր | Էկրանի նկարների և պատկերի արտեֆակտների չափափոխում/սեղմում |
| socket.io-հաճախորդ | Մշտական երկկողմանի C2 ալիք |
| հանգույց-մեքենայի-իդենտիֆիկատոր | Կայուն մատնահետք յուրաքանչյուր հոսթի համար՝ զոհի հետևման համար |
systemInfo.js զանգեր os.networkInterfaces() առաջին փարոսից առաջ լրացուցիչ մատնահետք վերցնելու համար։
Ինչու է աուդիո ձայնագրությունը առանձնահատուկ ազդանշան
MEW-ում մեր կողմից տեսակավորված npm RAT-ների մեծ մասը կանգ է առնում տեղադրման ժամանակ գաղտնի գողության դեպքում։ Դրանք կարդում են ~/.npmrc, կարդացեք ~/.aws/credentials, քերծել process.env, POST-ը վեբհուքին և ելքը։ Սա համապատասխանում է «ջարդիր և գրավիր» տնտեսական մոդելին։ Հավատարմագրերը կարճ կիսատրոհման պարբերություն ունեն, և հարձակվողը պետք է արագ դրամայնացնի դրանք։
node-env-resolve տարբեր է ձևի մեջ։
Համառությունը կարգավորված է վերաբեռնումից հետո գոյատևելու համար։ Գործակալը գործում է անջատ և երկարատև ռեժիմով։ wscript.exeԱյն պարունակում է մշակողի համակարգչում գտնվելու համար նախատեսված հավաքածու, այլ ոչ թե վերցնելու ու թողնելու համար. միկրոֆոնի ձայնագրիչ, ստեղնաշարի/մկնիկի դրայվեր, դիտարկիչի պատմության ամբողջական գրանցում, էկրանի նկարահանում և ինտերակտիվ Socket.IO ալիք դեպի կարգավորելի C2:
Մասնավորապես, միկրոֆոնի գրավումը այն սահմանն է, որը այս արշավը չի հատում, և որը npm վնասակար ծրագրերի մեծ մասը չի հատում։
Մշակողի աշխատանքային կայանը, ավելի ու ավելի հաճախ, դառնում է այն աշխատանքային կայանը, որտեղ մշակողները ընդունում են ստենդ-ափեր, հաճախորդների զանգեր, դիզայնի քննարկումներ և հերթապահության կամուրջներ։ Միկրոֆոնը ձայնագրող իմպլանտը իրականում չի հետապնդում մշակողի npm տոկենը, այլ այն, ինչ մշակողը ասում է նոութբուքի առջև։
Այդ հնարավորությունների հավաքածուն, գումարած մշուշոտման բացակայությունը և տեղադրման ժամանակ որևէ ակնհայտ արտահոսքի բացակայությունը, մեկնաբանվում է որպես թիրախային մուտքի նախնական դիրքավորում, այլ ոչ թե որպես օպորտունիստական հավատարմագրերի գողություն։
Մենք միայն սրանից չենք վերագրում։ Մենք նշում ենք գործառնական պրոֆիլը։

Ութօրյա իտերացիոն ռիթմը node-env-resolve ժամանակագրության ամենաօպերատիվորեն ազդեցիկ մանրամասնությունն է։
Սա «այրիր և մոռացիր» ռեժիմով ներբեռնում չէ։ Հրատարակիչը ակտիվորեն սպասարկում է ներբեռնման համակարգը, ինչը սովորաբար նշանակում է երկու բանից մեկը։ Կամ նրանք այն կարգավորում են փորձարկման միջավայրերի հետ՝ ավելի լայն տեղակայումից առաջ, կամ արդեն ունեն տեղադրման հեռաչափման համակարգ և արձագանքում են դրան։
Մյուս հինգ փաթեթները սկզբնական հրապարակումից հետո գործնականում ոչ մի արտահոսք չեն ունեցել։ Սա համապատասխանում է «փուլը մեկ անգամ, անունը թող» օրինաչափությանը օժանդակ կլաստերի համար, մինչդեռ ինժեներական ջանքերը կենտրոնանում են այն փաթեթի վրա, որը կատարում է աշխատանքը։
Վերագրում՝ Փոքր ակնարկներ, առանց որևէ հստակ դատավճիռի
Public 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 Run բանալինՍա գրագետ ինտեգրատոր է, այլ ոչ թե գործիքների հեղինակ։
Հրապարակված արտեֆակտներում մենք չգտանք ոչ անգլերեն տողեր, ներկառուցված մեկնաբանություններ, տեղայնացման տվյալներ կամ կոմպիլյատորի ելքային ժամային գոտու մատնահետքեր։
Մենք ստուգեցինք կոդի համընկնումը մեր արդեն իսկ հետևած նախորդ արշավների հետ, այդ թվում՝ Շայ-Հուլուդ, Օվլիվիոն, Բիլդքայթ և վերջերս թողարկված Հեյբայ / claude-code-best Անթրոպ-CLI կլոնների ընտանիք։ Մենք ոչինչ չգտանք. ընդհանուր C2 ձևանմուշներ, ընդհանուր ֆայլերի դասավորություններ և ընդհանուր իդիոմներ չկան։
Ինչը մենք չէինք ասի. որ սա պետական գործիչ է, հայտնի խումբ կամ աշխարհագրորեն կապված է որևէ կոնկրետ երկրի հետ։
Գործառնական պրոֆիլը համապատասխանում է փոքր, միջին որակավորում ունեցող թիմի կողմից մշակողի աշխատանքային կայանի հսկողություն իրականացնողին։ Հավանաբար, դա ֆինանսապես պայմանավորված է մուտքի հետագա օգտագործմամբ, բայց հնարավոր է նաև հետախուզություն-որպես ծառայություն առանձին գնորդի համար։
Երկու անուղղակի կետեր են հաստատում այդ ընթերցումը՝ ուշադրություն գրավող արտահոսքի մեխանիզմներից խուսափելը, որոնք արագ կայրեին կլաստերը, ինչպիսիք են Telegram-ի բոտերը, oastify.com, կամ canarytokens, և դիտավորյալ անհամ փաթեթների անվանումները, որոնք նախընտրում են հանգիստ երկար պոչով տեղադրումները կարճատև մեծ ծավալի թռիչքի փոխարեն։
Կոտրման և հայտնաբերման ցուցիչներ
| Փաթեթներ և հրատարակիչ | |
|---|---|
| Դաշտ | Արժեք |
| npm հրատարակիչ | user0001 |
| Հրատարակչի էլ. փոստը | tanvisoul9@gmail.com, չհաստատված |
| Փաթեթներ | centralogger, dom-utils-lite, node-fetch-lite, միակցիչ-գործակալ, node-gyp-գործարկման ժամանակ, node-env-resolve |
| Հաստատված չարամիտ | հանգույց-env-resolve@1.0.7, հանգույց-env-resolve@1.0.8 |
| Հոսթի արտեֆակտներ | |
|---|---|
| Տիպ | Արժեք |
| Համառության բանալի | HKCU\Software\Microsoft\Windows\CurrentVersion\Run |
| Համառության արժեք | Փոփոխականի անուն; wscript.exe ձևի տվյալներ " \\ .vbs" |
| Տեղադրեք կեռիկը | postinstall: փաթեթի մանիֆեստում postinstall.js հանգույցը |
| Իմպլանտի մոդուլներ | src/audioCapture.js, src/browserHistory.js, src/systemInfo.js |
| Բեմականացման տեղեկատու | INSTALL_DIR-ը լուծվել է նախագծի node_modules-ից դուրս; տեղադրությունը սահմանվել է postinstall.js-ի կողմից տեղադրման ժամանակ։ |
| Ցանց | |
|---|---|
| Տիպ | Արժեք |
| C2 տրանսպորտ | 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 գրանցամատյանին։ Մենք կթարմացնենք այս գրառումը, երբ հրատարակչի հաշիվը հեռացվի։






