یک زنجیره اکسپلویت (Exploitation Chain) جدید در هسته OpenBSD کشف شده است که با ترکیب یک نقص در حسابداری حافظه مشترک (Shared Memory Accounting) و یک مورد Write خارج از محدوده (Out-of-bounds write)، امکان دستیابی به سطح دسترسی Root را فراهم میکند.
ریشه تاریخی آسیبپذیری
بخش قدیمیتر این زنجیره به یک شمارنده اتصال حافظه مشترک بازمیگردد که تقریباً ۳۷ سال پیش از منابع اصلی BSD به ارث رسیده است. این نقص در فیلد shm_nattch نهفته است؛ یک فیلد ۱۶ بیتی علامتدار (Signed 16-bit) که تعداد اتصالات حافظه مشترک را ردیابی میکند. با ایجاد مکرر پروسهها، این شمارنده میتواند از حداکثر مقدار خود (۳۲,۷۶۷) فراتر رفته و به مقادیر منفی Wrap شود.
جزئیات فنی زنجیره حمله
این نقص در حسابداری، شرایط لازم برای ایجاد یک وضعیت Use-After-Free را که توسط Race Condition تحریک میشود، فراهم میکند. مراحل اجرای این اکسپلویت به شرح زیر است:
- آمادهسازی حافظه: مهاجم با نگاشت ۱۲۷ سگمنت حافظه مشترک System V و سپس حذف آنها از طریق
munmap()و ایجاد ۲۵۹ پروسه، شمارنده اتصال را به عدد ۳۲,۶۴۳- میرساند. - کنترل حافظه: برای بهبود کنترل بر روی اشیاء هسته (Kernel Objects)، از آمارهای تخصیص حافظه در
sysctl(KERN_MALLOCSTATS)استفاده میشود تا زمان در دسترس قرار گرفتن صفحات جدید حافظه ردیابی شود. - تزریق کد: یک Race بین حذف سگمنت با استفاده از
IPC_RMIDو اتصال یک پروسه کمکی به یک سگمنت دیگر، مرحله بعدی را فعال میکند.
تجاوز از مکانیزمهای حفاظتی
این حمله برای موفقیت به یک Write خارج از محدوده در ساختار struct ip_moptions نیاز دارد. این عملیات منجر به فساد حافظه در شمارندههای عضویت شده و در نهایت با بستن Socket، باعث تغییر مجوزهای نگاشت حافظه (Mapping Permissions) میشود. این تغییر باعث میشود حافظهای که تحت کنترل مهاجم است، برای Supervisor قابل دسترسی شود.
نکته قابل توجه این است که این اکسپلویت توانسته است مکانیزمهای حفاظتی پیشرفته زیر را دور بزند:
- KARL (Kernel Address Randomized Link)
- SMAP (Supervisor Mode Access Prevention)
- SMEP (Supervisor Mode Execution Prevention)
توصیههای امنیتی
از آنجایی که این یک آسیبپذیری ارتقای سطح دسترسی محلی (LPE) است، مهاجم ابتدا باید توانایی اجرای کد روی سیستم هدف را داشته باشد. مدیران سیستم باید برای رفع این مشکل، بهجای تکیه بر مکانیزمهای حفاظتی، سریعاً اصلاحات (Errata) شماره 018 و 026 را در OpenBSD اعمال کنند.