موضوع مقاله: تصادفی کردن چیدمان فضای آدرس | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # تصادفی کردن چیدمان فضای آدرس | مقدمه: تصادفی‌سازی چیدمان فضای آدرس (ASLR) یک روش امنیت رایانه‌ای است که در جلوگیری از سوء استفاده از آسیب‌پذیری‌های فساد حافظه نقش دارد. | ## بخش 1: تصادفی کردن چیدمان فضای آدرس | به منظور جلوگیری از پرش مطمئن یک حمله‌کننده به مثلاً یک تابع خاص به کار رفته در حافظه، ASLR به صورت تصادفی موقعیت‌های فضای آدرس مناطق دادهٔ کلید یک فرایند را مرتب می‌کند، که شامل پایهٔ قابل اجرا و موقعیت‌های پشته، هیپ و کتابخانه‌ها می‌باشد. تاریخچه پروژه PaX لینوکس اولین بار اصطلاح "ASLR" را ابداع کرد و اولین طراحی و اجرای ASLR را در ژوئیه ۲۰۰۱ به عنوان وصله‌ای برای هسته لینوکس منتشر کرد. این پروژه به عنوان یک پیاده‌سازی کامل دیده می‌شود، که از اکتبر ۲۰۰۲ یک وصله برای تصادفی‌کردن پشته‌های هسته فراهم می‌کند. اولین سیستم عامل جریان اصلی که به‌طور پیش فرض از ASLR پشتیبانی می‌کند، نسخه OpenBSD ۳٫۴ در سال ۲۰۰۳ بود، که به دنبال آن لینوکس در ۲۰۰۵ آمد. مزایا تصادفی‌سازی فضای آدرس، مانع از برخی انواع حملات امنیتی می‌شود و پیش‌بینی آدرس‌های هدف را برای مهاجم دشوارتر می‌کند. به عنوان مثال، مهاجمین که سعی در اجرای حملات بازگشت به libc دارند، باید کد را برای اجرا مکان‌یابی کنند، در حالی که سایر مهاجمین که سعی در اجرای کد شل تزریق شده روی پشته را دارند، ابتدا باید پشته را پیدا کنند. این مقادیر باید حدس زده شوند و یک حدس اشتباه معمولاً به دلیل خرابی برنامه قابل بازیابی نیست. اثربخشی تصادفی‌سازی چیدمان فضای آدرس، براساس احتمال کم حدس‌زدن مکان‌های تصادفی مناطق برای مهاجم است. امنیت با افزایش فضای جستجو افزایش می‌یابد؛ بنابراین، تصادفی‌سازی فضای آدرس زمانی موثرتر است که آنتروپی بیشتری در آفستهای تصادف وجود داشته باشد. آنتروپی با افزایش مقدار فضای حافظه مجازی که در آن تصادفی‌سازی اتفاق می‌افتد یا کاهش مدت زمانی که تصادفی‌سازی اتفاق می‌افتد، افزایش می‌یابد. این دوره به‌طور معمول تا حد ممکن کوچک پیاده‌سازی می‌شود، بنابراین بیشتر سیستم‌ها باید تصادفی‌سازی فضای VMA را افزایش دهند. برای شکست‌دادن تصادفی‌سازی، مهاجمان باید با موفقیت موقعیت‌های همهٔ مناطقی را که می‌خواهند به آن حمله کنند، حدس بزنند. برای مناطق داده مانند پشته و هیپ، جایی که کد سفارشی یا داده‌های مفید بارگذاری می‌شوند، با استفاده از اسلایدهای NOP برای کد یا کپی‌های مکرر داده، به بیش از یک حالت حمله می‌شود. اگر منطقه به‌طور تصادفی به یکی از مقادیر معادل تصادفی تبدیل شود، این امر می‌تواند به موفقیت حمله برسد. در مقابل، مناطق کد مانند پایگاه کتابخانه و جز اصلی قابل اجرا نیاز دارند که دقیقاً کشف شوند. اغلب این نواحی با هم مخلوط می‌شوند، به عنوان مثال فریم‌های پشته روی پشته تزریق می‌شوند و یک کتابخانه به داخل بازمی‌گردد. متغیرهای زیر قابل تعریف هستند: (بیت‌های آنتروپی بالای پشته) (بیت‌های آنتروپی پایه mmap (بیت‌های آنتروپی پایه اصلی قابل اجرا) (بیت‌های آنتروپی پایه هیپ) (بیت‌های حمله‌شده در هر تلاش آنتروپی پشته) (بیت‌های حمله‌شده در هر تلاش آنتروپی پایه mmap (بیت‌های حمله‌شده در هر تلاش آنتروپی اصلی قابل اجرا) (بیت‌های حمله‌شده در هر تلاش آنتروپی پایه هیپ) (تلاش‌های انجام‌شده) (مقدار کل آنتروپی: ) برای محاسبهٔ احتمال موفقیت یک مهاجم، باید تعدادی از تلاش‌ها یعنی را بدون قطع شدن توسط IPS مبتنی بر امضا، اجرای قانون یا عامل دیگر انجام دهیم. ما همچنین باید دریابیم که چه تعداد بیت مربوط هستند و چه تعداد در هر تلاش مورد حمله قرار می‌گیرند، با دست‌کشیدن از هر چند تعداد بیتی که حمله‌کننده باید شکست بدهد. فرمول زیر نشان‌دهنده احتمال موفقیت برای یک مجموعه داده‌شده از تلاش‌های در بیت‌های آنتروپی است. | ## بخش 2: تصادفی کردن چیدمان فضای آدرس | (حدس‌زدن مجزا؛ فضای آدرس پس از هر تلاش دوباره تصادفی می‌شود) (اجبار بی‌رحمانه منظم در رونوشت‌هایی از برنامه با فضای آدرس مشابه) در بسیاری از سیستم‌ها، مقدار می‌تواند در محدودهٔ هزاران یا میلیون‌ها باشد؛ در سیستم‌های ۶۴ بیتی، این اعداد معمولاً حداقل به میلیون‌ها می‌رسد، آقایان هکتور مارکو گیزبرت و اسماعیل ریپول در سال ۲۰۱۴ نشان دادند که چگونه می‌توان ASLR را در سیستم‌های ۶۴ بیتی در کمتر از یک ثانیه تحت شرایط خاص دور زد. برای سیستم‌های ۳۲ بیتی با سرعت رایانه ۲۰۰۴ که ۱۶ بیت برای تصادفی‌سازی آدرس دارد، جناب آقای شچم و همکارانش بیان کردند: «۱۶ بیت تصادفی‌سازی آدرس را می‌توان با حملهٔ جستجوی فراگیر در عرض چند دقیقه مغلوب کرد.» بیانیهٔ نویسندگان بستگی به توانایی چندین بار حمله به هر برنامهٔ مشابه و بدون هیچ تأخیری دارد. یک روش شامل جلوگیری از اجرای یک جز قابل اجرا برای مدت زمان قابل تنظیم در صورتی است که تعداد معینی بار تصادف کرده باشد. Android و احتمالاً سایر سیستم‌ها، تصادفیسازی سفارش بارگذاری کتابخانه را پیاده‌سازی می‌کند، نوعی از ASLR که ترتیب بارگذاری کتابخانه‌ها را تصادفی می‌کند. این تقریب هنوز اندازه‌های متنوع کتابخانه را در نظر نمی‌گیرد، بنابراین در حقیقت آنتروپی واقعی به‌دست‌آمده بالاتر است. توجه داشته باشید که مورد مهاجمی که فقط از یک کتابخانه استفاده می‌کند ساده‌سازی فرمول پیچیده‌تر برای است. (تعداد کتابخانه‌های بارگذاری‌شده) (تعداد کتابخانه‌های مورد استفاده توسط مهاجم) این مقادیر حتی برای مقدار زیادی از به کم میل می‌کند، از همه مهمتر اینکه مهاجمان معمولاً فقط می‌توانند از کتابخانه استاندارد C استفاده کنند و بنابراین می‌توان فرض کرد که است. با این حال، حتی برای تعداد کمی از کتابخانه‌ها، تعداد کمی از بیت‌های آنتروپی در اینجا به‌دست‌آمده‌است؛ بنابراین به‌طور بالقوه ترکیب تصادفی‌سازی سفارش بارگذاری کتابخانه با تصادفی‌سازی آدرس VMA برای به‌دست‌آوردن چند بیت اضافی از آنتروپی جالب است. توجه داشته باشید که این بیت‌های اضافی آنتروپی فقط به کتابخانه‌ها اعمال می‌شود نه سایر بخش‌های mmap . کاهش آنتروپی مهاجمان ممکن است از چندین روش برای کاهش آنتروپی موجود در یک فضای آدرس تصادفی استفاده کنند، اعم از نشت اطلاعاتی ساده گرفته تا حمله به چندین بیت آنتروپی در هر حمله (مانند افشاندن هیپ). با استفاده از آسیب‌پذیری‌های رشته قالب، ممکن است اطلاعات مربوط به چیدمان حافظه به بیرون نشت کند. توابع رشته قالب مانند printf از یک لیست آرگومان متغیر برای انجام کار خود استفاده می‌کنند. به دلیل روشی که معمولاً آرگومان‌ها عبور می‌کنند، هر مشخص‌کنندهٔ قالب به بالای قاب پشته نزدیک‌تر می‌شود. سرانجام، نشانگر بازگشت و نشانگر قاب پشته می‌تواند استخراج شود و آدرس یک کتابخانهٔ آسیب‌پذیر و آدرس یک قاب پشتهٔ شناخته‌شده را نشان دهد. این می‌تواند به‌طور کامل تصادفی‌سازی کتابخانه و پشته را به عنوان مانعی برای مهاجم از بین ببرد. پشته معمولاً باید با ۱۶ بایت تنظیم شود، بنابراین این مقدار کوچکترین فاصله تصادفی‌سازی ممکن است. از یک اسلاید NOP با تزریق کد شل استفاده می‌شود، و رشتهٔ "" را می‌توان با "" برای تعداد دلخواه برش‌ها هنگام تلاش برای بازگشت به سیستم جایگزین کرد. این حداکثر برای بیت اجازه می‌دهد اگر چه یک تخمین محافظه‌کارانه‌تر خواهد بود در اطراف ۸- بیت مربوط به ۴- کیلوبایت از پر کردن پشته. در مورد glibc، تخصیص‌های بالاتر از ۱۲۸ کیلوبایت با استفاده از mmap ایجاد می‌شود و مهاجمین را به ۵ بیت کاهش محدود می‌کند. | ## بخش 3: تصادفی کردن چیدمان فضای آدرس | اگرچه می‌توان تعداد حملات انجام‌شده را کاهش داد، اما اندازه حملات به اندازه کافی افزایش می‌یابد که در برخی شرایط ممکن است این رفتار در سیستم‌های تشخیص نفوذ آشکار شود. محدودیت‌ها آدرس‌های محافظت‌شدهٔ ASLR می‌توانند توسط کانال‌های جانبی مختلف نشت پیدا کرده و ابزار کاهش را حذف کنند. حملات اخیر از اطلاعاتی که توسط جداکنندهٔ بافر پیش‌بینی‌کنندهٔ هدف شاخه CPU یعنی (BTB) یا واحد مدیریت حافظه (MMU) نشت پیدا کرده، استفاده کرده‌است. اندروید اندروید 4.0، تصادفی‌سازی چیدمان فضای آدرس (ASLR) را برای کمک به محافظت از سیستم و برنامه های شخص ثالث از سوء استفاده به دلیل مشکلات مدیریت حافظه، فراهم می‌کند. تصادفی‌سازی سفارش بارگذاری کتابخانه در 26 اکتبر 2015 در پروژه منبع باز آندروید پذیرفته شده و در نسخه اندروید 7.0 گنجانده شده‌است. این مطلب پایه‌ی پشته را در منطقه 8 مگابایت گسترده شامل 524،288 موقعیت ممکن و پایه‌ی mmap در منطقه 1 مگابایت گسترده شامل 256 موقعیت ممکن قرار می‌دهد. جزء قابل اجرای مستقل از موقعیت (PIE) یک آدرس پایه‌ی تصادفی را برای باینری اصلی قابل اجرا پیاده‌سازی می‌کند و از سال 2003 آغاز به کار کرده‌است. این جزء، تصادفی‌بودن آدرس مشابهی را به عنوان عامل اصلی برای کتابخانه‌های مشترک مورد استفاده قرار می‌دهد. تصادفی سازی با تغییر دامنه اجرای آن با استفاده از شخصیت (2) می تواند برای یک فرایند خاص غیرفعال شود. تصادفی‌سازی چیدمان فضای آدرس هسته (KASLR)، پشتیبانی از تصادفی‌سازی فضای آدرس را برای اجرای تصاویر هسته لینوکس با تصادفی‌کردن محل قرار گیری کد هسته در زمان بوت، که در خط اصلی هسته لینوکس در نسخه 3.14 هسته منتشرشده در 30 مارس 2014 ادغام شده، موجب می‌شود. هنگام کامپایل‌کردن، می توان آن را در زمان راه‌اندازی با مشخص‌کردن به عنوان یکی از پارامترهای راه‌اندازی هسته غیرفعال کرد. چندین حمله‌ی کانال جانبی در پردازنده‌های x86 وجود دارد که می‌توانند آدرس‌های هسته را نشت دهند. با این حال، این روش نمی‌تواند در مقابل حملات کانال جانبی با استفاده از تصادم‌ها در ساختارهای پیش‌بینی‌کننده‌ی شاخه محافظت کند. ویندوز مایکروسافت ویندوز ویستا مایکروسافت (منتشرشده در ژانویه 2007) و بعداً ASLR فقط برای اجزای قابل اجرا و کتابخانه‌های پیوند پویا که به طور خاص به فعالسازی ASLR پیوند خورده‌اند فعال شده‌اند. یک منبع امنیتی از سیمانتک خاطرنشان کرد: ASLR در ویندوز ویستای 32 بیتی ممکن است به اندازه انتظار نیرومند نباشد و مایکروسافت یک ضعف را در پیاده‌سازی خود اذعان کرده‌است. در فوریه 2012 اشاره شد که ASLR در سیستمهای 32 بیتی ویندوز قبل از ویندوز 8 می‌تواند در شرایط حافظه‌ی کم اثربخشی‌اش کاهش پیدا کند. OpenBSD 5.3 منتشر شده در 2013، اولین سیستم‌عامل جریان اصلی بود که اجزای قابل اجرای مستقل از موقعیت را به طور پیش فرض بر روی چندین سکوی سخت افزاری فعال کرده و OpenBSD 5.7 باینری‌های استاتیک مستقل از موقعیت (PIE استاتیک) را به طور پیش فرض فعال نمود. در سیستم عامل Mac OS X Lion 10.7 (منتشر شده در ژوئیه 2011)، اپل پیاده‌سازی خود را برای پوشش‌دادن کلیه‌ی برنامه‌ها گسترش داد و اظهار داشت: "تصادفی‌سازی چیدمان فضای آدرس (ASLR) برای همه‌ی برنامه‌ها بهبود یافته‌است. این پیاده‌سازی، اکنون برای برنامه‌های 32 بیتی (همانند محافظت از حافظه‌ی هیپ) در دسترس است و باعث مقاوم‌تر شدن برنامه‌های 64 بیتی و 32 بیتی در برابر حمله می‌شود." از سیستم عامل OS X Mountain Lion 10.8 (منتشر شده در ژوئیه 2012) تا بعد آن، کل سیستم از جمله هسته و همچنین ماژول‌های هسته‌ی قابل بارگذاری و مناطق به طور تصادفی در طول راه‌اندازی سیستم جابجا می‌شوند. | ## جمع‌بندی | بهره‌برداری حمله کانال جانبی با استفاده از بافر هدف شاخه برای دورزدن حفاظت ASLR نشان داده شد.