۲۵ مهر ۱۴۰۵ calif.io ۳ دقیقه مطالعه

سوءاستفاده از یک باگ ۳۷ ساله در کرنل OpenBSD برای دستیابی به دسترسی روت

سوءاستفاده از یک باگ ۳۷ ساله در کرنل OpenBSD برای دستیابی به دسترسی روت — Big Fish: Exploiting a 37-Year-Old Kernel Bug in OpenBSD

خلاصه

محققان امنیت موفق شده‌اند با استفاده از یک سرریز عدد صحیح (Integer Overflow) تاریخی که ریشه در کدهای اولیه BSD دارد، به همراه آسیب‌پذیری‌های دیگر در سیستم‌عامل OpenBSD به سطح دسترسی Root دست پیدا کنند. این پژوهش نشان می‌دهد که حتی در امن‌ترین سیستم‌عامل‌ها نیز باگ‌های پنهان قدیمی می‌توانند با تکنیک‌های دقیق مهندسی اکسپلویت شوند.

مقدمه و زمینه تاریخی

تیم تحقیقاتی امنیتی Calif اخیراً جزئیات بهره‌برداری از یک آسیب‌پذیری بسیار قدیمی را منتشر کرده‌اند که ریشه آن به حدود ۳۷ سال پیش و کدهای اولیه BSD بازمی‌گردد. سیستم‌عامل OpenBSD به دلیل رویکرد سخت‌گیرانه خود در امنیت، ممیزی مداوم کدها و استفاده از مکانیزم‌های دفاعی پیشرفته شهرت دارد؛ با این حال، این پژوهش نشان می‌دهد که کدهای قدیمی کرنل همچنان می‌توانند میزبان باگ‌های خطرناکی باشند که کشف آن‌ها از طریق بازبینی معمولی کد بسیار دشوار است.

در کامنت‌های هاکرنیوز، کاربران به این نکته اشاره کردند که این باگ حتی در یکی از امن‌ترین و ممیزی‌شده‌ترین codebaseها برای دهه‌ها پنهان مانده بود. جالب اینکه نسخه مشابه این مشکل در سال ۱۹۹۹ طی بازنویسی کدهای NetBSD به طور تصادفی برطرف شده بود.

جزئیات فنی اکسپلویت

هسته اصلی این آسیب‌پذیری یک شمارنده اتصال حافظه اشتراکی (Shared Memory Attachment Counter) بود که به صورت یک عدد صحیح علامت‌دار ۱۶ بیتی (short) تعریف شده بود. با ایجاد مکرر پروسه‌ها و نگاشت‌های حافظه اشتراکی SysV، می‌توان این شمارنده را از حد مجاز عبور داد و باعث سرریز آن به یک مقدار منفی شد. این سرریز عدد صحیح منجر به یک وضعیت Use-After-Free و مسابقه (Race Condition) شد.

مسیر کلی این اکسپلویت روی OpenBSD (با وجود فعال بودن مکانیزم‌های دفاعی مدرن مانند KARL، SMAP و SMEP) شامل مراحل زیر است:

  • نگاشت و لغو نگاشت سگمنت‌های حافظه اشتراکی و فورک کردن پروسه‌ها برای منفی کردن شمارنده اتصال.
  • استفاده از آمارهای تخصیص حافظه کرنل (sysctl) برای مدیریت چیدمان Heap.
  • برنده شدن در مسابقه با استفاده از دستور IPC_RMID و اتصال یک سگمنت حافظه اشتراکی با اندازه نامطمئن.
  • تنظیم سوکت‌های IP و دستکاری ساختارهای داخلی برای رسیدن به یک نگاشت قابل پیش‌بینی.
  • دستیابی به اجرای کد در سطح کرنل با بازنویسی یک پوینتر قابل پیش‌بینی با استفاده از مکانیزم write-what-where.

یکی از نکات جالب که کاربران هاکرنیوز به آن اشاره کرده‌اند، پیچیدگی و دقت ریاضی این اکسپلویت است که شباهت زیادی به ترفندهای دقیق سرعت‌دوندگان بازی‌های ویدیویی (Speedrunners) دارد.

راهکارهای کاهش خطر و بهبودهای دفاعی

برای جلوگیری از تکرار چنین حملاتی، محققان پیشنهادهای مهمی برای توسعه‌دهندگان کرنل مطرح کرده‌اند:

  • پیاده‌سازی Safe-Unlinking: بررسی صحت و اینвариانت‌های لیست‌های پیوندی دوطرفه پیش از انجام عملیات بازنویسی حافظه.
  • تصادفی‌سازی آدرس نگاشت PTE: تغییر دینامیک آدرس پایه مکانیزم‌های خودارجاع در سطح مموری مَپینگ کرنل در زمان بوت.
  • غیرقطعی کردن تخصیص‌دهنده حافظه کرنل (Kernel Allocator): تصادفی‌سازی آدرس پایه و ترتیب تخصیص حافظه در زمان اجرا برای از بین بردن قابلیت پیش‌بینی مکان ساختارها.
  • ابزارهای کامپایلر مانند Bounds Sanitizer: استفاده از ابزارهای بررسی‌کننده محدودیت آرایه‌ها در بیلد نهایی برای حذف دسترسی‌های خارج از محدوده.

چرا این مسئله برای مهندسان نرم‌افزار مهم است؟

این پژوهش یادآور این حقیقت است که وابستگی به کدهای قدیمی و میراثی (Legacy Code) حتی در سیستم‌های با امنیت بالا می‌تواند خطرساز باشد. با ظهور ابزارهای خودکار و هوش مصنوعی در کشف آسیب‌پذیری‌ها، مهاجمان سریع‌تر می‌توانند این‌گونه باگ‌های ساختاری را پیدا کنند. به همین دلیل، مهندسین سیستم و توسعه‌دهندگان کرنل باید علاوه بر متدهای سنتی بازبینی کد، از مکانیزم‌های دفاعی در سطح کامپایلر و معماری حافظه برای خنثی‌سازی کل کلاس‌های آسیب‌پذیری بهره بگیرند.

این مطلب به‌صورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل

این خبر را با دیگران به اشتراک بگذارید

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