یوهانگ وو، پژوهشگر امنیتی مؤسسه depthfirst، کد اثبات مفهوم (PoC) یک آسیب‌پذیری انتقال کد از راه دور (RCE) را منتشر کرد که به مهاجمان اجازه می‌دهد دستورات دلخواه را با سطح دسترسی git روی سرورهای گیت‌لب خودمدیریت‌شده (Self-managed) و وصله‌نشده نسخه 18.11.3 اجرا کنند.

این زنجیره اکسپلویت فوق‌العاده خطرناک است، زیرا هیچ‌گونه دسترسی مدیریتی، نیاز به تعامل قربانی یا دسترسی به پروژه‌های کاربران دیگر ندارد. یک کاربر عادیِ احراز هویت‌شده می‌تواند با ارسال (Commit) دو فایل Jupyter Notebook دستکاری‌شده و ارسال یک درخواست نمایش تفاوت‌ها (Diff)، این حمله را اجرا کند.

جزئیات فنی زنجیره اکسپلویت و درگیری پردازشگر Oj

ریشه این آسیب‌پذیری به Oj برمی‌گردد؛ یک تجزیه‌کننده (Parser) JSON بسیار سریع برای زبان Ruby که شامل کدهای بومی C زیادی است. مکانیزم رندرکننده Notebook در گیت‌لب، فایل‌های با فرمت .ipynb را به تابع Oj::Parser.usual.parse در یک فرآیند طولانی‌مدت Puma ارسال می‌کند. این مسئله باعث می‌شود داده‌های کنترل‌شده توسط مهاجم، مستقیماً به وضعیت تجزیه‌کننده بومی در داخل فرآیند اپلیکیشن گیت‌لب تزریق شوند.

تحلیل‌های فنی نشان می‌دهد که این حمله از دو باگ مجزا تشکیل شده است. باگ اول یک اشاره‌گر فراخوان (Callback) را کنترل کرده و باگ دوم یک نشت حافظه (Heap Leak) ایجاد می‌کند که برای دور زدن سیستم تصادفی‌سازی چیدمان فضای آدرس (ASLR) حیاتی است. Oj وضعیت تودرتو بودن آرایه‌ها را در یک پشته ثابت 1024 بایتی ذخیره می‌کند اما هرگز عمق آن‌ها را بررسی نمی‌کند. آرایه‌های به شدت تودرتو می‌توانند باعث بازنویسی بایت‌های مجاور شوند که در نهایت به فریب تابع realloc() و اجرای کدهای مخرب منجر می‌شود.

کدام نسخه‌های گیت‌لب آسیب‌پذیر هستند؟

اگرچه اکسپلویت عمومی منتشرشده مختص معماری x86-64 و بیلد خاص نسخه 18.11.3 است، اما باگ‌های زیربنایی طیف وسیعی از نسخه‌ها را درگیر کرده است. بازه‌های آسیب‌پذیر شامل نسخه‌های Community Edition (CE) و Enterprise Edition (EE) زیر است:

  • از نسخه 15.2.0 تا 18.10.7
  • از نسخه 18.11.0 تا 18.11.4
  • از نسخه 19.0.0 تا 19.0.1

همچنین نسخه‌های پکیج gem از 3.13.0 تا 3.17.1 در معرض خطر قرار دارند. تیم نگهدارنده Oj این مشکلات را در تاریخ 27 مه اصلاح کرد و اولین نسخه امن شده، 3.17.3 است.

اقدامات اصلاحی و میزان دسترسی مهاجم

در صورت به سرقت رفتن سرور، مهاجم به داده‌های حساسی نظیر کدهای منبع، اسرار داخلی فریم‌ورک Rails، اعتبارنامه‌های سرویس، اطلاعات مربوط به CI/CD و سرویس‌های داخلی دیگر دسترسی پیدا می‌کند. سرورهای GitLab.com پیش از 10 ژوئن کاملاً امن شده‌اند و مشتریان نسخه Dedicated نیز نیازی به اقدامی ندارند.

اپراتورهای نسخه‌های خودمدیریت‌شده باید فوراً به یکی از نسخه‌های اصلاح‌شده 18.10.8، 18.11.5 یا 19.0.2 ارتقا پیدا کنند. کاربرانی که از Helm و Operator استفاده می‌کنند باید توجه داشته باشند که حتماً نسخه گیت‌لب را داخل ایمیج Webservice بررسی کنند، زیرا استعلام نسخه Chart یا Operator به تنهایی کافی نیست.

تا زمان انتشار این گزارش، نه در یادداشت‌های گیت‌لب و نه در افشاگری‌های depthfirst راهکار موقتی (Workaround) یا شناسه CVE معرفی نشده است. شایان ذکر است که محققان هنوز هیچ شواهدی مبنی بر سوءاستفاده عملی (In-the-wild) از این آسیب‌پذیری در فضای وب مشاهده نکرده‌اند. توسعه‌دهندگان و مدیران زیرساخت باید این ارتقا امنیتی را در صدر فهرست اولویت‌های خود قرار دهند تا از به خطر افتادن زنجیره تامین نرم‌افزار خود جلوگیری کنند.