ASLR‫لینوکس‬‫در‬
‫کارکردآن‬‫و‬‫ی‬‫ساز‬ ‫پیاده‬ ‫نحوه‬ ‫ی‬ ‫س‬‫ر‬‫بر‬
‫گلیانی‬ ‫محمد‬
‫خرداد‬1390
‫باش‬ ‫می‬ ‫نویسنده‬ ‫نام‬ ‫و‬‫منبع‬ ‫ذکر‬ ‫به‬ ‫منوط‬ ‫سند‬‫این‬ ‫از‬ ‫ی‬‫بردار‬ ‫کپی‬ ‫گونه‬ ‫هر‬‫د‬
-ASLR‫چیست؟‬
-‫قبل‬‫و‬‫بعد‬‫از‬ASLR.
-ASLR‫چگونه‬‫کار‬‫می‬‫کند؟‬
-‫ی‬ ‫س‬‫ر‬‫بر‬‫س‬‫ر‬‫سو‬‫فایلهای‬ASLR‫در‬‫لینوکس‬.
‫مطالب‬‫فهرست‬
-‫نحوه‬‫پیاده‬‫ی‬‫ساز‬ASLR‫در‬‫پشته‬
-‫ی‬ ‫س‬‫ر‬‫بر‬ASLR‫در‬Heap
-‫ی‬ ‫س‬‫ر‬‫بر‬ASLR‫در‬mmap.
-‫جمع‬‫بندی‬
ASLR
-ASLR‫یا‬‫تصادفی‬‫ی‬‫ساز‬‫فضای‬،‫س‬‫ر‬‫آد‬‫ی‬ ‫ش‬‫و‬‫ر‬‫است‬‫که‬‫در‬،‫آن‬‫فضاهای‬‫کلیدی‬‫نامه‬‫ر‬‫ب‬‫از‬‫حالت‬‫ث‬‫ابت‬‫و‬‫از‬
‫پیش‬‫تعیین‬،‫شده‬‫به‬‫حالت‬‫تصادفی‬‫تغییر‬‫پیدا‬‫می‬‫کند‬.
-‫با‬‫وجود‬ASLR،‫نفوذگر‬‫قادر‬‫به‬‫تعیین‬‫س‬‫ر‬‫آد‬‫برگشت‬‫مناسب‬(‫که‬‫به‬‫کد‬‫دلخواه‬‫او‬‫ه‬‫ر‬‫اشا‬‫کند‬)،‫نخواهد‬
‫بود‬.
-ASLR‫در‬‫لینوکس‬‫از‬‫نسخۀ‬2.6.12(May 2005)‫به‬‫ت‬‫ر‬‫صو‬‫پیش‬‫فرض‬‫در‬‫حد‬‫ضعیفی‬‫ار‬‫ر‬‫ق‬‫داده‬
‫شده‬‫است‬.
-PaX‫و‬exec-shield،‫پیاده‬‫ی‬‫ساز‬‫های‬‫ی‬‫قو‬‫ی‬‫تر‬‫از‬‫این‬‫ش‬‫و‬‫ر‬‫در‬‫لینوکس‬‫ائه‬‫ر‬‫ا‬‫کرده‬‫اند‬.
-‫اگرچه‬‫این‬‫تکنیک‬‫در‬‫کرنل‬‫لینوکس‬‫از‬‫سال‬2005‫به‬‫ت‬‫ر‬‫صو‬‫پیش‬‫فرض‬‫ار‬‫ر‬‫ق‬‫گرفت‬‫ولی‬PaX،‫در‬‫سال‬
2001‫یک‬‫پیاده‬‫ی‬‫ساز‬‫کامل‬‫از‬‫این‬‫تکنیک‬‫ا‬‫ر‬‫ائه‬‫ر‬‫ا‬‫کرده‬‫بود‬.
‫ـز‬‫ـ‬‫ـ‬‫ـ‬‫ـ‬‫ـ‬‫ـ‬‫ـ‬‫ی‬‫ـرر‬‫ـ‬‫ـ‬‫ـ‬‫ـ‬‫س‬
‫حافظه‬ ‫فضای‬ IP
(EIP)
‫آسیب‬ ‫بافر‬
‫پذیر‬
‫از‬‫قبل‬ASLR
‫شلکد‬
‫شلکد‬‫س‬‫ر‬‫آد‬
‫شلکد‬‫س‬‫ر‬‫آد‬
‫شلکد‬‫س‬‫ر‬‫آد‬
‫شلکد‬‫س‬‫ر‬‫آد‬
‫شلکد‬‫س‬‫ر‬‫آد‬
‫شلکد‬‫س‬‫ر‬‫آد‬
‫بافر‬‫واقعی‬‫سایز‬
-‫ن‬‫بدو‬‫استفاده‬‫از‬‫تکنیک‬ASLR،‫س‬‫ر‬‫آد‬‫ع‬‫و‬‫شر‬‫پشته‬‫از‬‫قبل‬‫مشخص‬‫بوده‬‫و‬‫این‬‫ر‬‫بناب‬‫می‬‫توان‬‫س‬‫ر‬‫آد‬
‫ی‬‫ارگیر‬‫ر‬‫ق‬‫شلکد‬‫ا‬‫ر‬‫بدست‬‫د‬‫ر‬‫آو‬.
-‫در‬‫این‬،‫حالت‬‫تنها‬‫کافی‬‫است‬‫س‬‫ر‬‫آد‬‫ع‬‫و‬‫شر‬‫شلکد‬‫ا‬‫ر‬‫بر‬‫ی‬‫و‬‫ر‬EIP‫ی‬ ‫نویس‬‫ز‬‫با‬‫نماییم‬:
‫از‬‫قبل‬ASLR
-‫وضعیت‬‫فضای‬‫س‬‫ر‬‫آد‬‫یک‬‫برنامه‬(cat)‫در‬‫دو‬‫بار‬‫ای‬‫ر‬‫اج‬‫مختلف‬‫قبل‬‫از‬‫فعال‬‫ی‬‫ساز‬ASLR‫به‬‫ت‬‫ر‬‫صو‬
‫یر‬‫ز‬‫می‬‫باشد‬:
‫از‬‫قبل‬ASLR
‫از‬‫قبل‬ASLR
-‫وضعیت‬‫س‬‫ر‬‫آد‬‫ها‬‫در‬‫دو‬‫ا‬‫ر‬‫اج‬‫از‬‫ار‬‫ر‬‫ق‬‫یر‬‫ز‬‫است‬:
‫مکان‬‫حافظه‬‫یکم‬ ‫ای‬‫ر‬‫اج‬‫دوم‬ ‫ای‬‫ر‬‫اج‬
HEAP0x0804e0000x0804e000
Stack0xbffea0000xbffea000
Libc0x00b670000x00b67000
‫خود‬‫ایی‬‫ر‬‫اج‬ ‫فایل‬0x080480000x08048000
‫است‬ ‫یکسان‬ ‫اجرا‬‫دو‬‫هر‬‫در‬ ‫ها‬ ‫س‬‫ر‬‫آد‬
‫سرریز‬ ‫وجود‬‫با‬‫به‬ ،،‫شلکد‬ ‫آدرس‬ ‫نبودن‬ ‫مشخص‬ ‫دلیل‬
‫داد‬‫انتقال‬‫آن‬ ‫به‬ ‫ا‬‫ر‬ ‫ا‬‫ر‬‫اج‬ ‫ل‬‫کنتر‬‫توان‬ ‫نمی‬
‫حافظه‬ ‫فضای‬ IP
(EIP)
‫آسیب‬ ‫بافر‬
‫پذیر‬
‫از‬‫بعد‬ASLR
‫شلکد‬
‫نیست‬‫معلوم‬‫شلکد‬‫آدرس‬
‫نیست‬‫معلوم‬‫شلکد‬‫آدرس‬
‫نیست‬‫معلوم‬‫شلکد‬‫آدرس‬
‫نیست‬‫معلوم‬‫شلکد‬‫آدرس‬
‫نیست‬‫معلوم‬‫شلکد‬‫آدرس‬
‫نیست‬‫معلوم‬‫شلکد‬‫آدرس‬
‫بافر‬‫واقعی‬‫سایز‬
(????????)
-‫با‬‫استفاده‬‫از‬ASLR،‫س‬‫ر‬‫آد‬‫ار‬‫ر‬‫ق‬‫ی‬‫گیر‬،‫پشته‬‫از‬‫قبل‬‫نامشخص‬‫خواهد‬‫بود‬.
-‫به‬‫دلیل‬‫تصادفی‬‫بودن‬‫محل‬‫ار‬‫ر‬‫ق‬‫ی‬‫گیر‬،‫پشته‬‫نمی‬‫توان‬‫س‬‫ر‬‫آد‬‫شلکد‬‫ا‬‫ر‬‫به‬‫هنگام‬‫ی‬‫ار‬‫ز‬‫بارگ‬‫بدست‬‫د‬‫ر‬‫آو‬.
‫از‬‫بعد‬ASLR
-‫وضعیت‬‫فضای‬‫س‬‫ر‬‫آد‬‫یک‬‫برنامه‬(cat)‫در‬‫دو‬‫بار‬‫ای‬‫ر‬‫اج‬‫مختلف‬‫بعد‬‫از‬‫فعال‬‫ی‬‫ساز‬ASLR‫به‬‫ت‬‫ر‬‫صو‬
‫یر‬‫ز‬‫می‬‫باشد‬:
‫از‬‫بعد‬ASLR
‫از‬‫قبل‬ASLR
-‫وضعیت‬‫س‬‫ر‬‫آد‬‫ها‬‫در‬‫دو‬‫ا‬‫ر‬‫اج‬‫از‬‫ار‬‫ر‬‫ق‬‫یر‬‫ز‬‫است‬:
‫مکان‬‫حافظه‬‫یکم‬ ‫ای‬‫ر‬‫اج‬‫دوم‬ ‫ای‬‫ر‬‫اج‬
HEAP0x08dd00000x08606000
Stack0xbf8280000xbfe16000
Libc0x00b670000x00b67000
‫خود‬‫ایی‬‫ر‬‫اج‬ ‫فایل‬0x080480000x08048000
‫س‬‫ر‬‫آد‬HEAP‫و‬STACK‫در‬‫است‬‫متفاوت‬ ‫اجرا‬‫هر‬.
ASLR‫کند؟‬ ‫می‬‫کار‬ ‫چگونه‬
-ASLR،‫مکان‬‫های‬‫مختلف‬‫ار‬‫ر‬‫ق‬‫ی‬‫گیر‬‫یک‬‫برنامه‬‫در‬‫حافظه‬‫ا‬‫ر‬‫تصادفی‬‫می‬‫نماید‬.
-‫با‬‫هر‬‫بار‬‫ای‬‫ر‬‫اج‬،‫برنامه‬‫س‬‫ر‬‫آد‬‫این‬‫مکان‬‫های‬‫حافظه‬‫نسبت‬‫به‬‫ای‬‫ر‬‫اج‬‫قبلی‬‫متفاوت‬‫خواهد‬‫ب‬‫ود‬.
-ASLR،‫در‬‫لینوکس‬‫از‬‫نسخۀ‬2.6.12‫ن‬‫و‬‫در‬‫کرنل‬‫ار‬‫ر‬‫ق‬‫داده‬‫شد‬.
-‫قبل‬‫از‬2005(2.6.12)،ASLR‫توسط‬PaX‫در‬‫سال‬2001‫معرفی‬‫شده‬‫بود‬.
-ASLR‫در‬‫لینوکس‬‫عملیات‬‫تصادفی‬‫ی‬‫ساز‬‫ا‬‫ر‬‫ی‬‫و‬‫ر‬‫بر‬‫ی‬‫باینر‬‫های‬ELF‫انجام‬‫می‬‫دهد‬.‫این‬‫ر‬‫بناب‬‫می‬‫توان‬
‫این‬‫پیاده‬‫ی‬‫ساز‬‫ا‬‫ر‬‫در‬‫توابع‬‫کتابخانه‬‫ای‬ELF(‫و‬‫سایر‬‫توابع‬)‫جستجو‬‫نمود‬.
ASLR‫کند؟‬ ‫می‬‫کار‬ ‫چگونه‬
-‫با‬‫یک‬‫ی‬ ‫س‬‫ر‬‫بر‬‫ی‬
ّ
‫کل‬‫در‬‫فایلهای‬‫س‬‫ر‬‫سو‬،‫لینوکس‬‫می‬‫توان‬‫قسمتهایی‬‫که‬‫تحت‬‫تأثیر‬ASLR‫تصادفی‬
‫ی‬‫ساز‬‫شده‬‫اند‬‫ا‬‫ر‬‫یافت‬:
ASLR‫کند؟‬ ‫می‬‫کار‬ ‫چگونه‬
ASLR‫کند؟‬ ‫می‬‫کار‬ ‫چگونه‬
-‫با‬‫ی‬ ‫س‬‫ر‬‫بر‬‫دقیق‬‫تر‬‫این‬‫س‬‫ر‬‫سو‬‫ها‬‫می‬‫توان‬‫اطالعات‬‫ی‬‫بیشتر‬‫در‬‫د‬‫ر‬‫مو‬‫نحوۀ‬‫تصادفی‬‫ی‬‫ساز‬‫آ‬‫س‬‫ر‬‫د‬‫ها‬‫در‬
ASLR‫بدست‬‫د‬‫ر‬‫آو‬:
-‫در‬‫تی‬‫ر‬‫صو‬‫که‬‫سیستم‬‫فاقد‬MMU‫باشد‬(‫نظیر‬‫برخی‬‫سیستم‬‫های‬embedded)،‫تعریف‬
‫تصادفی‬‫ی‬‫ساز‬‫در‬‫فایل‬include/mm.h‫ت‬‫ر‬‫صو‬‫می‬‫پذیرد‬.
-MMU‫یک‬‫واحد‬‫سخت‬‫ی‬‫ار‬‫ز‬‫اف‬‫است‬‫که‬‫در‬‫اکثر‬‫سیستم‬‫ها‬‫وجود‬‫د‬‫ر‬‫دا‬.
-‫م‬‫ز‬‫ال‬‫به‬‫ذکر‬‫است‬‫که‬‫در‬‫سیستم‬‫های‬‫ی‬ ‫لینوکس‬(‫آخرین‬‫نسخه‬2.6.39)،‫قابلیت‬‫استفاده‬‫از‬MMU
‫به‬‫ت‬‫ر‬‫صو‬‫پیش‬‫فرض‬‫فعال‬‫می‬‫باشد‬.
-‫برد‬‫ر‬‫کا‬MMU‫یا‬‫واحد‬‫مدیریت‬‫حافظه‬‫در‬‫سیستم‬‫های‬،‫ی‬‫ز‬‫و‬‫امر‬‫ل‬‫کنتر‬‫ی‬ ‫دسترس‬CPU‫به‬‫واحد‬
‫حافظه‬‫است‬‫که‬‫این‬‫امر‬‫شامل‬‫تبدیل‬‫س‬‫ر‬‫آد‬‫ی‬‫مجاز‬‫به‬‫س‬‫ر‬‫آد‬‫فیزیکی‬‫و‬...‫می‬‫باشد‬.
ASLR‫کند؟‬ ‫می‬‫کار‬ ‫چگونه‬
ASLR‫کند؟‬ ‫می‬‫کار‬ ‫چگونه‬
-‫ی‬‫بسیار‬‫از‬‫تنظیمات‬،‫ق‬‫فو‬‫ل‬‫کنتر‬‫هایی‬‫است‬‫که‬‫بسته‬‫به‬‫نحوه‬‫کامپایل‬‫کرنل‬‫انجام‬‫می‬‫شود‬:
ASLR‫کند؟‬ ‫می‬‫کار‬ ‫چگونه‬
ASLR‫کند؟‬ ‫می‬‫کار‬ ‫چگونه‬
-‫یکی‬‫از‬‫این‬‫د‬‫ر‬‫موا‬‫در‬‫فایل‬personality.h‫قابل‬‫تنظیم‬‫است‬.
-‫این‬،‫مقدار‬‫امکان‬‫غیر‬‫فعال‬‫ی‬‫ساز‬‫عملیات‬‫تصادفی‬‫در‬‫د‬‫ر‬‫مو‬‫تابع‬mmap()‫ا‬‫ر‬‫اهم‬‫ر‬‫ف‬‫می‬‫نماید‬:
ASLR‫کند؟‬ ‫می‬‫کار‬ ‫چگونه‬
-‫فایل‬/include/linux/sysctl.h‫ی‬‫حاو‬‫اطالعات‬‫مربوط‬‫به‬‫اخوانی‬‫ر‬‫ف‬‫تابع‬sysctl()‫می‬‫باشد‬.
-‫این‬‫تابع‬‫قابلیت‬‫تنظیم‬‫یک‬‫ی‬‫سر‬‫امتر‬‫ر‬‫پا‬‫های‬‫فضای‬‫کرنل‬‫ا‬‫ر‬‫از‬‫فضای‬‫ی‬‫بر‬‫ر‬‫کا‬‫اهم‬‫ر‬‫ف‬‫می‬‫نم‬‫اید‬.
-‫از‬‫جمله‬‫این‬‫قابلیت‬،‫ها‬‫قابلیت‬KERN_RANDOMIZE‫می‬‫باشد‬‫که‬‫مربوط‬‫به‬‫تصادفی‬‫ی‬‫ساز‬‫فضای‬
‫حافظۀ‬‫ی‬‫مجاز‬‫سه‬‫و‬‫پر‬‫است‬.
-‫ای‬‫ر‬‫ب‬‫سیستم‬‫های‬ISA UniCore‫و‬SoCPKUnity،‫تصادفی‬‫ی‬‫ساز‬heap،‫در‬‫فایلهای‬
arch/unicore32/kernel/process.c‫و‬arch/unicore32/include/asm/elf.h
‫انجام‬‫می‬‫شود‬.
ASLR‫کند؟‬ ‫می‬‫کار‬ ‫چگونه‬
-‫این‬‫ر‬‫بناب‬‫با‬‫ی‬ ‫س‬‫ر‬‫بر‬‫فایلهایی‬‫که‬‫در‬‫آنها‬‫از‬‫توابع‬‫تصادفی‬‫ی‬‫ساز‬‫استفاده‬،‫شده‬‫می‬‫توان‬‫ب‬‫ه‬‫نحوه‬‫تصادفی‬
‫ی‬‫ساز‬‫در‬‫های‬‫ر‬‫ساختا‬‫مختلف‬‫ی‬ ‫لینوکس‬‫پی‬‫برد‬.
-‫نظر‬‫به‬‫اوانی‬‫ر‬‫ف‬‫استفاده‬‫از‬‫این‬‫نوع‬‫توابع‬‫و‬‫استفاده‬‫از‬‫آن‬‫در‬‫ی‬‫معمار‬‫های‬‫مختلف‬(ARM, Mips,
tile‫و‬...)‫به‬‫ی‬ ‫س‬‫ر‬‫بر‬‫فایلهای‬‫د‬‫ر‬‫مو‬‫توجه‬‫در‬x86‫بسنده‬‫می‬‫نماییم‬.
-‫بخش‬‫های‬‫مختلف‬‫عملیات‬‫تصادفی‬‫ی‬‫ساز‬‫در‬ASLR‫در‬‫لینوکس‬x86،‫از‬‫ار‬‫ر‬‫ق‬‫یر‬‫ز‬‫است‬:
-‫تصادفی‬‫ی‬‫ساز‬‫در‬‫پشته‬.
-‫تصادفی‬‫ی‬‫ساز‬‫در‬‫تابع‬mmap().
-‫تصادفی‬‫ی‬‫ساز‬‫در‬heap.
-‫بدین‬‫تیب‬‫ر‬‫ت‬‫هر‬‫بخش‬‫ی‬‫دیگر‬‫که‬‫از‬‫د‬‫ر‬‫موا‬‫ق‬‫فو‬‫استفاده‬‫نماید‬‫نیز‬‫تصادفی‬‫خواهد‬‫شد‬.
ASLR‫پشته‬‫در‬
-‫تصادفی‬‫ی‬‫ساز‬،‫پشته‬‫به‬‫هنگام‬‫ی‬‫ار‬‫ز‬‫بارگ‬‫فایل‬‫ها‬‫در‬‫حافظه‬‫ت‬‫ر‬‫صو‬‫می‬‫پذیرد‬.
-‫ی‬‫ار‬‫ز‬‫بارگ‬‫ی‬‫باینر‬‫ها‬‫توسط‬‫تابع‬load_elf_binary()‫ت‬‫ر‬‫صو‬‫می‬‫پذیرد‬‫که‬‫در‬‫فایل‬
fs/binfmt_elf.c‫تعریف‬‫شده‬.
ASLR‫پشته‬‫در‬
-‫در‬‫این‬،‫تابع‬‫پس‬‫از‬‫تنظیم‬‫نمودن‬‫یک‬‫ی‬‫سر‬‫فلگ‬،‫ها‬‫از‬‫توابع‬‫ی‬‫دیگر‬‫جهت‬‫تصادفی‬‫ی‬‫ساز‬‫پش‬‫ته‬‫استفاده‬
‫شده‬‫است‬:
Current:‫اشاره‬ ‫که‬ ‫است‬ ‫ماکرو‬ ‫یک‬
‫بر‬ ‫ی‬‫جار‬ ‫پروسۀ‬ ‫اکچر‬‫ر‬‫است‬ ‫به‬ ‫ی‬‫گر‬‫می‬
‫گرداند‬.
‫ی‬‫جار‬ ‫پروسۀ‬ ‫مشخصات‬ ‫در‬ ‫که‬ ‫صورتی‬ ‫در‬(include/linux/personality.h)‫مقدار‬،ADDR_NO_RANDOMIZE
‫متغیر‬ ‫و‬ ‫باشد‬ ‫نشده‬ ‫تنظیم‬randomize_va_space‫ی‬‫ساز‬‫تصادفی‬ ‫فلگ‬ ‫آنگاه‬،‫نباشد‬ ‫صفر‬ ‫نیز‬(PF_RANDOMIZE)‫نیز‬
‫شد‬‫خواهد‬ ‫ست‬ ‫پروسه‬ ‫این‬ ‫مورد‬ ‫در‬‫ها‬ ‫فلگ‬ ‫سایر‬‫بر‬ ‫عالوه‬.
‫و‬ ‫باشد‬ ‫نداشته‬‫ثابت‬ ‫های‬ ‫آدرس‬ ‫به‬ ‫ی‬‫نیاز‬ ‫پروسه‬ ‫اگر‬،‫تر‬ ‫ساده‬‫عبارت‬ ‫به‬ASLR‫می‬ ‫ی‬‫ساز‬‫تصادفی‬ ،‫پروسه‬ ‫آدرس‬‫فضای‬ ،‫باشد‬ ‫فعال‬
‫شود‬.
ASLR‫پشته‬‫در‬
-‫سپس‬‫با‬‫اخوانی‬‫ر‬‫ف‬‫تابع‬setup_arg_pages()‫و‬‫پاس‬‫دادن‬‫س‬‫ر‬‫آد‬ToS‫به‬،‫آن‬‫فلگ‬‫ها‬‫و‬‫ز‬‫مجو‬،‫ها‬
‫به‬‫ز‬‫و‬‫ر‬‫سانی‬‫ر‬،‫شده‬‫پشته‬‫به‬‫دلخواه‬‫ی‬‫ار‬‫ز‬‫جایگ‬‫مجدد‬‫شده‬‫و‬‫ی‬‫مقدار‬‫فضای‬‫اضافه‬‫به‬‫آن‬‫د‬‫و‬‫افز‬‫ه‬‫می‬
‫شود‬.
-‫در‬‫همین‬‫مرحله‬‫از‬‫تابع‬randomize_stack_top()‫استفاده‬‫می‬‫شود‬‫تا‬‫محل‬‫ار‬‫ر‬‫ق‬‫ی‬‫گیر‬‫پشته‬‫به‬
‫ت‬‫ر‬‫صو‬‫تصادفی‬‫انتخاب‬‫شود‬.
ASLR‫پشته‬‫در‬
-‫عملیات‬‫تصادفی‬‫ی‬‫ساز‬‫در‬‫تابع‬randomize_stack_top()(‫که‬‫در‬‫همین‬‫فایل‬‫یف‬‫ر‬‫تع‬‫شده‬‫است‬)
‫انجام‬‫می‬‫شود‬.
-‫مقدار‬‫برگشتی‬‫توسط‬‫این‬،‫تابع‬‫ت‬‫ر‬‫عبا‬‫است‬‫از‬‫یک‬‫س‬‫ر‬‫آد‬‫که‬‫این‬‫س‬‫ر‬‫آد‬‫س‬‫ر‬‫آد‬‫ار‬‫ر‬‫ق‬‫ی‬‫گیر‬‫پشته‬‫قل‬‫مداد‬‫خواهد‬
‫شد‬.
-‫در‬‫این‬،‫تابع‬‫محل‬‫ار‬‫ر‬‫ق‬‫ی‬‫گیر‬،‫پشته‬‫به‬‫ت‬‫ر‬‫صو‬‫تصادفی‬‫به‬‫ۀ‬‫ز‬‫اندا‬random_variable‫جابجا‬‫می‬‫شود‬.
‫ها‬ ‫آدرس‬ ‫با‬‫جهت‬ ‫هم‬ ‫پشته‬ ‫اگر‬‫ی‬‫مقدار‬ ،‫کند‬ ‫رشد‬‫حافظه‬random_variable‫ی‬ ‫آدرس‬ ‫به‬
‫توسط‬ ‫که‬PAGE_ALIGN‫شود‬‫می‬ ‫اضافه‬ ،‫شود‬‫می‬ ‫برگردانده‬.‫این‬ ‫صورت‬ ‫این‬ ‫غیر‬ ‫در‬ ‫و‬
‫آدرس‬ ‫از‬‫مقدار‬PAGE_ALIGN‫شود‬‫می‬ ‫کم‬(‫های‬ ‫ی‬‫معمار‬ ‫برخی‬ ‫نظیر‬RISC.)
PAGE_ALIGN‫به‬ ‫ا‬‫ر‬‫گر‬‫اشاره‬ ،
‫ابتدای‬PAGE‫نمای‬‫می‬ ‫تنظیم‬‫بعدی‬‫د‬
ASLR‫پشته‬‫در‬
-‫نحوه‬‫تخصیص‬‫مقدار‬‫به‬‫متغیر‬random_variable‫در‬‫این‬،‫تابع‬‫با‬‫استفاده‬‫از‬‫تابع‬‫کمکی‬
get_random_int()‫و‬‫سپس‬‫شیفت‬‫دادن‬‫این‬‫س‬‫ر‬‫آد‬‫به‬‫ان‬‫ز‬‫می‬PAGE_SHIFT‫انجام‬‫می‬‫شود‬.
-PAGE_SHIFT‫د‬‫ر‬‫مو‬‫در‬x86‫ابر‬‫ر‬‫ب‬12‫است‬‫مشاهد‬‫قابل‬‫یر‬‫ز‬ ‫فایل‬‫در‬‫که‬ ‫است‬‫شده‬ ‫تعریف‬:
(arch/x86/include/asm/page_types.h.)
‫از‬ ‫آمده‬ ‫بدست‬‫مقدار‬get_random_int()‫مقدار‬ ‫با‬STACK_RND_MASK‫جمع‬
‫اولیۀ‬‫مقدار‬ ‫نتیجه‬ ‫و‬ ‫شده‬‫منطقی‬random_variable‫دهد‬‫می‬ ‫تشکیل‬ ‫ا‬‫ر‬(‫شیفت‬‫از‬ ‫قبل‬.)
STACK_RND_MASK‫شده‬ ‫دهی‬‫مقدار‬ ‫تابع‬ ‫تعریف‬ ‫از‬ ‫قبل‬ ‫نیز‬(‫ثابت‬ ‫مقدار‬)‫مشخص‬ ‫و‬
‫باشد‬ ‫می‬ ‫ی‬‫ساز‬‫تصادفی‬ ‫در‬ ‫ارزشمند‬ ‫های‬ ‫بیت‬ ‫کنندۀ‬.
PAGE_SHIFT‫چیست؟‬
-‫س‬‫ر‬‫آد‬‫های‬‫حافظه‬‫ای‬‫که‬‫در‬‫سطح‬‫کرنل‬‫د‬‫ر‬‫مو‬‫استفاده‬‫ار‬‫ر‬‫ق‬‫می‬،‫گیرد‬‫نظر‬‫به‬‫استفاده‬‫از‬‫ویژگ‬‫ی‬
PAGING،‫بی‬‫ر‬‫مضا‬‫از‬‫حجم‬PAGE‫ها‬‫می‬‫باشد‬.
-‫حجم‬PAGE‫ها‬‫در‬asm/page.h‫قابل‬‫تنظیم‬‫است‬(‫متغیر‬PAGE_SIZE).
-‫س‬‫ر‬‫آد‬‫های‬‫د‬‫ر‬‫مو‬‫استفاده‬‫در‬،‫کرنل‬‫شامل‬‫دو‬‫قسمت‬‫پر‬‫ش‬‫ز‬‫ار‬‫و‬‫کم‬‫ش‬‫ز‬‫ار‬‫می‬‫باشد‬.
-‫قسمت‬‫پر‬،‫ش‬‫ز‬‫ار‬‫به‬‫س‬‫ر‬‫آد‬PAGE‫و‬‫قسمت‬‫کم‬‫ش‬‫ز‬‫ار‬‫به‬‫آفست‬‫ن‬‫و‬‫در‬PAGE‫تخصیص‬‫می‬‫یابد‬.
-‫با‬‫شیفت‬‫دادن‬‫این‬‫س‬‫ر‬‫آد‬‫ها‬‫و‬‫ن‬‫و‬‫بر‬‫ی‬‫یز‬‫ر‬‫آفست‬PAGE،‫ی‬‫مقدار‬‫که‬‫باقی‬‫خواهد‬،‫ماند‬‫ه‬‫ر‬‫اشا‬‫ی‬‫گر‬‫به‬
PAGE‫می‬‫باشد‬.
-PAGE_SHIFT،‫ان‬‫ز‬‫می‬‫این‬‫شیفت‬‫ا‬‫ر‬‫در‬‫سیستم‬‫مشخص‬‫می‬‫کند‬.
PAGE_SHIFT‫چیست؟‬
B C D E F G H I J K L M N O P QA
PAGE_SIZE = 4096 = 212‫با‬12‫بیت‬‫می‬‫توان‬‫ن‬‫و‬‫در‬PAGE‫ا‬‫ر‬‫س‬‫ر‬‫آد‬‫دهی‬‫نمود‬.
‫ی‬ ‫س‬‫ر‬‫آد‬‫که‬‫به‬‫خود‬PAGE‫ه‬‫ر‬‫اشا‬‫می‬‫کند‬ ‫س‬‫ر‬‫آد‬‫محتویات‬‫ن‬‫و‬‫در‬PAGE
0 0 0 0 0 0 0 0 0 0 0 A B C D E0
‫با‬12‫آدرس‬ ،‫است‬‫ر‬‫سمت‬ ‫به‬‫شیفت‬‫بیت‬PAGE‫آورد‬‫خواهیم‬ ‫بدست‬‫ا‬‫ر‬
PAGE_SHIFT‫ابر‬‫ر‬‫ب‬12‫باشد‬ ‫می‬.
ASLR‫پشته‬‫در‬
-‫تابع‬‫در‬‫ی‬‫ساز‬‫تصادفی‬‫نحوه‬get_random_int()‫فایل‬ ‫در‬‫که‬drivers/char/random.c
‫است‬‫یر‬‫ز‬‫ار‬‫ر‬‫ق‬ ‫از‬‫شده‬ ‫تعریف‬:
‫ایۀ‬‫ر‬‫آ‬‫تعریف‬ ‫از‬‫پس‬HASH‫آن‬‫آدرس‬ ‫تنظیم‬ ‫و‬(‫ایۀ‬‫ر‬‫آ‬‫آدرس‬
CPU)‫تابع‬ ‫از‬ ‫استفاده‬ ‫با‬ ،get_keyptr()‫متغیر‬ ،keyptr
‫از‬ ‫استفاده‬ ‫با‬‫سپس‬ ‫و‬‫شده‬ ‫اولیه‬ ‫دهی‬‫مقدار‬‫آریۀ‬‫آدرس‬HASH
‫اه‬‫ر‬‫هم‬‫به‬PID‫ی‬‫جار‬‫پروسه‬‫و‬‫پردازنده‬‫های‬‫سیکل‬ ‫تعداد‬‫و‬
‫سیستم‬ ‫بودن‬‫فعال‬‫زمان‬‫مدت‬‫خانه‬‫در‬ ‫تصادفی‬‫مقدار‬ ‫یک‬،‫ل‬‫او‬
‫ایۀ‬‫ر‬‫آ‬HASH‫تابع‬ ‫از‬ ‫استفاده‬ ‫با‬‫سپس‬ ‫و‬‫شده‬ ‫داده‬‫ار‬‫ر‬‫ق‬
half_md4_transform()‫تر‬ ‫تصادفی‬‫هم‬‫باز‬‫مقدار‬ ‫این‬
‫شود‬ ‫می‬ ‫بازگردانده‬‫و‬ ‫شده‬
ASLR‫پشته‬‫در‬
-‫تابع‬half_md4_transform()‫فایل‬ ‫در‬‫که‬lib/halfmd4.c‫پیاده‬ ‫یک‬ ،‫است‬ ‫شده‬ ‫یف‬‫ر‬‫تع‬
‫یتم‬‫ر‬‫الگو‬‫از‬‫مختصر‬‫ی‬‫ساز‬MD4‫ر‬‫دو‬‫سه‬ ‫در‬‫که‬‫باشد‬‫می‬8‫های‬‫عملگر‬ ‫از‬‫استفاده‬ ‫با‬ ‫و‬ ‫تایی‬XOR‫و‬
AND‫نماید‬‫می‬‫اعمال‬‫خود‬‫ودی‬‫ر‬‫و‬ ‫ی‬‫و‬‫ر‬‫بر‬‫ا‬‫ر‬‫یتم‬‫ر‬‫الگو‬ ‫این‬.
ASLR‫پشته‬‫در‬
-‫تیب‬‫ر‬‫ت‬ ‫بدین‬ASLR‫از‬‫استفاده‬ ‫با‬ ‫پشته‬ ‫در‬4‫تابع‬ ‫از‬‫استفاده‬ ‫با‬‫و‬‫اصلی‬ ‫مقدار‬MD4(‫ی‬‫ساز‬ ‫پیاده‬ ‫یک‬
‫تابع‬ ‫این‬ ‫از‬‫مختصر‬)‫شود‬ ‫می‬‫انجام‬.
-‫از‬‫تند‬‫ر‬‫عبا‬‫اصلی‬‫مقادیر‬ ‫این‬:
-‫شده‬ ‫ا‬‫ر‬‫اج‬‫سۀ‬‫و‬‫پر‬‫ه‬‫ر‬‫شما‬.
-‫نده‬‫ز‬‫پردا‬‫های‬‫سیکل‬ ‫تعداد‬.
-‫سیستم‬ ‫بودن‬‫شن‬‫و‬‫ر‬‫مان‬‫ز‬ ‫مدت‬.
-‫ابتدایی‬‫ی‬‫ساز‬ ‫پیاده‬ ‫این‬ASLR‫نسخۀ‬ ‫از‬ ‫لینوکس‬‫کرنل‬ ‫در‬2.6.12‫شد‬ ‫داده‬‫ار‬‫ر‬‫ق‬.
-‫گرفتن‬‫نظر‬‫ر‬‫د‬‫با‬ ‫این‬‫ر‬‫بناب‬STACK_RND_MASK‫د‬‫ر‬‫موا‬‫از‬‫شده‬ ‫تولید‬‫تصادفی‬‫مقدار‬‫جی‬‫و‬‫خر‬‫با‬‫که‬
‫شود‬ ‫می‬‫ماسک‬،‫ق‬‫فو‬(‫ر‬.‫ک‬.Binfmt_elf.c)‫پشته‬‫ی‬‫ساز‬‫تصادفی‬‫که‬‫گرفت‬‫نتیجه‬‫چنین‬ ‫توان‬‫می‬ ،‫در‬
ASLR‫ی‬‫و‬‫ر‬‫بر‬،‫لینوکس‬‫فرض‬ ‫پیش‬ِ11‫و‬ ‫شده‬ ‫انجام‬‫بیت‬2047‫ی‬‫گیر‬‫ار‬‫ر‬‫ق‬ ‫جهت‬‫مختلف‬‫تصادفی‬‫س‬‫ر‬‫آد‬
‫شود‬ ‫می‬ ‫تولید‬‫پشته‬.
ASLR‫در‬heap
-‫این‬‫پیاده‬‫ی‬‫ساز‬‫نیز‬‫هنگام‬‫ی‬‫ار‬‫ز‬‫بارگ‬‫فایلهای‬‫ی‬‫باینر‬‫انجام‬‫می‬‫شود‬‫که‬‫در‬‫فایل‬fs/binfmt_elf.c
‫می‬‫توان‬‫جزئیات‬‫آن‬‫ا‬‫ر‬‫مشاهده‬‫نمود‬.
‫ی‬ ‫بررس‬ ‫و‬‫پروسه‬ ‫های‬‫فلگ‬‫کردن‬‫چک‬ ‫از‬‫پس‬
PF_RANDOMIZE‫گزینۀ‬‫که‬‫صورتی‬ ‫در‬،
randomize_va_space،‫باشد‬ ‫شده‬ ‫تنظیم‬‫نیز‬
‫شروع‬‫آدرس‬heap‫تابع‬‫از‬ ‫استفاده‬ ‫با‬ ،
arch_randomize_brk()‫شد‬‫خواهد‬ ‫داده‬‫تخصیص‬.
ASLR‫در‬heap
-‫تصادفی‬‫ی‬‫ساز‬heap‫در‬‫تابع‬arch_randomize_brk()‫که‬‫در‬‫فایل‬
arch/x86/kernel/process.c‫تعریف‬،‫شده‬‫انجام‬‫می‬‫پذیرد‬:
‫تابع‬‫از‬ ‫تابع‬‫این‬ ‫در‬randomize_range‫شروع‬‫آدرس‬‫ی‬‫ساز‬ ‫تصادفی‬‫منظور‬ ‫به‬heap‫شود‬‫می‬ ‫استفاده‬.
ASLR‫در‬heap
-‫تابع‬randomize_range()‫در‬‫فایل‬drivers/char/random.c‫یف‬‫ر‬‫تع‬‫شده‬‫و‬‫یک‬
‫س‬‫ر‬‫آد‬‫تصادفی‬‫ی‬‫ساز‬‫شده‬‫ا‬‫ر‬‫بر‬‫می‬‫گرداند‬.
‫از‬ ،‫پشته‬‫های‬‫آدرس‬‫ی‬‫ساز‬ ‫تصادفی‬ ‫همانند‬‫نیز‬ ‫تابع‬‫این‬ ‫در‬PAGE_ALIGN‫و‬get_random_int()‫نتیجه‬ ‫در‬‫که‬ ‫شده‬ ‫استفاده‬
‫گردد‬‫می‬ ‫بر‬ ‫تصادفی‬‫آدرس‬‫یک‬.
ASLR‫در‬mmap()
-‫تنظیمات‬‫تصادفی‬‫ی‬‫ساز‬mmap‫در‬ASLR،‫بسته‬‫به‬‫نده‬‫ز‬‫پردا‬‫د‬‫ر‬‫مو‬،‫استفاده‬‫در‬‫یرشاخۀ‬‫ز‬
‫مربوطه‬‫در‬‫شاخۀ‬arch‫ار‬‫ر‬‫ق‬‫خواهد‬‫گرفت‬.
‫تابع‬arch_pick_mmap_layout()‫پروسه‬ ‫هر‬‫ای‬‫ر‬‫ب‬‫ی‬‫مجاز‬ ‫حافظۀ‬‫ایجاد‬‫محض‬‫به‬
‫دهد‬‫می‬ ‫انجام‬‫ا‬‫ر‬‫مربوطه‬ ‫تنظیمات‬ ‫و‬ ‫شده‬ ‫زده‬‫صدا‬
‫پروس‬ ‫های‬‫امتر‬‫ر‬‫پا‬ ‫و‬ ‫ها‬‫فلگ‬ ‫برخی‬‫به‬ ‫بسته‬‫ۀ‬
،‫تابع‬‫این‬ ،‫شده‬ ‫اخوانده‬‫ر‬‫ف‬
mmap_legacy_base()‫یا‬‫و‬
mmap_base()‫نماید‬‫می‬ ‫اخوانی‬‫ر‬‫ف‬‫ا‬‫ر‬.
ASLR‫در‬mmap()
‫ب‬ ‫نشده‬‫تعریف‬‫پروسه‬‫این‬ ‫ای‬‫ر‬‫ب‬‫منابع‬‫از‬ ‫استفاده‬ ‫در‬‫محدودیتی‬ ‫که‬‫صورتی‬ ‫در‬‫همچنین‬ ‫و‬ ‫پروسه‬‫مورد‬ ‫در‬‫ی‬‫سازگار‬ ‫فلگ‬‫ی‬ ‫بررس‬ ‫با‬ ،‫ق‬‫فو‬‫تابع‬،‫اشد‬‫ا‬‫ر‬‫ی‬‫جار‬ ‫پروسۀ‬
‫ی‬‫سازگار‬‫پیش‬‫رعایت‬ ‫به‬‫ی‬‫نیاز‬ ‫که‬‫گیرد‬‫می‬ ‫نظر‬ ‫در‬ ‫جدید‬‫های‬ ‫پروسه‬ ‫جزو‬(‫ی‬‫ساز‬ ‫تصادفی‬‫جهت‬)‫داشت‬‫نخواهد‬.
ASLR‫در‬mmap()
‫که‬‫صورتی‬ ‫در‬،‫توابع‬‫این‬‫از‬‫هریک‬ ‫اخوانی‬‫ر‬‫ف‬‫صورت‬ ‫در‬‫بنا‬
‫تابع‬‫از‬ ،‫باشد‬‫ها‬‫آدرس‬‫ی‬‫ساز‬ ‫تصادفی‬‫به‬mmap_rnd()
‫شد‬ ‫خواهد‬ ‫استفاده‬‫منظور‬ ‫این‬‫ای‬‫ر‬‫ب‬.
ASLR‫در‬mmap()
‫ی‬‫ساز‬ ‫تصادفی‬mmap‫تابع‬ ‫در‬ ،mmap_rnd()‫ی‬‫ساز‬ ‫تصادفی‬‫در‬ ‫استفاده‬‫مورد‬ ‫تکنیک‬‫همان‬ ‫با‬ ‫و‬Stack(‫تکنیک‬get_random_int())‫شود‬‫می‬‫انجام‬.
‫های‬‫سیستم‬‫ای‬‫ر‬‫ب‬32،‫بیتی‬8‫های‬‫سیستم‬‫ای‬‫ر‬‫ب‬ ‫و‬‫شده‬ ‫تصادفی‬‫بیت‬64،‫بیتی‬28‫بیت‬.
‫بندی‬‫جمع‬ASLR
-ASLR‫در‬‫لینوکس‬‫پیاده‬‫ی‬‫ساز‬‫های‬‫مختلفی‬‫د‬‫ر‬‫دا‬‫که‬‫در‬‫کلیه‬‫پیاده‬‫ی‬‫ساز‬،‫ها‬‫فضای‬‫س‬‫ر‬‫آد‬‫برنا‬‫مه‬‫ها‬‫به‬
‫ت‬‫ر‬‫صو‬‫تصادفی‬‫انتخاب‬‫می‬‫شود‬.
-‫در‬‫تی‬‫ر‬‫صو‬‫که‬‫ل‬‫مسئو‬‫سیستم‬‫قصد‬‫استفاده‬‫از‬‫پیاده‬‫ی‬‫ساز‬‫های‬‫کامل‬‫تر‬ASLR‫ا‬‫ر‬‫داشته‬،‫باشد‬‫می‬
‫بایست‬‫وصله‬‫های‬‫امنیتی‬‫ائه‬‫ر‬‫ا‬‫شده‬‫توسط‬‫شرکت‬‫هایی‬‫نظیر‬PaX‫ا‬‫ر‬‫نصب‬‫نماید‬(‫که‬‫در‬‫اکثر‬‫مواقع‬‫این‬
‫چنین‬‫نیست‬).
-‫در‬ASLR‫پیش‬‫فرض‬،‫لینوکس‬‫س‬‫ر‬‫آد‬‫ی‬‫ار‬‫ز‬‫بارگ‬،‫پشته‬heap‫و‬mmap‫تصادفی‬‫ی‬‫ساز‬‫می‬‫شود‬.
-‫تصادفی‬‫ی‬‫ساز‬‫بر‬‫مبنای‬‫س‬‫ر‬‫آد‬،‫اولیه‬‫مان‬‫ز‬‫شن‬‫و‬‫ر‬‫بودن‬،‫سیستم‬‫تعداد‬‫سیکل‬‫های‬‫نده‬‫ز‬‫پردا‬‫و‬PID‫سه‬‫و‬‫پر‬
‫ی‬‫جار‬‫انجام‬‫می‬‫شود‬.
-‫ای‬‫ر‬‫ب‬‫اینکه‬‫اطالعات‬‫به‬‫ان‬‫ز‬‫می‬‫ی‬‫بیشتر‬‫غیر‬‫قابل‬‫پیش‬‫بینی‬،‫باشد‬‫از‬‫یک‬‫یتم‬‫ر‬‫الگو‬‫مختص‬‫ر‬MD4‫نیز‬
‫استفاده‬‫می‬‫شود‬.

ASLR