گیتلب با دو باگ حافظه تو یه کتابخونهٔ روبی هک شد
خلاصهٔ کاملتر
طبق گزارش تیم دیپثفرست، بهعنوان بخشی از پروژهٔ Open Defense Initiative، سیستم خودکار این تیم کتابخونهٔ Oj رو اسکن کرد؛ Oj یه پارسر JSON پرسرعته که بخش زیادیش با کد C نیتیو نوشته شده و گیتلب و خیلی از پروژههای روبی دیگه ازش استفاده میکنن. این اسکن ۱۸ آسیبپذیری از جمله ۷ باگ مربوط به مدیریت حافظه پیدا کرد. دو تا از این باگها، یعنی یه نوشتن خارج از محدودهٔ مجاز حافظه و یه لو رفتن یه آدرس حافظه، نزدیک به پنج سال (۱٬۷۵۳ روز) بدون اینکه کسی متوجه بشه تو Oj باقی مونده بودن.
محققا برای رسیدن از این باگها به گیتلب، دنبال جایی گشتن که Oj واقعاً باهاش صدا زده میشه و به یه قابلیت به اسم نمایش دیف فایلهای Jupyter Notebook رسیدن. وقتی یه کاربر عضو یه پروژه یه فایل نوتبوک (.ipynb که در واقع یه فایل JSONه) رو کامیت و ویرایش میکنه و بعد صفحهٔ دیف اون کامیت رو باز میکنه، یه گِم داخلی گیتلب به اسم ipynbdiff محتوای فایل رو با تابع Oj::Parser.usual.parse پردازش میکنه. این پردازش داخل پروسهٔ Puma، یعنی همون جایی که کد Rails گیتلب اجرا میشه، انجام میشه، پس یه کاربر معمولی میتونه بایتهای دلخواهش رو مستقیم به کد نیتیو C برسونه.
باگ اول تو مدیریت عمق تودرتوی JSON بود: وقتی عمق تودرتو (nesting) از یه حد مشخص رد میشد، Oj بدون هیچ چکی همچنان بایت مینوشت و از محدودهٔ آرایهٔ داخلی خارج میشد. محققا نشون دادن این نوشتن کنترلنشده رو میشه طوری هدایت کرد که یه اشارهگر داخلی حیاتی تو ساختار پارسر (که بعداً به تابع تخصیص حافظه پاس داده میشه) دستکاری بشه و در نهایت یه اشارهگر callback دلخواه ساخته بشه. باگ دوم هم از طریق یه کلید آبجکت بیشازحد بزرگ، یه تکه ۲۹ بایتی از حافظهٔ داخلی Oj رو لو میداد که شامل آدرس یه اشارهگر حافظه بود؛ این آدرس بهعنوان یه لنگر برای دور زدن ASLR (تصادفیسازی آدرس حافظه) استفاده شد.
اولین ردپای این باگ به آگوست ۲۰۲۱ و نسخهٔ Oj 3.13.0 برمیگرده، و از جولای ۲۰۲۲ که گیتلب اعتبارسنجی نوتبوک رو به همین تابع Oj منتقل کرد، این مسیر تو گیتلب خودمدیریتی از نسخهٔ ۱۵.۲.۰ به بعد قابل دسترس بود. زنجیرهٔ نهایی نسخههای CE و EE از ۱۵.۲.۰ تا ۱۸.۱۰.۷، ۱۸.۱۱.۰ تا ۱۸.۱۱.۴ و ۱۹.۰.۰ تا ۱۹.۰.۱ رو تحت تأثیر قرار میداد. بعد از گزارش دیپثفرست، پچهای آپاستریم Oj تو نسخهٔ ۳.۱۷.۳ منتشر شد و گیتلب هم تو انتشار امنیتی ۱۰ ژوئن نسخههای پشتیبانیشدهشو با این نسخهٔ جدید Oj آپدیت کرد.
نکات کلیدی:
- تیم دیپثفرست تو کتابخونهٔ Oj (پارسر JSON روبی) ۱۸ آسیبپذیری از جمله ۷ باگ حافظه پیدا کرد
- دو باگ (نوشتن خارج از محدوده و لو رفتن آدرس حافظه) نزدیک ۵ سال بدون کشف تو Oj بودن
- مسیر حمله از طریق نمایش دیف فایلهای Jupyter Notebook تو گیتلب قابل دسترس بود
- نسخههای CE و EE گیتلب از ۱۵.۲.۰ تا ۱۹.۰.۱ تحت تأثیر بودن و پچها منتشر شدن




