تصادفی کردن چیدمان فضای آدرس

تصادفی‌سازی چیدمان فضای آدرس (ASLR) یک روش امنیت رایانه‌ای است که در جلوگیری از سوء استفاده از آسیب‌پذیری‌های فساد حافظه نقش دارد. به منظور جلوگیری از پرش مطمئن یک حمله‌کننده به مثلاً یک تابع خاص به کار رفته در حافظه، ASLR به صورت تصادفی موقعیت‌های فضای آدرس مناطق دادهٔ کلید یک فرایند را مرتب می‌کند، که شامل پایهٔ قابل اجرا و موقعیت‌های پشته، هیپ و کتابخانه‌ها می‌باشد.

تاریخچه 
پروژه PaX لینوکس اولین بار اصطلاح "ASLR" را ابداع کرد و اولین طراحی و اجرای ASLR را در ژوئیه ۲۰۰۱ به عنوان وصله‌ای برای هسته لینوکس منتشر کرد. این پروژه به عنوان یک پیاده‌سازی کامل دیده می‌شود، که از اکتبر ۲۰۰۲ یک وصله برای تصادفی‌کردن پشته‌های هسته فراهم می‌کند.

اولین سیستم عامل جریان اصلی که به‌طور پیش فرض از ASLR پشتیبانی می‌کند، نسخه OpenBSD ۳٫۴ در سال ۲۰۰۳ بود، که به دنبال آن لینوکس در ۲۰۰۵ آمد.

مزایا 
تصادفی‌سازی فضای آدرس، مانع از برخی انواع حملات امنیتی می‌شود و پیش‌بینی آدرس‌های هدف را برای مهاجم دشوارتر می‌کند. به عنوان مثال، مهاجمین که سعی در اجرای حملات بازگشت به libc دارند، باید کد را برای اجرا مکان‌یابی کنند، در حالی که سایر مهاجمین که سعی در اجرای کد شل تزریق شده روی پشته را دارند، ابتدا باید پشته را پیدا کنند. در هر دو مورد، سیستم آدرس‌های مربوط به حافظه را از مهاجمین پنهان می‌کند. این مقادیر باید حدس زده شوند و یک حدس اشتباه معمولاً به دلیل خرابی برنامه قابل بازیابی نیست.

اثربخشی 
تصادفی‌سازی چیدمان فضای آدرس، براساس احتمال کم حدس‌زدن مکان‌های تصادفی مناطق برای مهاجم است. امنیت با افزایش فضای جستجو افزایش می‌یابد؛ بنابراین، تصادفی‌سازی فضای آدرس زمانی موثرتر است که آنتروپی بیشتری در آفستهای تصادف وجود داشته باشد. آنتروپی با افزایش مقدار فضای حافظه مجازی که در آن تصادفی‌سازی اتفاق می‌افتد یا کاهش مدت زمانی که تصادفی‌سازی اتفاق می‌افتد، افزایش می‌یابد. این دوره به‌طور معمول تا حد ممکن کوچک پیاده‌سازی می‌شود، بنابراین بیشتر سیستم‌ها باید تصادفی‌سازی فضای VMA را افزایش دهند.

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

متغیرهای زیر قابل تعریف هستند:

  (بیت‌های آنتروپی بالای پشته)
  (بیت‌های آنتروپی پایه mmap())
  (بیت‌های آنتروپی پایه اصلی قابل اجرا)
  (بیت‌های آنتروپی پایه هیپ)
  (بیت‌های حمله‌شده در هر تلاش آنتروپی پشته)
  (بیت‌های حمله‌شده در هر تلاش آنتروپی پایه mmap())
  (بیت‌های حمله‌شده در هر تلاش آنتروپی اصلی قابل اجرا)
  (بیت‌های حمله‌شده در هر تلاش آنتروپی پایه هیپ)
  (تلاش‌های انجام‌شده)
  (مقدار کل آنتروپی: )

برای محاسبهٔ احتمال موفقیت یک مهاجم، باید تعدادی از تلاش‌ها یعنی  را بدون قطع شدن توسط IPS مبتنی بر امضا، اجرای قانون یا عامل دیگر انجام دهیم. در صورت وقوع جستجوی فراگیر، Daemon نمی‌تواند دوباره شروع شود. ما همچنین باید دریابیم که چه تعداد بیت مربوط هستند و چه تعداد در هر تلاش مورد حمله قرار می‌گیرند، با دست‌کشیدن از هر چند تعداد بیتی که حمله‌کننده باید شکست بدهد.

فرمول زیر نشان‌دهنده احتمال موفقیت برای یک مجموعه داده‌شده از تلاش‌های  در بیت‌های آنتروپی  است.

  (حدس‌زدن مجزا؛ فضای آدرس پس از هر تلاش دوباره تصادفی می‌شود)
  (اجبار بی‌رحمانه منظم در رونوشت‌هایی از برنامه با فضای آدرس مشابه)

در بسیاری از سیستم‌ها، مقدار  می‌تواند در محدودهٔ هزاران یا میلیون‌ها باشد؛ در سیستم‌های ۶۴ بیتی، این اعداد معمولاً حداقل به میلیون‌ها می‌رسد، آقایان هکتور مارکو گیزبرت و اسماعیل ریپول در سال ۲۰۱۴ نشان دادند که چگونه می‌توان ASLR را در سیستم‌های ۶۴ بیتی در کمتر از یک ثانیه تحت شرایط خاص دور زد. برای سیستم‌های ۳۲ بیتی با سرعت رایانه ۲۰۰۴ که ۱۶ بیت برای تصادفی‌سازی آدرس دارد، جناب آقای شچم و همکارانش بیان کردند: «۱۶ بیت تصادفی‌سازی آدرس را می‌توان با حملهٔ جستجوی فراگیر در عرض چند دقیقه مغلوب کرد.» بیانیهٔ نویسندگان بستگی به توانایی چندین بار حمله به هر برنامهٔ مشابه و بدون هیچ تأخیری دارد. پیاده‌سازی‌های صحیح ASLR، مانند آن که در ماژول grsecurity گنجانده شده‌است، روش‌های مختلفی را ارائه می‌دهد تا چنین حملات جستجوی فراگیری ناممکن شود. یک روش شامل جلوگیری از اجرای یک جز قابل اجرا برای مدت زمان قابل تنظیم در صورتی است که تعداد معینی بار تصادف کرده باشد.

Android و احتمالاً سایر سیستم‌ها، تصادفیسازی سفارش بارگذاری کتابخانه را پیاده‌سازی می‌کند، نوعی از ASLR که ترتیب بارگذاری کتابخانه‌ها را تصادفی می‌کند. این سیستم آنتروپی بسیار کمی عرضه می‌کند. تقریب تعداد بیت‌های آنتروپی عرضه‌شده در هر کتابخانه مورد نیاز در زیر آمده‌است. این تقریب هنوز اندازه‌های متنوع کتابخانه را در نظر نمی‌گیرد، بنابراین در حقیقت آنتروپی واقعی به‌دست‌آمده بالاتر است. توجه داشته باشید که مهاجمان معمولاً فقط به یک کتابخانه احتیاج دارند. ریاضیات با کتابخانه‌های متعدد پیچیده‌تر است و به خوبی در زیر نشان داده شده‌است. توجه داشته باشید که مورد مهاجمی که فقط از یک کتابخانه استفاده می‌کند ساده‌سازی فرمول پیچیده‌تر برای  است.

  (تعداد کتابخانه‌های بارگذاری‌شده)
  (تعداد کتابخانه‌های مورد استفاده توسط مهاجم)
 

این مقادیر حتی برای مقدار زیادی از  به کم میل می‌کند، از همه مهمتر اینکه مهاجمان معمولاً فقط می‌توانند از کتابخانه استاندارد C استفاده کنند و بنابراین می‌توان فرض کرد که  است. با این حال، حتی برای تعداد کمی از کتابخانه‌ها، تعداد کمی از بیت‌های آنتروپی در اینجا به‌دست‌آمده‌است؛ بنابراین به‌طور بالقوه ترکیب تصادفی‌سازی سفارش بارگذاری کتابخانه با تصادفی‌سازی آدرس VMA برای به‌دست‌آوردن چند بیت اضافی از آنتروپی جالب است. توجه داشته باشید که این بیت‌های اضافی آنتروپی فقط به کتابخانه‌ها اعمال می‌شود نه سایر بخش‌های mmap().

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

با استفاده از آسیب‌پذیری‌های رشته قالب، ممکن است اطلاعات مربوط به چیدمان حافظه به بیرون نشت کند. توابع رشته قالب مانند printf از یک لیست آرگومان متغیر برای انجام کار خود استفاده می‌کنند. مشخص‌کنندگان قالب چیزی را که لیست آرگومان به آن شبیه است، توصیف می‌کنند. به دلیل روشی که معمولاً آرگومان‌ها عبور می‌کنند، هر مشخص‌کنندهٔ قالب به بالای قاب پشته نزدیک‌تر می‌شود. سرانجام، نشانگر بازگشت و نشانگر قاب پشته می‌تواند استخراج شود و آدرس یک کتابخانهٔ آسیب‌پذیر و آدرس یک قاب پشتهٔ شناخته‌شده را نشان دهد. این می‌تواند به‌طور کامل تصادفی‌سازی کتابخانه و پشته را به عنوان مانعی برای مهاجم از بین ببرد.

همچنین می‌توان آنتروپی را در پشته یا هیپ کاهش داد. پشته معمولاً باید با ۱۶ بایت تنظیم شود، بنابراین این مقدار کوچکترین فاصله تصادفی‌سازی ممکن است. در حالی که هیپ باید با صفحه تنظیم شود، به‌طور معمول ۴۰۹۶ بایت. هنگام تلاش برای حمله، می‌توان حملات تکراری را با این فواصل مرتب کرد. از یک اسلاید NOP با تزریق کد شل استفاده می‌شود، و رشتهٔ "" را می‌توان با "" برای تعداد دلخواه برش‌ها هنگام تلاش برای بازگشت به سیستم جایگزین کرد. تعداد بیت‌های حذف شده دقیقاً برابر است با  برای  فاصلهٔ حمله‌شده.

این کاهش به دلیل مقدار داده موجود در پشته یا هیپ محدود است. به عنوان مثال پشته معمولاً محدود به  مگابایت است و بسیار کمتر رشد می‌کند. این حداکثر برای  بیت اجازه می‌دهد اگر چه یک تخمین محافظه‌کارانه‌تر خواهد بود در اطراف ۸- بیت مربوط به ۴- کیلوبایت از پر کردن پشته. از طرف دیگر، هیپ با رفتار تخصیص‌دهندهٔ حافظه محدود شده‌است. در مورد glibc، تخصیص‌های بالاتر از ۱۲۸ کیلوبایت با استفاده از mmap ایجاد می‌شود و مهاجمین را به ۵ بیت کاهش محدود می‌کند. این همچنین یک عامل محدودکننده هنگام اجبار بی‌رحمانه است. اگرچه می‌توان تعداد حملات انجام‌شده را کاهش داد، اما اندازه حملات به اندازه کافی افزایش می‌یابد که در برخی شرایط ممکن است این رفتار در سیستم‌های تشخیص نفوذ آشکار شود.

محدودیت‌ها 
آدرس‌های محافظت‌شدهٔ ASLR می‌توانند توسط کانال‌های جانبی مختلف نشت پیدا کرده و ابزار کاهش را حذف کنند. حملات اخیر از اطلاعاتی که توسط جداکنندهٔ بافر پیش‌بینی‌کنندهٔ هدف شاخه CPU یعنی (BTB) یا واحد مدیریت حافظه (MMU) نشت پیدا کرده، استفاده کرده‌است. هنوز مشخص نیست که آیا این کلاس از حمله ASLR می‌تواند کاهش یابد یا خیر. اگر آن‌ها نتوانند، سود ASLR کاهش یافته یا از بین می‌رود.

پیاده‌سازی‌ها 
چندین سیستم عامل اصلی و همه منظوره ASLR را پیاده‌سازی می‌کنند.

اندروید 
اندروید 4.0، تصادفی‌سازی چیدمان فضای آدرس (ASLR) را برای کمک به محافظت از سیستم و برنامه های شخص ثالث از سوء استفاده به دلیل مشکلات مدیریت حافظه، فراهم می‌کند. پشتیبانی قابل اجرای مستقل از موقعیت در Android 4.1 اضافه شده‌است. Android 5.0 پشتیبانی غیر PIE را کاهش داده و به همه‌ی باینری‌های متصل‌شده‌ی پویا نیاز دارد که مستقل از موقعیت باشد. تصادفی‌سازی سفارش بارگذاری کتابخانه در 26 اکتبر 2015 در پروژه منبع باز آندروید پذیرفته شده و در نسخه اندروید 7.0 گنجانده شده‌است.

DragonFly BSD 
DragonFly BSD دارای پیاده‌سازی ASLR را بر اساس مدل OpenBSD است که در سال 2010 اضافه شده‌است. این پیاده‌سازی به طور پیش فرض خاموش است و می‌تواند با تنظیم مقدار sysctl vm.randomize_mmap به 1 فعال شود.

FreeBSD 
پشتیبانی از ASLR در FreeBSD 13.0 (در حال حاضر در دست توسعه) پدیدار می‌شود. این مورد به صورت پیشفرض غیر فعال است.

iOS در (iPhone ، iPod touch ، iPad) 
اپل ASLR را در iOS 4.3 معرفی کرد (منتشر شده در مارس 2011).

KASLR در iOS 6 معرفی شد. پایه هسته تصادفی‌شده 0x01000000 + (((1 + 0xRR) * 0x00200000) است که در آن 0xRR یک بایت تصادفی از SHA1 (داده‌های تصادفی) تولیدشده توسط iBoot (بارگذارنده راه‌انداز iOS دارای ۲ مرحله) است.

لینوکس 
هسته لینوکس از زمان انتشار نسخه 2.6.12 هسته در ژوئن 2005، به طور پیش فرض شکل ضعیفی از ASLR را فعال کرد. مجموعه وصله‌های PaX و Exec Shield به هسته لینوکس پیاده‌سازی‌های کامل‌تری را ارائه می‌دهند. وصله Exec Shield برای لینوکس 19 بیت آنتروپی پشته را برای دوره‌ی 16 بایت و 8 بیت تصادفی‌سازی پایه mmap در یک دوره 1 صفحه‌ای از 4096 بایت فراهم می‌کند. این مطلب پایه‌ی پشته را در منطقه 8 مگابایت گسترده شامل 524،288 موقعیت ممکن و پایه‌ی mmap در منطقه 1 مگابایت گسترده شامل 256 موقعیت ممکن قرار می‌دهد.

جزء قابل اجرای مستقل از موقعیت (PIE) یک آدرس پایه‌ی تصادفی را برای باینری اصلی قابل اجرا پیاده‌سازی می‌کند و از سال 2003 آغاز به کار کرده‌است. این جزء، تصادفی‌بودن آدرس مشابهی را به عنوان عامل اصلی برای کتابخانه‌های مشترک مورد استفاده قرار می‌دهد. ویژگی PIE فقط برای شبکه‌ای که با Daemonها روبرو می‌شود استفاده می‌گردد - ویژگی PIE را نمی توان همراه با ویژگی prelink برای همان جزء قابل اجرا استفاده کرد. ابزار prelink، تصادفی سازی را در زمان prelink و نه زمان اجرا پیاده‌سازی می‌کند، زیرا در طراحی، prelink مدیریت جابجایی کتابخانه‌ها را قبل از پیونددهنده‌ی پویا انجام می‌دهد، که اجازه می‌دهد تا یک بار برای بسیاری از اجراهای این برنامه جابجایی انجام شود. در نتیجه، تصادفی‌سازی فضای آدرس واقعی هدف از پیش پیوندزدن را شکست می‌دهد.

تصادفی سازی با تغییر دامنه اجرای آن با استفاده از شخصیت (2) می تواند برای یک فرایند خاص غیرفعال شود.

تصادفی‌سازی چیدمان فضای آدرس هسته (KASLR)، پشتیبانی از تصادفی‌سازی فضای آدرس را برای اجرای تصاویر هسته لینوکس با تصادفی‌کردن محل قرار گیری کد هسته در زمان بوت، که در خط اصلی هسته لینوکس در نسخه 3.14 هسته منتشرشده در 30 مارس 2014 ادغام شده، موجب می‌شود. هنگام کامپایل‌کردن، می توان آن را در زمان راه‌اندازی با مشخص‌کردن  به عنوان یکی از پارامترهای راه‌اندازی هسته غیرفعال کرد.

چندین حمله‌ی کانال جانبی در پردازنده‌های x86 وجود دارد که می‌توانند آدرس‌های هسته را نشت دهند.  در اواخر سال 2017، جداسازی جدول صفحه‌ی هسته (KPTI با نام KAISER) برای شکست این حملات ایجاد شد.  با این حال، این روش نمی‌تواند در مقابل حملات کانال جانبی با استفاده از تصادم‌ها در ساختارهای پیش‌بینی‌کننده‌ی شاخه محافظت کند.

ویندوز مایکروسافت 
ویندوز ویستا مایکروسافت (منتشرشده در ژانویه 2007) و بعداً ASLR فقط برای اجزای قابل اجرا و کتابخانه‌های پیوند پویا که به طور خاص به فعالسازی ASLR پیوند خورده‌اند فعال شده‌اند. برای سازگاری، به طور پیش‌فرض برای سایر برنامه‌ها فعال نیست. معمولاً فقط نرم‌افزار قدیمی ناسازگار است و ASLR می‌تواند با ویرایش یک مدخل رجیستری "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Management Memory\MoveImages"، یا با نصب ابزار پیشرفته‌ی تجربه‌ی کاهش مایکروسافت، کاملاً فعال شود.

مکان‌های پشته، هیپ، بلوک محیط فرایند و بلوک محیط نخ نیز به صورت تصادفی هستند. یک منبع امنیتی از سیمانتک خاطرنشان کرد: ASLR در ویندوز ویستای 32 بیتی ممکن است به اندازه انتظار نیرومند نباشد و مایکروسافت یک ضعف را در پیاده‌سازی خود اذعان کرده‌است.

سیستم‌های پیشگیری از نفوذ مبتنی بر میزبان مانند WehnTrust و Ozone نیز ASLR را برای سیستم‌عامل‌های Windows XP و Windows Server 2003 پیشنهاد می‌دهند. WehnTrust منبع باز است. جزئیات کامل در مورد پیاده‌سازی Ozone در دسترس نیست.

در فوریه 2012 اشاره شد که ASLR در سیستمهای 32 بیتی ویندوز قبل از ویندوز 8 می‌تواند در شرایط حافظه‌ی کم اثربخشی‌اش کاهش پیدا کند. اثر مشابهی در همین تحقیق بر روی لینوکس نیز حاصل شده‌بود. کد تست باعث وحشت هسته سیستم Mac OS X 10.7.3 شد، بنابراین رفتار ASLR اش در این سناریو ناشناخته ماند.

NetBSD 
پشتیبانی از ASLR در فضای کاربری در NetBSD 5.0 (منتشر شده در آوریل 2009) و به طور پیش‌فرض در جریان NetBSD در آوریل 2016 فعال شد.

پشتیبانی هسته ASLR از amd64 در ماه اکتبر سال 2017 در جریان NetBSD اضافه شد و NetBSD را به عنوان اولین سیستم BSD برای پشتیبانی از KASLR تبدیل کرد.

OpenBSD 
در سال 2003، OpenBSD به اولین سیستم‌عامل جریان اصلی تبدیل شد که از یک شکل قوی از ASLR پشتیبانی کرده و به طور پیش‌فرض آن را فعال نمود. OpenBSD پشتیبانی از ASLR خود را در سال 2008 با افزودن پشتیبانی برای باینری‌های  PIE  کامل کرد. malloc (3) در OpenBSD 4.4 برای بهبود امنیت با بهره‌گیری از ویژگی‌های ASLR و صفحه‌ی شکاف پیاده‌سازی شده به عنوان بخشی از فراخوان سیستمی mmap در OpenBSD و شناسایی اشکالات پس از استفاده طراحی شد. OpenBSD 5.3 منتشر شده در 2013، اولین سیستم‌عامل جریان اصلی بود که اجزای قابل اجرای مستقل از موقعیت را به طور پیش فرض بر روی چندین سکوی سخت افزاری فعال کرده و OpenBSD 5.7 باینری‌های استاتیک مستقل از موقعیت (PIE استاتیک) را به طور پیش فرض فعال نمود.

سیستم عامل مک 
در سیستم عامل Mac OS X Leopard 10.5 (منتشر شده در اکتبر 2007)، اپل تصادفی‌سازی را برای کتابخانه‌های سیستم معرفی کرد.

در سیستم عامل Mac OS X Lion 10.7 (منتشر شده در ژوئیه 2011)، اپل پیاده‌سازی خود را برای پوشش‌دادن کلیه‌ی برنامه‌ها گسترش داد و اظهار داشت: "تصادفی‌سازی چیدمان فضای آدرس (ASLR) برای همه‌ی برنامه‌ها بهبود یافته‌است. این پیاده‌سازی، اکنون برای برنامه‌های 32 بیتی (همانند محافظت از حافظه‌ی هیپ) در دسترس است و باعث مقاوم‌تر شدن برنامه‌های 64 بیتی و 32 بیتی در برابر حمله می‌شود."

از سیستم عامل OS X Mountain Lion 10.8 (منتشر شده در ژوئیه 2012) تا بعد آن، کل سیستم از جمله هسته و همچنین ماژول‌های هسته‌ی قابل بارگذاری و مناطق به طور تصادفی در طول راه‌اندازی سیستم جابجا می‌شوند.

سولاریس 
ASLR در آغاز سولاریس با Solaris 11.1 (منتشر شده در اکتبر 2012) معرفی شده‌است. ASLR در Solaris 11.1 می‌تواند به صورت گسترده سیستمی، در هر منطقه و یا بر پایه‌ی هر باینری تنظیم شود.

بهره‌برداری 
حمله کانال جانبی با استفاده از بافر هدف شاخه برای دورزدن حفاظت ASLR نشان داده شد. در سال 2017، حمله ای به نام "ASLR⊕Cache" نشان داده شد که می‌توانست ASLR را در یک مرورگر وب با استفاده از JavaScript شکست دهد.

جستارهای وابسته 
 سرریز بافر
 سرریز بافر پشته
 حفاظت از خردشدگی پشته
 بیت NX

منابع

پیوند به بیرون 

 Exploit Mitigation Techniques: an Update After 10 Years  in OpenBSD
 PaX documentation on ASLR
 Comparison of PaX to Exec Shield and W^X
 Address Space Layout Randomization in Windows Vista - Michael Howard's Web Log
 ASLR for Windows 2000/XP/2003 (WehnTrust)
 Bypassing PaX ASLR protection
 On the effectiveness of address space layout randomization
 Test Applications (or libraries) for their ASLR and DEP support
 ASLR Smack & Laugh Reference

امنیت سیستم‌عامل