سیستم Nimbus یک ماشین لینوکسی است که یک وبسایت مدیریت وظایف (job scheduler) را میزبانی میکند که توسط یک محیط شبیهسازی شده AWS پشتیبانی میشود. تحلیل این سیستم نشان میدهد که میتوان از طریق یک آسیبپذیری SSRF (Server-Side Request Forgery) در فرم ارسال وظیفه، با دور زدن لیست سیاه (block list) از طریق استفاده از آدرس IP اعشاری، به سرویس متادیتا (Instance Metadata Service – IMDS) دسترسی یافت و اعتبارنامههای AWS را سرقت کرد.
شناسایی و مرحله اولیه (Reconnaissance)
بررسیهای اولیه با استفاده از nmap دو پورت باز TCP شامل SSH (22) و HTTP (80) را نشان میدهد. بر اساس نسخههای OpenSSH و Nginx، احتمالاً سیستم از Ubuntu 24.04 Noble LTS استفاده میکند. با بررسی مسیرهای مختلف و استفاده از ابزار ffuf برای شناسایی زیردامنهها، وبسایت مدیریت وظایف داخلی «Nimbus Labs Engineering» شناسایی شد. این وبسایت امکان ارسال وظایف (jobs) را از طریق فرمت YAML یا یک URL حاوی فایل YAML فراهم میکند.
بهرهبرداری از SSRF و سرقت اعتبارنامهها
از آنجایی که وبسایت امکان دریافت URL برای فایلهای YAML را دارد، یک آسیبپذیری SSRF در این بخش وجود دارد. برای دور زدن فیلترهای امنیتی که کلمات کلیدی مانند “localhost” یا رنجهای خاص IP را مسدود میکنند، میتوان از نمایش اعشاری IP استفاده کرد. برای مثال، آدرس 127.0.0.1 میتواند به صورت یک عدد اعشاری بزرگ نمایش داده شود تا فیلترها را دور بزند. همچنین برای دسترسی به IMDS (در آدرس 169.254.169.254)، میتوان از فرمت اعشاری استفاده کرد تا از مسدود شدن رنج 169.254 جلوگیری شود.
با موفقیت میتوان به مسیرهای متادیتا دسترسی پیدا کرد و اعتبارنامههای نقش IAM (nimbus-web-role) را استخراج نمود. این اعتبارنامهها امکان تعامل با سرویسهای شبیهسازی شده مانند SQS (Simple Queue Service) را فراهم میکنند.
آسیبپذیری ناهمسانسازی (Deserialization) در SQS
در این سناریو، یک Worker وظایف را از صف SQS دریافت کرده و آنها را با استفاده از کتابخانه PyYAML پردازش میکند. از آنجایی که کد از متد ناامن yaml.load استفاده میکند، میتوان با ارسال یک پیلود (payload) ناهمسانسازی، یک Reverse Shell در محیط کانتینر ایجاد کرد. این کار از طریق ارسال یک پیام حاوی دستورات پایتون به صف SQS انجام میشود.
فرار از کانتینر و دسترسی روت (Container Escape)
پس از دستیابی به کانتینر، میتوان اعتبارنامههای بلندمدت (Long-term credentials) را از متغیرهای محیطی استخراج کرد. این اعتبارنامهها دسترسی مستقیم به سرویس Floci (یک شبیهساز ابری محلی) را بدون محدودیتهای IAM فراهم میکنند. با استفاده از این دسترسی، میتوان یک پروژه CodeBuild ایجاد کرد که دارای حالت Privileged (سطح دسترسی بالا) باشد.
برای حفظ پایداری کانتینر در حین اجرای دستورات، میتوان از ویژگی اکسپورت توابع در Bash (مانند BASH_FUNC_) استفاده کرد. در نهایت، با بهرهبرداری از آسیبپذیری در مسیر modprobe هسته (kernel)، میتوان از کانتینر به میزبان (host) فرار کرد. این تکنیک با تنظیم مسیر یک فایل مخرب در /proc/sys/kernel/modprobe و تحریک هسته برای بارگذاری یک ماژول، دسترسی روت در سطح سیستمعامل میزبان را فراهم میسازد.
تحلیل ریشهای (Root Cause Analysis)
این زنجیره حمله ناشی از چندین ضعف امنیتی است:
- استفاده از فیلترهای مبتنی بر لیست سیاه (Blacklist) برای جلوگیری از SSRF که به راحتی قابل دور زدن هستند.
- استفاده از متد ناامن
yaml.loadدر کتابخانه PyYAML که منجر به ناهمسانسازی ناامن میشود. - اجرای کانتینرها در حالت Privileged که سطح حمله (attack surface) را برای فرار از کانتینر به شدت افزایش میدهد.
- عدم بررسی دقیق توابع و متغیرهای محیطی در محیطهای حساس.