حمله Supply chain یک بسته npm با ۴۵ هزار بار دانلود هفتگی را هدف قرار داد
در یک حمله Supply chain، بستهای با نام rand-user-agent که از طریق مخزن npm توزیع میشود، هدف حمله قرار گرفته و به کدی مخرب آلوده شده است. این کد مخرب بهصورت مبهمسازیشده (obfuscated) در بسته تزریق شده و با اجرا شدن، یک تروجان دسترسی از راه دور (RAT) را روی سیستم کاربر فعال میکند.
بسته rand-user-agent ابزاری برای تولید رشتههای کاربر-عامل (user-agent) تصادفی است که در حوزههایی مانند وباسکرپینگ (web scraping)، آزمونهای خودکار (automated testing) و پژوهشهای امنیتی مورد استفاده قرار میگیرد. با توجه به کاربرد گسترده این بسته در پروژههای فنی و تحقیقاتی، آلودگی آن میتواند تبعات امنیتی قابل توجهی برای توسعهدهندگان و محققان به همراه داشته باشد.
اگرچه این بسته از سوی توسعهدهندگان اصلی منسوخ (deprecated) اعلام شده، اما همچنان از محبوبیت نسبی برخوردار است و بهطور میانگین هفتهای ۴۵ هزار بار دانلود میشود. این موضوع نشاندهنده میزان اتکای برخی پروژهها به این بسته و اهمیت بررسی امنیتی آن است.
با این حال، بهگفته پژوهشگران شرکت Aikido، مهاجمان سایبری از وضعیت نیمهمتروک اما همچنان پرکاربرد این بسته سوءاستفاده کردهاند و با انتشار نسخههای غیرمجاز حاوی کدهای مخرب، آن را آلوده کردهاند. این نسخههای آلوده احتمالاً توسط تعداد قابل توجهی از پروژههای وابسته (downstream projects) دانلود و استفاده شدهاند، که میتواند دامنهی آلودگی را بهطور چشمگیری گسترش دهد.
شرکت Aikido این نفوذ را در تاریخ ۵ مه ۲۰۲۵ شناسایی کرد، زمانی که سیستم تحلیل بدافزار این شرکت، نسخهای جدید از بسته rand-user-agent با شماره نسخه ۱٫۰٫۱۱۰ را بهعنوان مشکوک علامتگذاری کرد. بررسیهای بعدی نشان داد که این نسخه حاوی کدهای مخربی است که بهصورت مبهمسازیشده در آن گنجانده شدهاند.
در بررسیهای دقیقتر، پژوهشگران متوجه شدند که کد مخرب بهصورت مبهمسازیشده (obfuscated) در فایل dist/index.js مخفی شده است. این کد بهگونهای درج شده بود که تنها در صورت پیمایش افقی (horizontal scroll) در نمای کد منبع روی وبسایت npm قابل مشاهده بود، روشی که بهوضوح با هدف پنهانسازی فعالیتهای مخرب طراحی شده است.
بر اساس نتایج تحقیقات، آخرین نسخهی معتبر و رسمی بسته rand-user-agent، نسخهی ۲٫۰٫۸۲ بوده که حدود ۷ ماه پیش منتشر شده است. نسخههای پس از آن، از جمله نسخهی آلوده ۱٫۰٫۱۱۰، بهصورت غیرمجاز منتشر شدهاند و اصالت آنها مورد تأیید توسعهدهندگان اصلی نیست.
نسخههای ۲٫۰٫۸۳، ۲٫۰٫۸۴ و همچنین ۱٫۰٫۱۱۰ که پس از انتشار نسخهی معتبر ۲٫۰٫۸۲ عرضه شدهاند، همگی حاوی کدهای مخرب بودهاند. این نسخهها در مخزن npm منتشر شدهاند، اما هیچگونه معادل یا سابقهای از آنها در مخزن رسمی GitHub پروژه ثبت نشده است، که این موضوع بر غیرمجاز بودن و ماهیت مشکوک آنها صحه میگذارد.
کد مخرب درجشده در نسخههای جدید، پس از اجرا، یک پوشه مخفی در مسیر خانگی کاربر با نام ~/.node_modules ایجاد میکند. سپس با دستکاری مقدار module.paths در Node.js، این مسیر سفارشی را به لیست مسیرهای جستوجوی ماژولها اضافه میکند. این اقدام به مهاجمان اجازه میدهد تا وابستگیهایی نظیر axios و socket.io-client را از مسیر مخرب خود بارگذاری کنند، بدون آنکه کاربر از این تغییرات مطلع شود.
سپس یک اتصال سوکت پایدار به سامانه فرمان و کنترل (C2) مهاجم در آدرس http://85.239.62[.]36:3306 برقرار میکند و اطلاعات شناسایی دستگاه، شامل نام میزبان (hostname)، نام کاربری (username)، نوع سیستمعامل (OS type) و یک شناسه یکتای تولیدشده (UUID) را ارسال مینماید.
پس از فعالسازی RAT، این بدافزار در انتظار دریافت یکی از دستورات زیر باقی میماند.
cd <path> – مسیر کاری فعلی را به مسیر مشخصشده تغییر میدهد
ss_dir – مسیر کاری را به مسیر اسکریپت بازنشانی میکند
ss_fcd:<path> – مسیر کاری را بهصورت اجباری به مسیر دادهشده تغییر میدهد
ss_upf:f,d – یک فایل منفرد با نام f را به مقصد d بارگذاری میکند
ss_upd:d,dest – تمام فایلهای موجود در پوشه d را به مقصد dest بارگذاری میکند
ss_stop – هرگونه عملیات بارگذاری فایل در حال اجرا را متوقف میسازد
(هر دستور دیگر) – بهعنوان یک فرمان شل با استفاده از تابع child_process.exec() اجرا میشود
در زمان نگارش این گزارش، نسخههای مخرب از مخزن این بسته در npm حذف شدهاند؛ بنابراین، آخرین نسخهی موجود ایمن بوده و توصیه میشود کاربران به این نسخه بازگردند.
با این حال، اگر به نسخههای ۲٫۰٫۸۳، ۲٫۰٫۸۴ یا ۱٫۰٫۱۱۰ بهروزرسانی کردهاید، انجام یک اسکن کامل سیستم بهمنظور شناسایی نشانههای نفوذ الزامی است. توجه داشته باشید که بازگشت به نسخهی سالم و معتبر، ابزار دسترسی از راه دور (RAT) را از سیستم شما حذف نمیکند.
همچنین توصیه میشود از نسخههای انشعابیافته (forked) این ابزار که همچنان تحت پشتیبانی بوده و نظارت بهتری بر آنها صورت میگیرد، استفاده نمایید.
در تاریخ ۵ مه ۲۰۲۵ (ساعت ۱۶:۰۰ به وقت UTC)، به ما اطلاع داده شد که سه نسخهی غیرمجاز از بستهی rand-user-agent در رجیستری npm منتشر شدهاند (نسخههای ۱٫۰٫۱۱۰، ۲٫۰٫۸۳ و ۲٫۰٫۸۴). کد مخرب هرگز در مخزن GitHub ما وجود نداشت؛ بلکه صرفاً در نسخههای منتشرشده روی npm گنجانده شده بود که این موضوع، نمونهای کلاسیک از حمله به زنجیره تأمین است.
بررسیهای ما (که همچنان در جریان است) نشان میدهد مهاجم با دسترسی به یک توکن خودکار منقضیشده متعلق به یکی از کارکنان، اقدام به انتشار این نسخهها در npm کرده است. این توکن فاقد احراز هویت دومرحلهای (۲FA) بوده و همین موضوع به مهاجم امکان داده است تا:
- نسخههایی را منتشر کند که در GitHub وجود نداشتند،
- شماره نسخهها را افزایش دهد تا ظاهری قانونی داشته باشند،
- هیچ نسخهای را منقضی نکند، به امید آنکه نسخههای جدید پیش از شناسایی گسترش یابند.
هیچگونه شواهدی مبنی بر نفوذ به مخزن کد منبع، زنجیره ساخت (build pipeline) یا شبکهی سازمانی ما وجود ندارد. این حادثه صرفاً به رجیستری npm محدود بوده است.
ما از تمامی توسعهدهندگان و سازمانهایی که تحت تأثیر این حادثه قرار گرفتهاند، صمیمانه عذرخواهی میکنیم. محافظت از اکوسیستم متنباز را مسئولیتی جدی تلقی میکنیم و متعهد به شفافیت کامل در فرایند رفع تمامی شکافهایی هستیم که زمینهساز این حمله شدند.
بهروزرسانی ۹ مه – نظر WebScrapingAPI افزوده شد.