محققان امنیت سایبری یک حمله جدید به زنجیره تأمین نرم‌افزار را شناسایی کرده‌اند که با نام رمز SleeperGem شناخته می‌شود و اکوسیستم Ruby را هدف قرار داده است. در این حمله، سه بسته مخرب در مخزن RubyGems منتشر شده‌اند که هدف نهایی آن‌ها ارسال بدافزارهای بیشتر به ماشین‌های توسعه‌دهندگان است.

این بسته‌های مخرب عبارتند از:

  • git_credential_manager (نسخه‌های 2.8.0، 2.8.1، 2.8.2، 2.8.3) - منتشر شده در ۱۸ ژوئیه ۲۰۲۶
  • Dendreo (نسخه‌های 1.1.3، 1.1.4) - منتشر شده در ۱۴ اکتبر ۲۰۱۷
  • fastlane-plugin-run_tests_firebase_testlab (نسخه 0.3.2) - منتشر شده در ۶ فوریه ۲۰۱۸

شرکت امنیتی StepSecurity در تحلیل خود اعلام کرد: «هر نسخه مخرب یک لودر است. این بسته مرحله دوم بدافزار را از یک میزبان Forgejo تحت کنترل مهاجم دریافت می‌کند. سپس بررسی می‌کند که آیا در یک سیستم ساخت (Build System) اجرا می‌شود یا خیر؛ اگر بله، از اجرا صرف‌نظر می‌کند و در غیر این صورت، روی ماشین توسعه‌دهنده یک دیمون بومی (Native Daemon) رها کرده و ماندگاری (Persistence) نصب می‌کند.»

تکنیک‌های فریبنده در SleeperGem

یکی از نکات قابل توجه در این حمله، جعل هویت بسته git_credential_manager است که ظاهر خود را شبیه ابزار رسمی Git Credential Manager شرکت مایکروسافت کرده است. دو بسته دیگر نیز سال‌ها غیرفعال بودند و به‌طور ناگهانی به‌روزرسانی مخرب دریافت کردند. برای مثال، آخرین به‌روزرسانی بسته Dendreo مربوط به ۲۴ اکتبر ۲۰۲۰ و بسته fastlane-plugin-run_tests_firebase_testlab از ۹ مارس ۲۰۱۹ به‌روزرسانی نشده بود.

یکی دیگر از ویژگی‌های عجیب این حملات این است که نسخه‌های مخرب مستقیماً در مخزن RubyGems منتشر شده‌اند، بدون اینکه commit یا تگ منطبقی در پروژه‌های منبع وجود داشته باشد.

گسترش بدافزار از طریق وابستگی‌ها

نکته جالب دیگر این است که بسته git_credential_manager به عنوان یک وابستگی (Dependency) به پنج بسته دیگر اضافه شده است که از جمله آن‌ها می‌توان به Dendreo و fastlane-plugin-run_tests_firebase_testlab اشاره کرد. این کار عملاً به بدافزار اجازه می‌دهد تا به کاربران این بسته‌ها نیز نفوذ کند. لیست کامل این بسته‌ها به شرح زیر است:

  • Dendreo
  • fastlane-plugin-run_tests_firebase_testlab
  • slackHtmlToMarkdown
  • seo_optimizer
  • array_fast_methods

همه بسته‌های نام‌برده شده، به جز fastlane-plugin-run_tests_firebase_testlab، توسط یک حساب کاربری به نام "LR-DEV" نگهداری می‌شوند. اما بسته اخیر متعلق به یک نگهدارنده دیگر به نام "pinkroom" است. این نشان می‌دهد که احتمالاً بیش از یک حساب کاربری در RubyGems برای انتشار نسخه‌های مخرب به خطر افتاده است.

اجتناب از محیط‌های CI/CD

پس از نصب، بدافزار تعبیه‌شده در این بسته‌ها سیستم آلوده را برای حدود ۳۰ متغیر محیطی (Environment Variables) اسکن می‌کند. این متغیرها شامل موارد مرتبط با سرویس‌هایی مانند GitHub Actions، GitLab، CircleCI، Travis، Jenkins و Vercel هستند. اگر هر یک از این متغیرها شناسایی شود، برنامه بلافاصله خارج می‌شود. این یک تلاش عمدی برای جلوگیری از اجرا بر روی رانرهای موقت CI و اطمینان از اجرا روی ماشین واقعی توسعه‌دهنده است.

نمودار نحوه عملکرد حمله SleeperGem در زنجیره تأمین Ruby

مراحل اجرای حمله در بسته git_credential_manager

در مورد بسته git_credential_manager، کد مخرب زمانی فعال می‌شود که کتابخانه فراخوانی شود. این کد دو بار را از یک نمونه عمومی Forgejo به آدرس "git.disroot[.]org/git-ecosystem" دانلود می‌کند: یک اسکریپت شل به نام "deploy.sh" و یک باینری بومی که همان نام ابزار جعلی را دارد. در سیستم‌عامل ویندوز، بار دریافتی از طریق PowerShell اجرا می‌شود.

در نسخه 2.8.2، فقط بارها مرحله‌بندی (Staging) می‌شوند، اما در نسخه 2.8.3 حمله وارد فاز بعدی می‌شود. اسکریپت نصب، باینری را به عنوان یک دیمون پس‌زمینه راه‌اندازی می‌کند و سپس با استفاده از یک ورودی cron و یک سرویس کاربر systemd ماندگاری خود را تضمین می‌کند. همچنین گروه‌های sudo و wheel را جستجو می‌کند.

به گفته StepSecurity: «اگر کاربر بتواند دستور sudo را بدون رمز عبور اجرا کند، اسکریپت خود را دوباره به عنوان کاربر ریشه (Root) اجرا می‌کند. در این حالت، یک کپی setuid ریشه از شل سیستم در مسیری قرار می‌دهد که شبیه یک ابزار شبکه است.»

توصیه‌های امنیتی فوری

به کاربرانی که هر یک از بسته‌های ذکر شده را نصب کرده‌اند، اکیداً توصیه می‌شود دستگاه‌ها و اعتبارنامه‌های مرتبط را به عنوان به‌خطرافتاده در نظر بگیرند. اقدامات زیر باید فوراً انجام شود:

  • حذف دیمون رها شده در مسیر "~/.local/share/gcm/"
  • پاک کردن روش‌های ماندگاری (Persistence) ایجاد شده
  • بررسی یک شل setuid در مسیر "/usr/local/sbin/ping6"
  • تغییر تمام اعتبارنامه‌ها (Credentials) و رمزهای عبور

روش کار مهاجمان: حساب‌های خاموش و بی‌خطر

چارلی اریکسن، محقق شرکت امنیتی Aikido Security، در این باره گفت: «یک حساب RubyGems که برای شش یا هفت سال خاموش شده است، برای کسی خطرناک به نظر نمی‌رسد. این دقیقاً پروفایلی است که ارزش تصاحب را دارد. نام SleeperGem از اینجا می‌آید: نه یک دارایی مهاجم برنامه‌ریزی‌شده و طولانی‌مدت، بلکه یک حساب واقعی و معمولی که به سادگی خاموش شده بود و آنقدر بی‌آزار به نظر می‌رسید که بدون جلب توجه کسی، می‌توان از آن سوءاستفاده کرد.»

این حمله بار دیگر اهمیت نظارت مستمر بر مخازن کد و مدیریت دقیق دسترسی‌ها در اکوسیستم‌های منبع‌باز را یادآوری می‌کند. توسعه‌دهندگان و تیم‌های امنیتی باید نسبت به بسته‌هایی که پس از مدت‌ها به‌روزرسانی می‌شوند، هوشیار باشند و از ابزارهای تحلیل وابستگی‌ها برای شناسایی ناهنجاری‌ها استفاده کنند.