حمله زنجیره تأمین npm بار دیگر جامعه توسعهدهندگان را هدف قرار داده است. در این رخداد، مهاجمان با سوءاستفاده از یک دامنه منقضی شده موفق شدند حساب یکی از توسعهدهندگان پکیج محبوب node-ipc را تصاحب کرده و نسخههای آلودهای از این ماژول منتشر کنند. این حمله زنجیره تأمین npm با اضافهکردن یک پیلود سرقت اعتبارنامه به کد پکیج انجام شده و صدها پروژه وابسته را در معرض ریسک قرار داده است. از آنجا که node-ipc در بسیاری از پروژههای Node.js استفاده میشود، ابعاد این حمله میتواند بسیار گسترده باشد.
جزئیات حمله زنجیره تأمین npm در پکیج node-ipc
پکیج node-ipc یکی از ماژولهای شناختهشده در اکوسیستم Node.js است که برای پیادهسازی ارتباط بین پردازهها در سیستمهای مختلف استفاده میشود. این کتابخانه از طریق انواع سوکتها امکان ارتباط لوکال و از راه دور را فراهم میکند و حتی در برخی پروژهها برای پیادهسازی شبکههای عصبی چندپردازهای (multi-process neural networks) در جاوااسکریپت مورد استفاده قرار میگیرد.
این پکیج در حال حاضر بهعنوان وابستگی مستقیم بیش از 424 پروژه استفاده میشود و حدود 700هزار دانلود هفتگی دارد؛ بنابراین هرگونه حمله علیه آن میتواند اثر زنجیرهای گستردهای در پروژههای دیگر ایجاد کند.
مهاجمان موفق شدند سه نسخه آلوده از این پکیج را منتشر کنند:
- 1.6
- 2.3
- 0.1
در هر سه نسخه، یک پیلود مخرب 80 کیلوبایتی و مبهمسازی شده (obfuscated) در فایل node-ipc.cjs قرار داشت که برای سرقت اطلاعات طراحی شده بود.
سابقه امنیتی پکیج node-ipc
این نخستینبار نیست که نام node-ipc در یک رخداد امنیتی مطرح میشود. در مارس 2022، توسعهدهنده این پروژه پس از حمله روسیه به اوکراین، عمداً کدی مخرب به پکیج اضافه کرد که فایلهای سیستمهایی با IP روسیه یا بلاروس را پاک میکرد.
این حمله جنبه سیاسی داشت، اما رخداد جدید یک حمله زنجیره تأمین npm واقعی توسط مهاجمان سایبری محسوب میشود.
نحوه عملکرد پیلود سرقت اعتبارنامه
کد مخرب زمانی اجرا میشود که یک برنامه پکیج را با دستور زیر بارگذاری کند:
- require(‘node-ipc’)
پس از بارگذاری پکیج، پیلود در پسزمینه فعال شده و بدون ایجاد اختلال در عملکرد اصلی کتابخانه، عملیات جمعآوری داده را آغاز میکند. این طراحی باعث میشود تشخیص حمله زنجیره تأمین npm دشوارتر گردد.
در مرحله اول، پیلود اطلاعاتی از سیستم قربانی استخراج میکند، از جمله:
- نسخه سیستمعامل
- نام میزبان (hostname)
- متغیرهای محیطی (environment variables)
سپس بر اساس سیستمعامل، مسیرها و فایلهای هدف را برای سرقت داده بررسی میکند.
بر اساس تحلیل Socket.dev، این پیلود دو فهرست جداگانه برای macOS و Linux/default دارد:
- macOS: شامل 113 الگو
- Linux/default: شامل 127 الگو
دادهها و اعتبارنامههای هدف حمله زنجیره تأمین npm
فهرست اهداف این پیلود بسیار گسترده است و شامل موارد زیر میشود:
- سرویسهای ابری: پیکربندیهای مربوط به AWS، Azure، GCP، OCI، DigitalOcean، Scaleway، Hetzner، Fly، Vercel، Railway، Alibaba Cloud، IBM Cloud، Linode، MinIO، Snowflake، Doppler و Salesforce.
- ابزارهای DevOps و زیرساخت: Kubernetes، Docker، Helm، Rancher و Terraform.
- کلیدها و دسترسیها: کلیدهای SSH، فایلهای پیکربندی SSH، توکنها و کلیدهای API.
- ابزارهای توسعه: npm، Yarn، Netrc، Git، GitHub CLI، GitLab CLI و Hub.
- فایلهای محیطی و دیتابیس: .env، .env.local، .env.production، فایلهای پیکربندی دیتابیس، تاریخچهshell و تاریخچه CLI دیتابیس.
- دادههای سیستم: فایلهای Keychain در macOS، keyringهای Linux و فایلهای KWallet.
- سایر دادههای حساس: پروفایل Firefox، تنظیمات FileZilla، پروفایل Remmina، OpenVPN و دادههای لوکال Microsoft Teams.
اگرچه این پیلود مستقیماً محل ذخیره اعتبارنامه مرورگرها را مورد هدف قرار نمیدهد، اما از آنجا که به Keychain در macOS دسترسی دارد، بخشی از اعتبارنامههای مرورگر نیز ممکن است در معرض ریسک قرار گرفته باشند.
روش مخفیانه استخراج داده با DNS TXT
یکی از ویژگیهای قابلتوجه این حمله زنجیره تأمین npm، استفاده از روش غیرمعمول برای استخراج دادهها است. مهاجمان بهجای استفاده از HTTP، دادهها را از طریق کوئری DNS TXT استخراج میکنند.
این فرآیند به این صورت است:
- دادههای جمعآوریشده در یک آرشیو GZIP قرار میگیرند.
- فایل به چندین بخش کوچک تقسیم میشود.
- هر بخش از طریق درخواستهای DNS TXT به دامنه کنترلشده توسط مهاجم ارسال میشود.
دامنهای که توسط مهاجمان استفاده شده، شباهت زیادی به دامنه رسمی سرویس Azure Static Web Apps دارد تا توجه کاربران و سیستمها را کمتر جلب کند. برآورد Socket.dev نشان میدهد که انتقال یک فایل 500 کیلوبایتی از این طریق به حدود 29,400 درخواست DNS TXT نیاز دارد.
عدم وجود مکانیزم پایداری در بدافزار
بررسی نمونه پیلود نشان میدهد که این بدافزار فاقد هرگونه مکانیزم پایداری (Persistence) است و هیچ نشانهای از موارد زیر مشاهده نشده است:
- Cron job
- launchd
- d
- نصب سرویس
- دانلود مرحله دوم بدافزار
به همین دلیل، اثر عملی این حمله زنجیره تأمین npm در همان پنجره اجرای اولیه متمرکز است:
- جمعآوری دادهها
- ساخت آرشیو
- استخراج داده از طریق DNS
- پاکسازی ردپا
ریشه حمله زنجیره تأمین npm: دامنه منقضی شده و تصاحب ایمیل
نسخههای مخرب از طریق حساب npm با نام atiertant منتشر شدند. این حساب متعلق به یکی از توسعهدهندگان پروژه بود، اما:
- آخرین فعالیت آن در npm مربوط به سال 2022 بود.
- این توسعهدهنده هرگز نسخهای از node-ipc منتشر نکرده بود.
محققان امنیتی متوجه شدند ایمیل این حساب روی دامنه زیر میزبانی میشد:
- atlantis-software.net
این دامنه:
- در ژانویه 2025 منقضی شد.
- سپس مجدداً توسط مهاجمان ثبت گردید.
پس از ثبت دامنه، مهاجمان:
- سرور ایمیل راهاندازی کردند.
- همان آدرس ایمیل توسعهدهنده را بازیابی کردند.
- درخواست ریست پسورد npm دادند.
- حساب توسعهدهنده را تصاحب کردند.
این تکنیک عملاً باعث اجرای موفق حمله زنجیره تأمین npm شد.
چالش امنیتی پروژههای متنباز
این رخداد نشان میدهد پروژههای متن باز با چالشهای امنیتی خاصی مواجه هستند. برخلاف شرکتها که معمولاً دسترسیها را بهطور منظم بررسی میکنند، در پروژههای متنباز:
- توسعهدهندگان اغلب داوطلبانه و بدون استخدام رسمی روی پروژه کار میکنند.
- برخی توسعهدهندگان ممکن است برای مدت طولانی در پروژه فعال نباشند، بهویژه در پروژههایی که بهطور مرتب بهروزرسانی نمیشوند.
- مدیریت و حذف دسترسی این توسعهدهندگان غیرفعال همیشه ساده نیست و ممکن است امکان سوءاستفاده از حسابها را فراهم کند.
محققان معتقدند احتمالاً مهاجمان بهطور خاص node-ipc را هدف نگرفتهاند. سناریوی محتمل این است:
- جستجوی حسابهای npm با دامنه ایمیل سفارشی
- بررسی دامنه منقضی شده
- ثبت مجدد دامنه
- تصاحب ایمیل و حساب
بنابراین، حسابهای غیرفعال دیگری نیز ممکن است در معرض همین روش حمله قرار داشته باشند.