TL؛ DR
تقریباً برای دو ماهیک بدافزار سرقت اطلاعات npm تحت مجموعهای از نامهای بسته که تقریباً بدون تغییر باقی ماندهاند، دوباره ظاهر شده است. این بدافزار به طور آشکار از زمانی شروع شد که forge-jsxy، تخم ریزی کرد forge-jsx3 / forge-jsx4 خواهر و برادرها، سپس برند «forge» را به طور کامل حذف کردند تا به عنوان زیرساخت توسعهدهنده مطرح شوند - ابتدا zredis-typed، و اخیرا pinokio-redis.
هر نوع حامل همان ابزار داخلی: فایلهای نامگذاری شده forge-jsx-explorer-*، یک relayPackageServe ماژولی که به یک forge-jsxy-package.tgzو یک فایل اجرایی بادوام که زیر یک دایرکتوری نقطهچین پنهان شده تا در صورت حذف بسته npm، همچنان پابرجا بماند.
محموله خوانده میشود مواد کیف پول ارز دیجیتال و اعتبارنامههای توسعهدهنده را از میزبان دریافت کرده و آنها را به وب دیسکورد منتقل میکند.hooks، HuggingFace Hub آپلود میکند و یک نقطه پایانی C2 کدگذاری شده دارد. این بدافزار، شروع خودکار در سطح سیستم عامل را نصب میکند، بنابراین پس از راهاندازی مجدد، دوباره اجرا میشود و فعالیتهای کلیپبورد، صفحه کلید و صفحه نمایش را ضبط میکند. آخرین نوع، pinokio-redis، خود را به عنوان یک ادغام "Autodesk Forge" توصیف میکند - توضیحی که ربطی به کاری که کد انجام میدهد ندارد.
| اکوسیستم | npm |
| کلاس بار مفید | سارق اطلاعات چند مرحلهای + عامل کنترل از راه دور (RAT) |
| اهداف اولیه | کیف پولهای ارز دیجیتال، افزونههای کیف پول مرورگر، اعتبارنامههای توسعهدهنده/ابری |
| اصرار | زمان اجرای پایدار پنهان + شروع خودکار سیستم عامل (در صورت حذف بسته، از بین نمیرود) |
| اکسفیلتراسیون | وب دیسکوردhooks + رله، هاب HuggingFace، کد C2 روی پورت ۹۸۷۷ |
| دامنه مشاهده شده | مه ۲۰۲۶ - ژوئیه ۲۰۲۶ (در حال انجام) |
| آخرین نام | pinokio-redis:1.0.127 |
آناتومی حمله
هر نوع از این خانواده از طریق یک شکل نصب میشود: یک بسته که در صفحه فهرست خود بیاثر به نظر میرسد اما یک قلاب پس از نصب را اعلام میکند، بنابراین این payload به محض نصب بسته به عنوان یک وابستگی اجرا میشود. قلاب، یک زنجیر پنج مرحلهای را به حرکت در میآورد.
- مرحله ۱ - تحقق بخشیدن. اسکریپت نصب، یک فایل فشرده و کدگذاری شده را رمزگشایی میکند. به مجموعهای از اسکریپتهای زمان اجرا تبدیل میکند و آنها را در یک دایرکتوری مخفی در زیر محل پیکربندی پلتفرم مینویسد (نسخههای forge-jsxy از یک .forge-jsxy/runtime/v نقطهدار استفاده میکردند). /path). از آنجا که این کپی خارج از node_modules قرار دارد، حذف یا لغو انتشار بسته npm، عامل در حال اجرا را حذف نمیکند.
- مرحله ۲ - پافشاری کردن. این زنجیره یک ورودی راهاندازی خودکار سیستم عامل را ثبت میکند، بنابراین عامل پس از راهاندازی مجدد، دوباره راهاندازی میشود. در ویندوز، این کار از طریق یک اسکریپت عیبیابی پنهان PowerShell انجام میشود؛ فرآیند عامل به صورت جداگانه و با تنظیم windowsHide ایجاد میشود، بنابراین هیچ پنجره کنسولی ظاهر نمیشود.
- مرحله ۳ - طفره رفتن. زمان اجرا، نشانگرهای ادغام مداوم را بررسی میکند و وقتی یک محیط CI را تشخیص میدهد، بیسروصدا خارج میشود، بنابراین جعبههای شنی ساخت خودکار چیزی نمیبینند. در نسخههای forge-jsxy، یک نظر منبع اظهار داشت که یک فیلد forgeInstall قابل مشاهده عمداً از package.json حذف شده است "زیرا آن فیلد در npm قابل مشاهده خواهد بود" - اپراتور متادیتای trigger را عمداً از فهرست عمومی دور نگه داشته است.
- مرحله ۴ - جمعآوری پس از اجرا، عامل در یک مرحله موارد زیر را برداشت میکند:
- مواد کیف پول کریپتو. یک لیست هدفِ همراه با نام فایل secret_filename_patterns.json، یک جستجوی سیستم فایل برای فایل wallet.dat، *.mnemonic / را هدایت میکند.فایلهای .seed / *.phrase، keypair.json، اتریوم UTC– کتابخانههای مشتقشده از کیف پول (bip39، secp256k1، base58check و کمکیهای Solana) در این بسته نرمافزاری موجود هستند.
- افزونههای کیف پول مرورگر یک ماژول ChromeExtensionDbHarvest پایگاههای داده محلی ذخیرهسازی افزونههای مرورگرهای Chromium را میخواند، مکانی که افزونههای کیف پول مبتنی بر مرورگر، دادههای گاوصندوق خود را در آن نگه میدارند.
- مدارک و اسرار. این عامل، تاریخچهی پوسته و فایلهای حاوی اطلاعات محرمانه را اسکن میکند و اعتبارنامههای توسعهدهنده/ابری را میخواند، سپس اعتبارنامههای HuggingFace را برای آپلود رمزگذاری میکند.
- ورودی زنده. محتویات کلیپبورد، ورودی صفحهکلید و تصاویر صفحه نمایش به طور مداوم ثبت میشوند.
مرحله ۵ - خروج از فیلتردادههای جمعآوریشده از طریق سه مرحله از میزبان خارج میشوند کانالهایی که به صورت موازی کار میکنند: دیسکورد وبhooks (discordWebhookPost) و یک آپلودکننده رله Discord که با `صحبت میکندdiscord.com/api/v10` (discordRelayUpload)، آپلودهای HuggingFace Hub (hfUpload) و ... نقطه پایانی C2 که به صورت کد ثابت تعریف شده بود، از طریق پورت ۹۸۷۷ به دست آمد. یک relayPackageServe ماژول علاوه بر این، یک فایل پشتیبان forge-jsxy-package.tgz را نیز ارائه میدهد - همان نام مصنوع در هر تغییر نام.
نکته ساختاری مهم این است که مراحل ۱ تا ۳ در زمان نصب اجرا میشوند. بدون تعامل کاربر، و مرحله ۱، پیلود را در جایی از بسته قرار میدهد مدیر ردیابی نمیکند. توسعهدهندهای که متوجه وابستگیهای عجیب و غریب میشود و دستور npm uninstall را اجرا میکند که فهرست را حذف میکند اما عامل را نه.
این بدافزار همچنین در برابر خواندن سریع مقاومت میکند. اسکریپتهای زمان اجرا ارسال نمیشوند. به طور واضح: یک مرحلهی استقرار رمزگذاری، منطق عملیاتی را به عنوان ... حفظ میکند. حباب رمزگذاری شدهای که فقط پس از زنجیره نصب به اسکریپتهای قابل خواندن گسترش مییابد آن را در دایرکتوری پنهان زمان اجرا رمزگشایی میکند. فایلهایی که قابل مشاهده هستند در فهرست - لایه نازک پس از نصب و یک dist-materialization کمکی - اطلاعات کمی در مورد آنچه در نهایت اجرا میشود، فاش میکند. این تحویل رمزگذاری شده طراحی تأثیر قابل اندازهگیری بر اولویتبندی داشته است: در طول عمر خانواده، چندین گونهی تأیید شده با طبقهبندی خودکار ایمن تشخیص داده شدند، و محتوای مخرب به اندازه کافی مبهم بوده که بررسی خودکار را کاملاً متوقف کرده است. رفتارهایی که خانواده را لو میدهند، تنها پس از کدگذاری قابل مشاهده هستند. مرحله گسترش یافته و زمان اجرا مستقیماً خوانده میشود.
گاهشمار
بار مفید این خانواده به طرز چشمگیری ثابت مانده است؛ آنچه تغییر میکند ... نام روی جعبه. قوس از علامت تجاری "آهنگری" باز به سمت ... امتداد دارد. خود را به عنوان ابزارهای توسعهدهنده نامرتبط پنهان میکند.
| تاریخ (2026) | بسته: نسخه | توجه داشته باشید: |
|---|---|---|
| مه (اوایل) | forge-jsxy:1.0.81, :1.0.90 | اولین گونههای تأیید شده — RAT با C2 رمزگذاری شده با AES-256-GCM |
| می 19 | forge-jsxy:1.0.92 / 1.0.105 / 1.0.107 / 1.0.108 | کمپین در حال انتشار فعال است؛ نسخه ۱.۰.۹۲ در ابتدا به اشتباه ایمن (safe) برچسبگذاری شده بود و در بررسی مجدد کد، وضعیت آن معکوس شد. |
| اواخر ماه مه | forge-jsx3 / forge-jsx4:1.0.122 / 1.0.123, zod-pino | نام بستههای خواهر و برادر، زنجیره ابزار یکسان |
| ژوئن 4 | forge-jsxy:1.0.120 | ادامه؛ طبق مدل یادگیری ماشین، ایمن طبقهبندی شده است (یک اشتباه) |
| ۲۰–۲۱ ژوئن | forge-jsxy:1.0.121 | مجموعه ماژول از نسخه ۱.۰.۱۲۰ بدون تغییر باقی مانده است |
| ژوئیه 6 | zredis-typed:1.0.127 | کلمه «forge» از نام آن حذف شده است؛ هنوز ارسال میشود forge-jsxy-package.tgz و forgeAgent* کلیدهای پیکربندی |
| ژوئیه 7 | pinokio-redis:1.0.127 | همان زنجیره ابزار؛ C2 جدید؛ خود را به عنوان یکپارچهسازی "Autodesk Forge" توصیف میکند |
دو نکته در طول جدول زمانی برجسته است. اول، شماره نسخه ۱.۰.۱۲۷ کلمه به کلمه توسط هر دو zredis-typed و pinokio-redis استفاده میشود - نامگذاری تغییر میکند اما دودمان ساخت بازنشانی نمیشود. دوم، تغییر از نامهای "forge-*" همزمان با تغییر به سمت نامهایی است که به عنوان زیرساخت معمولی خوانده میشوند (redis، pinokio)، که احتمال اینکه یک توسعهدهنده نام را سرسری بخواند و در آن مردد شود را کاهش میدهد.
شاخص های سازش
IOC های زیر غیرفعال شدهاند. میزبان C2 بین خط forge-jsxy میچرخد. و آخرین نسخه با حفظ همان پورت.
| شاخص | مقدار | داخل شد |
|---|---|---|
| نقطه پایانی C2 | 212.193.3[.]61:9877 | pinokio-redis:1.0.127 |
| نقطه پایانی C2 | 79.108.162[.]160:9877 | خط forge-jsxy zredis-typed:1.0.127 |
| کانال اکسفیل | discord.com/api/webhooks/… (پست وب هوک) | همه انواع |
| کانال اکسفیل | discord.com/api/v10 (آپلود رله) | همه انواع |
| کانال اکسفیل | آپلود هاگینگفیس هاب | همه انواع |
| مصنوع سرو شده | forge-jsxy-package.tgz (از طریق relayPackageServe) | همه انواع |
| فایلهای زنجیره ابزار | chromiumExtensionDbHarvest, discordRelayUpload, discordWebhookPost, hfUpload, encode-hf-credentials, forge-jsx-explorer-* | همه انواع |
| فهرست هدف | secret_filename_patterns.json (wallet.dat, .mnemonic/.seed/.phrase, keypair.json, UTC--, .p12/.pfx/*.jks) | همه انواع |
| زمان اجرای پنهان | نقطه چین شده …/.forge-jsxy/runtime/v<version>/ مسیر config-dir | خط forge-jsxy |
| پایداری ویندوز | اسکریپت شروع خودکار مخفی PowerShell با عنوان "forge diagnostics" | همه انواع |
| ماشه را نصب کنید | قلاب پس از نصب که یک زنجیره اسکریپت dist-materialization را فراخوانی میکند | همه انواع |
پایدارترین سیگنال تشخیص، هیچ میزبان یا وبهوک واحدی نیست - آنهایی که چرخش - اما نام فایلهای toolchain و forge-jsxy-package.tgz مصنوعاتی که در هر تغییر نامی، کلمه به کلمه باقی ماندهاند.
انتساب و رفتار مشاهده شده
این بستهها تحت بیش از یک حساب npm منتشر شدهاند. forge-jsxy خط از ناشر jacksonkaandorp2 (jacksonkaandorp2@outlook[.]com) استفاده کرد؛ آخرین نسخه پینوکیو-ردیس توسط donimique منتشر شد (donimiqueakers@gmail[.]com). هیچکدام از حسابها ایمیل تأییدشده یا یک مخزن منبع مرتبط. خط ارتباطی بین حسابها، زنجیره ابزار، نه هویت ناشر - همان نام ماژولها، همان .tgz ارائه شده است، و همان طراحی exfil صرف نظر از اینکه چه کسی منتشر کرده است، تکرار میشود.
چندین رفتار قابل مشاهده نشان دهنده پنهانکاری عمدی است تا ... جمعآوری بیش از حد تصادفی:
فایل زمان اجرا (runtime) در خارج از node_modules و در یک دایرکتوری مخفی قرار دارد، بنابراین از بستهای که آن را ارائه داده است، بیشتر عمر میکند.
این عامل هنگامی که یک محیط CI را تشخیص میدهد، از سیستم خارج میشود و میزان مواجهه را در جعبههای شنی تجزیه و تحلیل خودکار محدود میکند.
فرآیند عامل به صورت جداگانه و مستقل راهاندازی میشود پنجره مخفی.در در نسخههای forge-jsxy، یک نظر، حذف فیلد نصب قابل مشاهده را به «قابل مشاهده بودن آن فیلد در npm» ربط میداد.
توضیحات عمومی بسته به کد ربطی ندارند — pinokio-redis به عنوان یک ادغام «Autodesk Forge» ارائه میشود.
یک شکاف تشخیص مکرر برای مدافعانی که به آن متکی هستند، شایان ذکر است. طبقهبندی خودکار: چندین گونه تأیید شده در این خانواده قبل از اینکه بررسی کد، آن را اصلاح کند، توسط یک طبقهبندیکننده یادگیری ماشین به عنوان ایمن امتیازدهی شد. حکم. عناصر پایداری که یک منتقد میتواند به آنها تکیه کند - زمان نصب زنجیره، زمان اجرای پنهان، نام فایلهای زنجیره ابزار - دقیقاً همانهایی هستند که که از تغییر نامها جان سالم به در میبرند.
ما موارد فوق را به عنوان رفتار مشاهدهشده توصیف میکنیم. ما آن را به ... نسبت نمیدهیم. کمپین را به هر بازیگر نامبرده شدهای واگذار میکنیم، و ما هیچ ادعایی در مورد اپراتور نداریم. هویت یا اهدافی فراتر از آنچه کد و زیرساخت نشان میدهند.
تأثیر، روندها و راهنمایی مدافعان
چه کسی در معرض دید قرار گرفته است. این مجموعه مستقیماً توسعهدهندگان را هدف قرار داده است. ماشینها: کیف پولها و فروشگاههای کلید ارز دیجیتال، افزونههای کیف پول مرورگر، تاریخچه پوسته و اعتبارنامههای ابری/سرویس. هر کسی که یک بسته آسیبدیده - مستقیماً یا به عنوان یک وابستگی انتقالی — در طول پنجرهای که زنده بود در محدوده است، و طراحی مداوم به این معنی است که قرار گرفتن در معرض مواد با برداشتن بستهبندی پایان نمییابد.
چرا پشتکار اهمیت دارد. زیرا مرحله ۱، بار داده را در یک کپی میکند. دایرکتوری پنهان زمان اجرا و رجیسترهای مرحله ۲، شروع خودکار، طبق معمول غریزه اصلاح (حذف وابستگی بد، حذف node_modules، نصب مجدد) عامل را حذف نمیکند. پاسخ به حادثه باید به دنبال آن باشد زمان اجرای خارج از درخت و ورودی شروع خودکار، نه فقط بسته.
روند. این خانواده الگویی را نشان میدهد که ارزش توجه دارد: محمولهای پایدار و بالغ، پیچیده شده در جریانی از مواد یکبار مصرفنامهای بستهای که از هر نامی که قبلاً حذف شده است، مهاجرت میکنند قابل تشخیص، به سمت نامهایی که به عنوان زیرساخت معمولی خوانده میشوند. مبتنی بر نام لیستهای مسدود شده و اعتبار ناشر در برابر این موضوع به سرعت از بین میروند؛ رفتار- و سیگنالهای مبتنی بر مصنوعات این کار را نمیکنند.
برای توسعهدهندگان و مصرفکنندگان
اسکریپتهای زمان نصب را به عنوان سطح ریسک اصلی در نظر بگیرید. در صورت امکان، اسکریپتها را غیرفعال کنید و هرگونه وابستگی که اعلان میکند را بررسی کنید. پس از نصب وابستگیهای انتقالی را پین و بررسی کنید؛ این دسته از بدافزارها به همان راحتی که از طریق وابستگی مستقیم وارد میشوند، از طریق وابستگی فرعی نیز وارد میشوند.
در یک میزبان مشکوک، فراتر از بسته را جستجو کنید: به دنبال یک دایرکتوری زمان اجرا پنهان در محل پیکربندی پلتفرم، یک ورودی شروع خودکار غیرمنتظره، و اتصالات خروجی به وبهوک دیسکورد یا :۹۸۷۷ نقاط پایانی.
فرض کنید هر عبارت بازیابی کیف پول، کلید ذخیره شده یا اعتبارنامه موجود در میزبان آسیب دیده در طول دوره افشای اطلاعات، در معرض خطر است و آن را تغییر دهید.
برای ثبت احوال و مدافعان
هشدار در مورد مصنوعات بادوام (forge-jsxy-package.tgz، the forge-jsx-explorer-* /chromiumExtensionDbHarvest / discordRelayUpload) نام فایلها) به جای نام بسته که تغییر میکند.
ترکیب ساختاری مورد استفاده خانواده را علامتگذاری کنید - یک postinstall که اسکریپتها را در یک مسیر config-dir مخفی به علاوه یک سیستم عامل پیادهسازی میکند. ثبت نام خودکار — مستقل از رشتههای خاص مربوطه.
نام روی بسته حداقل چهار بار تغییر کرده است؛ جعبه داخل آن تشخیص مبتنی بر عملکرد کد، از هر تشخیص دیگری بیشتر دوام آورده است. تاکنون در حال تغییر برچسبگذاری است.





