موضوع مقاله: حفاظت از فضای آدرس اجرایی | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # حفاظت از فضای آدرس اجرایی | مقدمه: در امنیت رایانه روال حفاظت از فضای آدرس اجرایی قسمت‌هایی از حافظه را به عنوان فضای غیرقابل اجرا نشانه‌گذاری می‌کند تا در صورت اجرای کد ماشین در این فضاهای نشانه‌گذاری‌شده، یک خطا تولید شود. | ## بخش 1: حفاظت از فضای آدرس اجرایی | این روال از تعدادی ویژگی سخت‌افزاری مانند بیت NX (بیت غیراجرایی) و یا مشابه‌سازی‌های نرم‌افزاری این ویژگی‌ها استفاده می‌کند. روش‌هایی که بیت غیراجرایی را شبیه‌سازی می‌کنند سرریز قابل‌توجهی دارند در حالیکه استفاده از سخت‌افزار حاوی بیت غیراجرایی سربار قابل محاسبه‌ای را تحمیل نمی‌کند. Burroughs 5000 که در سال ۱۹۶۱ معرفی شد، سخت‌افزار با قابلیت پشتیبانی از روال حفاظت از فضای آدرس اجرایی را پیشنهاد کرد که این ویژگی حداقل تا سال ۲۰۰۶ در نسل‌های بعدی آن نیز وجود داشت. در معماری مبتنی بر نشان این سامانه، هر کلمه از حافظه یک بیت نشان مرتبط و پنهان دارد که مشخص می‌کند این کلمه حاوی داده است یا کد اجرایی. در نتیجه برنامه‌های کاربر نمی‌توانند یک کلمه اجرایی را بخوانند و بنویسند و کلمات داده نیز قابل اجرا نمی‌باشند. اگر سیستم‌عامل بتواند همه و یا بخشی از حافظه قابل نوشتن را به عنوان غیراجرایی نشان‌گذاری کند، شاید این امکان برایش وجود داشته باشد که از فضای پشته و هیپ در برابر اجرای کد حفاظت کند. در اینصورت می‌توان تا حد خوبی با برخی حملات سرریز بافر مقابله کرد، به ویژه حملاتی مانند کرمهای Sasser و Blaster که با تزریق کد و اجرای آن باعث اختلال عملکرد می‌شوند. این حملات با توجه به اینکه قسمت‌هایی از حافظه مانند پشته قابل نوشتن و قابل اجرا هستند عمل می‌کنند و اگر چنین قابلیتی در حافظه وجود نداشته باشد، باعث جلوگیری از این حملات می‌شود. پیاده‌سازی در سیستم‌عامل‌های گوناگون تعداد زیادی از سیستم‌عامل‌ها دارای خط‌مشی و راهکاری برای حفاظت از فصای اجرایی می‌باشند. در ادامه لیستی از این سیستم‌عامل‌ها به ترتیب الفبا ارائه می‌شود و در هر بخش راهکارها از جدیدترین به قدیمی‌ترین مرتب شده است. قابلیت‌های مهمی که برخی از این روش‌ها پشتیبانی می‌کنند را می‌توان در قالب زیر خلاصه کرد: سخت افزار پردازنده‌های قابل پشتیبانی:(لیستی از معماری CPUها که با کاما از هم تفکیک شده‌اند. ) شبیه‌سازی: (پشتیبانی نمی‌شود) یا (مستقل از معماری است) یا (لیستی از معماری CPUهای که با کاما جدا شده‌اند.) سایر سخت‌افزارهای پشتیبانی‌شده: (هیچ سخت‌افزاری) یا (لیستی از معماری CPUهای که با کاما جدا شده‌اند.) توزیع استاندارد: (ندارد) یا (دارد) یا (لیستی از توزیع و یا نسخه‌هایی که از این روش پشتیبانی می‌کنند.) تاریخ انتشار:(تاریخ اولین انتشار) تکنولوژی مبتنی بر شبیه‌سازی که مستقل از معماری است، می‌تواند روی تمام پردازنده‌هایی که به صورت سخت‌افزاری قابلیت موردنظر را پشتیبانی نمی‌کنند هم کار کند. سایر سخت‌افزارهای پشتیبانی‌شده برای پردازنده‌هایی است که روش‌هایی با اندکی ابهام را نیز پشتیبانی می‌کنند. در این روش‌ها بیت غیراجرایی به صورت واضح در سخت‌افزار وجود ندارد ولی سخت افزار این امکان را فراهم می‌کند که به طریقی شبیه‌سازی شود. این ویژگی‌ها از زمان انتشار نسخه ۲.۶.۸ در آگوست ۲۰۰۴ در نسخه‌های بعدی هسته‌ی لینوکس قرار دارد. استفاده از قابلیت بیت غیراجرایی در هسته‌های ۳۲بیتی x86، که هم در CPU های ۳۲بیتی x86 و هم در CPUهای ۶۴بیتی هماهنگ با IA-32 استفاده می‌شود، از اهمیت ویژه‌ای برخوردار است زیرا هسته‌ی ۳۲بیتی x86 انتظار بیت غیراجرایی را که توسط AMD64 یا AI-64 تامین می‌شود، ندارد. در این حالت یک وصله برای فعال‌سازی استفاده از بیت غیراجرایی در صورت پشتیبانی سخت‌افزار به این هسته افزوده می‌شود. در سیستم عامل اوبونتو همواره از ویژگی بیت غیراجرایی برای سخت‌افزارهایی که قابلیت استفاده از بیت غیراجرایی را دارند، و از هسته ۶۴ بیتی و یا ۳۲ بیتی سرور استفاده می‌کنند پشتیبانی شده است. هسته ۳۲ بیتی PAE در اوبونتو ۹.۱۰ به بعد امکانات موردنیاز حالت PAE برای پشتیبانی از CPU با بیت غیراجرایی را فراهم می‌کند. برای دستگاه‌هایی که از بیت غیراجرایی در سطح سخت‌افزار پشتیبانی نمی‌کنند، نسخه ۳۲بیتی هسته تقریبی از قابلیت‌های یک CPU حاوی بیت غیراجرایی را در سطح نرم‌افزار شبیه‌سازی می‌کند که می‌تواند از حملاتی در حافظه پشته و هیپ جلوگیری کند. | ## بخش 2: حفاظت از فضای آدرس اجرایی | قابلیت عدم اجرا برای سایر پردازنده‌های غیر X86 که از این قابلیت پشتیبانی می‌کنند در نسخه‌های مختلفی ارائه شده است. این وصله در تاریخ ۲ می سال ۲۰۰۳ در لیست نوشته‌های هسته‌ی لینوکس ثبت شد ولی پس از آن به دلیل تغییرات گسترده‌ای که برای شبیه‌سازی در هسته لینوکس اعمال شده بود از ادغام آن با هسته اصلی لینوکس جلوگیری شد. در این وصله برای پشتیبانی از CPUهای قدیمی‌تر قابلیت بیت غیراجرایی به کمک بررسی حد بالای قسمت کد برنامه شبیه‌سازی شده است. در اینصورت تنها سربار چند سیکل به تعویض زمینه‌ها اضافه می‌شود که برای کاربردهای مختلف قابل چشم‌پوشی است. اگر یک فایل اجرایی یک کتابخانه با محدودیت مشخص را بارگزاری کند این محدودیت بر روی خود فایل اجرایی اعمال می‌شود و اصطلاحاً آن را به ارث می‌برد. سخت افزار پردازنده‌های قابل پشتیبانی: در تمام سخت‌افزارهایی که Linux قابلیت بیت غیراجرایی را در آنها پشتیبانی می‌کند. این قابلیت بر روی CPUهای x86 که بیت غیراجرایی ندارند مانند نسخه ۳۲بیتی آنها کارامد است. روش SEGMEXEC سربار کم ولی قابل محاسبه‌ای دارد، که به طور معمول مقداری ثابت و احتمالاتی کمتر از ۱٪ است که به دلیل استفاده از mirror در سطح حافظه مجازی برای جداسازی دسترسی داده و کد تحمیل شده است. همچنین روش SEGMEXEC باعث می‌شود که فضای آدرس مجازی برای برنامه نصف شود و در نتیجه برنامه به فضای کمتری نسبت به حالت معمول دسترسی خواهد داشت. البته این مساله تا زمانی که برنامه به فضایی بیشتر از نصف حد معمول نیاز نداشته باشد دردسرساز نخواهد بود و این حالت دردسرساز نادر است. این روش باعث افزایش استفاده برنامه‌ها از حافظه سیستمی نمی‌شود و تنها فضای دسترسی آنها را محدودتر می‌کند. به عنوان نمونه در CPUهای ۳۲بیتی این فضا از ۳ گیگابایت به ۱.۵ گیگابایت کاهش می‌یابد. در این حالت PaX از قابلیت قدیمی‌تر خود که مبتنی بر سربار متغیر است استفاده می‌کند تا از صفحات پایین بخش کد حفاظت کند. PaX برای حفاظت از حافظه در برابر برخی آسیب‌پذیری‌ها نشان‌گذاری برنامه‌ها را به کمک mprotect کنترل می‌کند که ممکن است کارایی برخی از آنها را مختل کند. در نسخه‌های قدیمی‌تر این گزینه‌ها در پیکربندی قابل دسترس بود ولی به دلیل مشکلات امنیتی حذف شده است زیرا بدون استفاده تلقی می‌شد. در macoS X10.5 تمام پردازنده‌های ۶۴بیتی دارای بیت غیراجرایی در فضای پشته و هیپ هستند. سایر معماری‌ها نیز از پشته و هیپ غیرقابل‌اجرا پشتیبانی نمی‌کنند و netBDS نیز به صورت پیشفرض شبیه‌سازی نرم‌افزاری برای استفاده از این قابلیت‌ها در این معماری‌ها ارائه نمی‌دهد. در پردازنده‌های ۳۲بیتی X86، بخش کد تنها بخشی از فضای آدرس‌دهی را شامل می‌شود تا بدین ترتیب حفاظت تقریبی از فضای آدرس اجرایی صورت پذیرد. همچنین از نسخه ۹ (در سال ۲۰۰۲) نیز قابلیت عدم اجرا در حافظه پشته در ازای هر فایل اجرایی وجود دارد. قابلیت بیت غیراجرایی در ویندوز xp و ویندوز سرور ۲۰۰۳ به صورت پیشفرض برای سرویس‌های حیاتی ویندوز تنطیم شده است. | ## بخش 3: حفاظت از فضای آدرس اجرایی | همچنین اگر یک پردازنده X86 این قابلیت را در سخت‌افزار خود پشتیبانی کند، در این دو نسخه ویندوز نیز این ویژگی به صورت پیشفرض فعال می‌شود و اگر چنین قابلیتی در این معماری وجود نداشته باشد، این قابلیت در ویندوز نیز در دسترس نخواهد بود. نسخه‌های ابتدایی DEP تصادفی کردن چیدمان فضای آدرس‌(ASLR) را در نظر نگرفته بودند و احتمال حمله بازگشتی به libc وجود داشت و به وسیله آن می‌توانستند سیستم DEP را در زمان حمله از کار بیندازند. مستندات روش PaX به طور دقیق دلیل لزوم وجود ASLR را شرح میدهد، همچنین به عنوان یک اثبات مفهومی می‌توان جزئیات روشی را در نظر گرفت که DEP در صورت عدم وجود ASLR کارایی خود را از دست می‌دهد. در صورتی که مهاجم آدرس داده‌های از پیش آماده شده مانند تصاویر و mp3ها را بداند می‌تواند یک حمله موفق داشته باشد. در زیرساخت ارائه شده، DEP در هسته‌های ۶۴ بیتی به صورت پیشفرض و در نسخه‌های ۳۲ بیتی به کمک بهره‌گیری از هسته‌های PAE پیاده‌سازی شده است. در ویندوز ویستا DEP با نشان‌گذاری بخش‌هایی از حافظه آن‌ها را تنها به نگهداری از داده‌ها اختصاص می‌دهد که در پردازنده‌هایی با قابلیت بیت غیراجرایی، این بخش از حافظه غیراجرایی می‌باشد. در برنامه‌هایی که به درستی کامپایل شده باشند، safeSEH کنترل می‌کند که خطای حین اجرای برنامه توسط هندلر خود برنامه که در زمان کامپایل وجود داشته است، مدیریت شود. با وجود چنین قابلیتی مهاجم نمی‌تواند هندلر خودش را در ورودی‌های بررسی نشده‌ی برنامه ذخیره و اجرا کند. در صورتی که سخت‌افزار از بیت غیراجرایی پشتیانی کند در ویندوز به صورت پیشفرض فعال می‌شود. در ویندوز برنامه‌ها می‌توانند هم از طریق رابط کاربری و هم به کمک سرآیندهای موجود در فایل‌های PE صفحات غیرقابل اجرایشان را کنترل کنند. در CPUهایی که قبل از وجود بیت غیراجرایی طراحی شده است، وجود ویژگی اجرایی هیچ تاثیری نداشته است. در مستندات چنین است که این قابلیت امکان اجرا را فراهم می‌کند و در نتیجه برنامه‌نویسان نیز از آن به خوبی استفاده کرده‌اند. در قالب فایل PE نیز هر قسمتی به صورت جداگانه می‌تواند قابلیت اجرایش را مشخص کند. نشان اجرایی از زمان شروع در این قالب وجود داشته است و linkerهای استاندارد، حتی از مدتها قبل از وجود بیت غیراجرایی، به درستی از این نشان استفاده می‌کنند. به همین دلیل ویندوز می‌تواند به راحتی قابلیت بیت غیراجرایی را روی برنامه‌های قدیمی نیز به کار بگیرد. اگر برنامه‌نویس برنامه را با توجه به بهترین ساختارها کامپایل کرده باشد، برنامه پس از به کارگبری قابلیت بیت غیراجرایی نیز عملکرد خودش را ادامه می‌دهد. به عنوان نمونه محیط اجرایی .NET مایکروسافت با بیت غیراجرایی مشکل داشته و منجر به به‌روزرسانی در این برنامه شده است. این روش آسیب‌پذیری‌های قدیمی که از تبدیل شدن به TSR استفاده می‌کردند را مختل کرد.همچنین نسخه‌های جدیدتر برای پشتیبانی از این نسخه ارائه شدند که عملکرد اساسی را تحت تاثیر قرار نمی‌دادند. محدودیت‌ها اگر کد در زمان اجرا نوشته و اجرا شود، مانند کامپایل درجا، از خود کامپایلر می‌توان برای ایجاد کد آسیب‌پذیری، به عنوان نمونه به کمک JIT spray استفاده کرد، چرا که به عنوان بخش اجرایی نشان‌گذاری شده است و در این ساختار شناسایی نمی‌شود. | ## جمع‌بندی | برنامه‌نویسی مبتنی بر کد بازگشت نیز به مهاجم این امکان را می‌دهد که با وجود به کارگیری روش حفاظت از فضای آدرس اجرایی کد دلخواهش را اجرا کند.