برای اولین بار، محققان ReversingLabs موفق به شناسایی پکیجهای مخرب در npm شدند که پس از نصب محلی، سایر پکیجهای معتبر را آلوده میکنند.
کشف دو پکیج مخرب ethers-provider2 و ethers-providerz
در ماه مارس ۲۰۲۵، دو پکیج مشکوک ethers-provider2 و ethers-providerz در مخزن npm منتشر شدند. این پکیجها دانلودکنندههای سادهای هستند که پیلود مخربشان به شکلی هوشمندانه پنهان شده است، همراه با یک بدافزار دیگر که پکیج قانونی npm به نام ethers را که بهصورت محلی نصب شده بود را با یک فایل جدید حاوی پیلود مخرب دستکاری میکند. این فایل دستکاریشده در نهایت یک شل معکوس (reverse shell) ارائه میدهد.
نحوه عملکرد بدافزار (پکیج ethers-provider2)
پکیج ethers-provider2 رفتاری مشابه پکیج معتبر و محبوب ssh2 دارد که کد مخربی به آن افزوده شده است. این پکیج معتبر بیش از 350 میلیون بار دانلود شده و بیش از 1600 برنامه به آن وابسته هستند.
شناسایی این پکیج توسط محققان ReversingLabs به راحتی انجام شد زیرا نشانه های آشکاری وجود داشت که حاوی کد مخرب است. مراحل طی شده توسط بدافزار به شرح زیر است:
مرحله اول:
ابتدا فایل install.js دستکاری شده تا یک پیلود روی آن سوار شود و از آدرس hxxp[:]//5[.]199[.]166[.]1[:]31337/install بدافزار مرحله دوم را دانلود کند. هنگام نصب، اسکریپت نصب install.js اجرا میشود و بدافزار مرحله دوم به شکل یک فایل موقت دانلود شده و سپس اجرا میگردد.
مرحله دوم:
بلافاصله پس از اجرا، فایل موقت حذف میشود و هیچ نشانهای از اتفاقی که رخ داده باقی نمیماند؛ این خود نشانه دیگری از مخرب بودن پکیج است، زیرا چنین رفتاری معمولاً در پکیجهای معتبر مشاهده نمیشود.
سپس، در یک حلقه نامحدود، بدافزار بررسی میکند که آیا پکیج ethers روی سیستم نصب شده است یا خیر. در صورت وجود یا بعد از نصب آن، یکی از فایلهای آن به نام provider-jsonrpc.js را با نسخهای آلوده جایگزین میکند که مرحله سوم بدافزار را از آدرس hxxp[:]//5[.]199[.]166[.]1[:]31337/config دانلود و اجرا میکند.

بدافزار مرحله دوم فایلی به نام loader.js ایجاد میکند که کدی با همان کارکرد کد مخربی که برای دستکاری کردن فایل ethers استفاده شده بود، نوشته و سپس آن را اجرا میکند.
مرحله سوم:
مرحله سوم یک شل معکوس را ارائه میدهد که به سرور عامل تهدید متصل میشود و این اتصال از طریق یک کلاینت SSH از پکیج ethers-provider2 برقرار میگردد. این کلاینت به همان شکلی عمل میکند که یک کلاینت از پکیج معتبر ssh2 عمل میکند، اما به گونهای دستکاری شده است تا پیامهای اضافی را دریافت کند. این بدان معناست که اتصالی که با این کلاینت باز میشود، پس از دریافت یک پیام سفارشی از سرور، به یک شل معکوس تبدیل میشود. این موضوع حتی در صورتی که پکیج ethers-provider2 از سیستمی قربانی حذف شود نیز صادق است. کلاینت همچنان در شرایط خاصی استفاده خواهد شد و درجهای از پایداری را برای مهاجمان فراهم میکند.

اگرچه دانلودکنندهها در پلتفرم npm بهاندازه ربایندههای اطلاعات رایج نیستند، اما همچنان کاربرد دارند. با این حال، دانلودکننده مورد بحث به دلیل روشهای پیشرفتهای که مهاجمان برای مخفی کردن بدافزار خود به کار بردهاند، قابل توجه است. این تکنیکهای پنهانسازی پیچیدهتر و مؤثرتر از نمونههای پیشین در npm هستند.
لازم به ذکر است که کد مخرب فقط در نسخه محلی نصبشده پکیج ethers تزریق شده و نسخه رسمی این پکیج در npm دچار مشکل نشده است.
پکیج ethers-providerz
پکیج دیگر متعلق به همین کمپین، یعنی ethers-providerz، تنها سه نسخه دارد که دو نسخه آخر آن بسیار شبیه به ethers-provider2 است؛ در حالی که نسخه اول، یعنی ۱.۱۶.۰، بیشتر شبیه یک نسخه آزمایشی به نظر میرسد.
پیلود مخرب در اسکریپت نصب install.js قرار دارد. این اسکریپت تلاش میکند چندین فایل از پکیج قانونی npm به نام @ethersproject/providers، که بهصورت محلی نصب شده است، را به همان شکلی دستکاری کند که فایل provider-jsonrpc.js از پکیج ethers دستکاری شده بود.
اینکه کدام پکیج npm برای دستکاری هدف قرار گرفته است به طور حدسی تخمین زده شده است، زیرا مسیر هر فایل بهطور نادرست نوشته شده است؛ عامل تهدید محدوده را مشخص کرده، اما نام پکیج موردنظر را ارائه نداده است.
تیم تحقیقاتی RL همچنین مشاهده کرد که پیلود مخرب، فایلی مخرب به نام loader.js را در پوشه node_modules ایجاد و اجرا میکند. پوشه node_modules مکانی است که پکیجهای npm پس از نصب بهصورت پیشفرض در آن ذخیره میشوند. فایل loader.js مرحله دوم را از آدرس hxxp[:]//5[.]199[.]166[.]1[:]31337/config دانلود میکند.
نکته جالب اینجاست که یک پکیج معتبر npm به نام loader.js وجود دارد که بیش از ۲۴ میلیون بار دانلود شده و ۵۲۰۰ برنامه به آن وابسته هستند. این نشان میدهد که، مشابه با ssh2، عامل تهدید قصد داشته یک پکیج قانونی، رایج و نصبشده محلی را با نسخهای تقریباً یکسان اما حاوی کد مخرب دستکاری کند.

کشف و مقابله
شناسایی پکیجهای مخرب ethers-provider2 و ethers-providerz بهسادگی انجام شده است. این پکیجها از تعداد دانلود بسیار محدودی برخوردار بودند و حاوی کد مخرب غیرمبهم (non-obfuscated) بودند که مرحله دوم را در اسکریپت نصب خود دانلود میکرد.
با وجود تعداد دانلود اندک، این پکیجها از قدرت و قابلیت تخریب بالایی برخوردارند. در صورت موفقیت مأموریتشان، این پکیجها میتوانند پکیج محلی ethers را مختل کرده و حتی در صورت حذف این پکیج، پایداری خود را در سیستمهای بهخطرافتاده حفظ کنند.
در حال حاضر، پکیج ethers-providerz از مخزن npm حذف شده است که به احتمال زیاد توسط نویسنده پکیج انجام شده، زیرا هیچ پشتیبانی امنیتی برای آن وجود ندارد. با این حال، پکیج ethers-provider2 همچنان در npm موجود است، اما به پشتیبانان npm گزارش شده است.
بهمنظور مقابله با تهدیدات ناشی از این پکیجها، شرکت ReversingLabs یک قانون YARA ساده توسعه داده است که امکان تشخیص دستکاری شدن یا نشدن پکیج محلی ethers را فراهم میسازد. قانونYARA ، یک ابزار شناسایی بدافزار است که با استفاده از قوانین قابل تنظیم، الگوهای مخرب را در فایلها و کدهای مشکوک شناسایی میکند.

قانون YARA:
rule npm_Downloader_InjectedMaliciousCode
{
meta:
author = "ReversingLabs"
source = "ReversingLabs"
category = "MALWARE"
description = "Yara rule that detects if there is a malicious payload injected in legitimate locally installed npm package ethers."
strings:
$decode_payload_url = "atob(atob(\"YUhSMGNEb3ZMelV1TVRrNUxqRTJOaTR4T2pNeE16TTNMMk52Ym1acFp3PT0=\"))"
$fetch_payload = "fetch("
$execute_payload = "eval("
condition:
all of them
}
گسترش تهدید
پس از تحلیل اولیه، دو پکیج مشکوک دیگر نیز شناسایی شدند:
- reproduction-hardhat که یک شل معکوس ایجاد میکند.
- @theoretical123/providers که مرحله دوم بدافزار را از آدرس hxxp[:]//5[.]199[.]166[.]1[:]31337/config دانلود میکند.
هر دو پکیج از npm حذف شدهاند.
نتیجهگیری
حملات زنجیره تأمین نرمافزار (Software Supply Chain Attacks) همچنان یک تهدید جدی برای توسعهدهندگان و کاربران npm محسوب میشود. در حالی که تعداد بدافزارهای npm در سال ۲۰۲۴ کاهش یافته بود، این حمله جدید نشان میدهد که مهاجمان همچنان به دنبال روشهای جدیدی برای توزیع بدافزارهای خود هستند.
شاخصهای آلودگی (IOCs) این حملات را میتوانید از طریق این لینک مشاهده کنید.