نمایش عملی دسترسی روت در OpenBSD با زنجیرهکردن یک باگ ۳۷ ساله حافظه مشترک
اخبار داغ فناوری اطلاعات و امنیت شبکهاکسپلویتی که KARL و محافظتهای سختافزاری SMAP و SMEP را دور میزند؛ هر دو نقص پیشتر وصله شدهاند
یک اکسپلویت افزایش سطح دسترسی محلی که تازه منتشر شده، با زنجیرهکردن یک سرریز عدد صحیحِ حدود ۳۷ ساله و یک نقص جداگانه در هسته، به دسترسی روت روی OpenBSD 7.9 دست مییابد. این روش، سازوکار تصادفیسازی آدرس هسته در OpenBSD موسوم به KARL و همچنین محافظتهای سختافزاری SMAP و SMEP را دور میزند.
شرکت امنیتی Calif که این نقصها را کشف و گزارش کرده، پس از آنکه OpenBSD در ماه سپتامبر وصلههای هر دو مشکل را منتشر کرد، یک تحلیل فنی مفصل و کد کامل اثبات مفهوم (PoC) را بهصورت عمومی منتشر کرده است.
وضعیت وصلهها: هر دو نقص برطرف شدهاند
- سرریز عدد صحیح در تابع اتصال حافظه مشترک
shmat(4)در errata 018 (۱۴ سپتامبر) برطرف شده است؛ آن هم بهعنوان یک «اصلاح قابلیت اطمینان» (Reliability Fix)، نه یک اصلاح امنیتی. - نقص استفاده پس از آزادسازی (Use-After-Free) مبتنی بر شمارش ارجاع که حلقه تکمیلکننده زنجیره است، جداگانه در errata 026 (۳۰ سپتامبر) و اینبار بهعنوان اصلاح امنیتی رفع شده است.
هر دو وصله از طریق syspatch در دسترس هستند و تمام معماریها را پوشش میدهند. نسخه OpenBSD 7.8 نیز وصله سرریز عدد صحیح را دریافت کرده است.
تا زمان انتشار خبر، هیچ شناسه CVEای برای این دو نقص ثبت نشده و هیچ شواهدی دال بر استفاده از آنها در حملات واقعی وجود ندارد.
ریشه مشکل: یک متغیر ۱۶ بیتی از سال ۱۹۸۸
نقطه آغاز زنجیره، شمارنده اتصال حافظه مشترک با نام shm_nattch است که بهصورت یک short علامتدار ۱۶ بیتی با حداکثر مقدار ۳۲٬۷۶۷ تعریف شده است. این تعریف در سورسهای اصلی BSD مربوط به سال ۱۹۸۸ وجود داشته؛ OpenBSD این نوع را به ارث برده و هرگز آن را بزرگتر نکرده است.
نکته جالبتوجه این است که همین سرریز، که «نقطه ورود» کل زنجیره است، در طبقهبندی رسمی صرفاً یک اصلاح قابلیت اطمینان به حساب آمده، نه امنیتی.
مراحل کلی زنجیره حمله
بر اساس توضیحات منتشرشده:
- سرریز شمارنده: اکسپلویت ۱۲۷ سگمنت حافظه مشترک را نگاشت میکند و ۲۵۹ فرایند را فورک میکند؛ به این ترتیب شمارنده از حداکثر مقدارش عبور کرده و به ۳۲٬۶۴۳- بازمیگردد.
- شرایط مسابقه و Use-After-Free: شمارش ارجاع خراب باعث میشود هسته حافظهای را آزاد کند که فرایندهای دیگر هنوز از آن استفاده میکنند.
- نوشتن خارج از محدوده: یک نقص جداگانه، شمارندههای عضویت چندپخشی (Multicast) را در هسته بازنویسی میکند. با بسته شدن سوکت مربوطه، کاهشهای حاصل، ورودیهای جدول صفحه (Page-Table) را تغییر میدهند و یک نگاشت حافظه کاربر را به حالت «قابلدسترس برای ناظر (Supervisor)» تبدیل میکنند؛ این کار SMAP و SMEP را دور میزند.
- اجرای کد: اکسپلویت سپس یک اشارهگر تابع را در یک آدرس قابلپیشبینی در هسته بازنویسی میکند تا کد خودش را اجرا کند.
چرا KARL کافی نبود؟
پژوهشگر اندرو گریفیتس توضیح میدهد که KARL با پیوند مجدد (Relink) باینری هسته، هم آدرس توابع و هم آدرس دادهها را تصادفی میکند، اما تخصیصدهندههای حافظه هسته همچنان قطعی (Deterministic) باقی ماندهاند.
هم تخصیصدهنده زمان راهاندازی و هم تخصیصدهنده Best-Fit، فاقد تصادفیسازی آدرس پایه هستند. در نتیجه ساختارهای اوایل راهاندازی — از جمله اشارهگرهای تابع در رابطهای شبکه lo0 و enc0 — در راهاندازیهای مجدد روی همان سختافزار، در آدرسهای یکسان قرار میگیرند. به همین دلیل، این اکسپلویت نیازی به هیچ آسیبپذیری افشای اطلاعات ندارد.
پیشنهادهای Calif برای تقویت امنیت
فراتر از دو وصله ذکرشده، Calif چهار دسته سختسازی را پیشنهاد میکند:
- Safe-unlinking برای لیستهای پیوندی هسته (که پیشتر در FreeBSD و NetBSD استفاده میشود)
- تصادفیسازی نگاشت خودارجاع جدول صفحه
- تصادفیسازی تخصیصدهنده هسته
- بررسی مرزها مبتنی بر کامپایلر
Calif اعلام کرده این نقصها را «در اوایل امسال» به OpenBSD گزارش داده است.
چرا این یافته اهمیت دارد؟
سه نکته در این گزارش برجسته است. نخست، عمر باگ: یک تعریف ساده نوع داده در سال ۱۹۸۸، بیش از سه دهه در یکی از امنترین سیستمعاملهای جهان باقی مانده است؛ سیستمی که بهخاطر رویکرد امنیتی سختگیرانهاش شهرت دارد. این موضوع نشان میدهد حتی پروژههای با بازبینی دقیق نیز میتوانند ریشههای قدیمی و نادیدهگرفتهشدهای داشته باشند.
دوم، دور زدن چندلایه دفاع: با اینکه OpenBSD از KARL، SMAP و SMEP بهره میبرد، زنجیره مذکور با تکیه بر قطعی بودن تخصیصدهندههای حافظه، همه آنها را بدون نیاز به افشای اطلاعات دور میزند؛ یادآوری اینکه تصادفیسازی تنها یک لایه دفاعی است و به تنهایی کافی نیست.
سوم، طبقهبندی وصلهها: اینکه نقطه ورود کل زنجیره ابتدا فقط بهعنوان «اصلاح قابلیت اطمینان» منتشر شد، پرسشی تازه درباره مرز میان باگهای امنیتی و غیرامنیتی در پروژههای بزرگ مطرح میکند؛ باگی که امروز بیضرر به نظر میرسد، میتواند فردا حلقهای از یک زنجیره بهرهبرداری باشد.
توصیههای امنیتی
- مدیران سیستمهای OpenBSD 7.9 و 7.8 باید فوراً با اجرای
syspatchوصلههای errata 018 و errata 026 را اعمال کنند. - با توجه به انتشار عمومی کد کامل اثبات مفهوم، سیستمهایی که چندین کاربر محلی دارند یا میزبان سرویسهایی با حسابهای کمدسترسی هستند، در اولویت وصله قرار دارند؛ چراکه این یک نقص افزایش سطح دسترسی محلی است و مهاجم باید از پیش دسترسی محدودی داشته باشد.
- از قابلیتهایی که به کاربران غیرمعتمد اجازه اجرای کد روی سیستم را میدهند، تا زمان وصله، با احتیاط بیشتری استفاده کنید.
- همزمان با وصله فوری، دسترسی کاربران محلی غیرضروری را بازبینی و محدود کنید.
- در جریان انتشار احتمالی شناسههای CVE و بهروزرسانیهای بعدی OpenBSD و Calif باقی بمانید.
جمعبندی
اکسپلویت منتشرشده توسط Calif نشان میدهد چگونه یک خطای ساده و قدیمی در اندازه یک متغیر — که بیش از سه دهه بدون تغییر مانده بود — میتواند با یک نقص مکمل در هسته ترکیب شود و حتی مجموعه دفاعهای پیشرفته OpenBSD را دور بزند. خبر خوب این است که هر دو نقص پیش از انتشار عمومی جزئیات، وصله شدهاند و هیچ شواهدی از بهرهبرداری واقعی وجود ندارد. با این حال، انتشار کد کامل اثبات مفهوم، فشار را بر مدیران سیستم برای اعمال سریع وصلهها افزایش میدهد؛ و پیشنهادهای سختسازی Calif میتواند راهنمایی برای تقویت بلندمدت امنیت هسته در سیستمهای مشابه باشد.
برچسب ها: KARL, SMAP, امنیت_اطلاعات, امنیت_سایبری, Cyberattack, cybersecurity, حمله سایبری, news