حفاظت از فضای آدرس اجرایی کیست؟ توضیح بده.
در امنیت رایانه روال حفاظت از فضای آدرس اجرایی قسمت‌هایی از حافظه را به عنوان فضای غیرقابل اجرا نشانه‌گذاری می‌کند تا در صورت اجرای کد ماشین در این فضاهای نشانه‌گذاری‌شده، یک تولید شود. این روال از تعدادی ویژگی سخت‌افزاری مانند (بیت غیراجرایی) و یا مشابه‌سازی‌های نرم‌افزاری این ویژگی‌ها استفاده می‌کند. روش‌هایی که بیت غیراجرایی را شبیه‌سازی می‌کنند سرریز قابل‌توجهی دارند در حالیکه استفاده از سخت‌افزار حاوی بیت غیراجرایی سربار قابل محاسبه‌ای را تحمیل نمی‌کند. که در سال ۱۹۶۱ معرفی شد، سخت‌افزار با قابلیت پشتیبانی از روال حفاظت از فضای آدرس اجرایی را پیشنهاد کرد که این ویژگی حداقل تا سال ۲۰۰۶ در نسل‌های بعدی آن نیز وجود داشت. در این سامانه، هر کلمه از حافظه یک بیت نشان مرتبط و پنهان دارد که مشخص می‌کند این کلمه حاوی داده است یا کد اجرایی. در نتیجه برنامه‌های کاربر نمی‌توانند یک کلمه اجرایی را بخوانند و بنویسند و کلمات داده نیز قابل اجرا نمی‌باشند.اگر سیستم‌عامل بتواند همه و یا بخشی از حافظه قابل نوشتن را به عنوان غیراجرایی نشان‌گذاری کند، شاید این امکان برایش وجود داشته باشد که از فضای و در برابر اجرای کد حفاظت کند. در اینصورت می‌توان تا حد خوبی با برخی حملات مقابله کرد، به ویژه حملاتی مانند کرمهای و که با تزریق کد و اجرای آن باعث اختلال عملکرد می‌شوند. این حملات با توجه به اینکه قسمت‌هایی از حافظه مانند پشته قابل نوشتن و قابل اجرا هستند عمل می‌کنند و اگر چنین قابلیتی در حافظه وجود نداشته باشد، باعث جلوگیری از این حملات می‌شود.پیاده‌سازی در سیستم‌عامل‌های گوناگون.تعداد زیادی از سیستم‌عامل‌ها دارای خط‌مشی و راهکاری برای حفاظت از فصای اجرایی می‌باشند. در ادامه لیستی از این سیستم‌عامل‌ها به ترتیب الفبا ارائه می‌شود و در هر بخش راهکارها از جدیدترین به قدیمی‌ترین مرتب شده است.قابلیت‌های مهمی که برخی از این روش‌ها پشتیبانی می‌کنند را می‌توان در قالب زیر خلاصه کرد:تکنولوژی مبتنی بر که مستقل از معماری است، می‌تواند روی تمام پردازنده‌هایی که به صورت سخت‌افزاری قابلیت موردنظر را پشتیبانی نمی‌کنند هم کار کند. سایر سخت‌افزارهای پشتیبانی‌شده برای پردازنده‌هایی است که روش‌هایی با اندکی ابهام را نیز پشتیبانی می‌کنند. در این روش‌ها بیت غیراجرایی به صورت واضح در سخت‌افزار وجود ندارد ولی سخت افزار این امکان را فراهم می‌کند که به طریقی شبیه‌سازی شود.اندروید.معماری دستگاه‌هایی که از اندروید ۲.۳ به بعد پشتیبانی می‌کنند به صورت پیشفرض مبتنی بر صفحات غیراجرایی به ویژه در پشته و هیپ می‌باشد.FreeBSD.اولین بار در این سیستم‌عامل پشتیبانی از بیت غیراجرایی در نسخه -current (منتشرشده در ۸ ژوئن ۲۰۰۴) برای پردازنده‌های و دارای این قابلیت ارائه شد و پس از آن نیز این قابلیت تا نسخه ۵.۳ سیستم‌عامل freeBSD وجود داشت.لینوکس.هسته لینوکس از بیت غیراجرایی بر روی پردازنده‌های x86-64 و دارای این قابلیت مانند پردازنده‌های جدید شرکت AMD، اینتل، Transmeta و VIA پشتیبانی می‌کند. پشتیبانی از این قابلیت برای CPUهای x86-64 در حالت ۶۴بیتی در سال ۲۰۰۴ توسط Andi Kleen و برای CPUهای ۶۴بیتی در حالت ۳۲ بیت در همان سال توسط به این سیستم‌عامل افزوده شد. این ویژگی‌ها از زمان انتشار نسخه ۲.۶.۸ در آگوست ۲۰۰۴ در نسخه‌های بعدی هسته‌ی لینوکس قرار دارد.استفاده از قابلیت بیت غیراجرایی در هسته‌های ۳۲بیتی x86، که هم در CPU های ۳۲بیتی x86 و هم در CPUهای ۶۴بیتی هماهنگ با IA-32 استفاده می‌شود، از اهمیت ویژه‌ای برخوردار است زیرا هسته‌ی ۳۲بیتی x86 انتظار بیت غیراجرایی را که توسط یا تامین می‌شود، ندارد. در این حالت یک وصله برای فعال‌سازی استفاده از بیت غیراجرایی در صورت پشتیبانی سخت‌افزار به این هسته افزوده می‌شود. برخی از مانند ، ، و به صورت پیشفرض گزینه HIGHMEM64 را روی هسته فعال نمی‌کنند. این گزینه برای دسترسی به بیت غیراجرایی در حالت ۳۲بیتی موردنیاز است. زیرا در حالت که برای به کارگیری بیت غیراجرایی لازم است، در پردازنده‌های pre- و و که قابلیت بیت غیراجرایی ندارند دچار خطای بارگزاری می‌شوند. پردازنده‌های دیگری که از حالت PAE پشتیبانی نمی‌کنند عبارتند از: و نسخه‌های قبلی آن، و نسخه‌های قبلی آن، ، و GX و LX. در نسخه ۴ و قدیمی‌تر، قدیمی‌تر از نسخه ۴، و از PAE بر روی سیستم مهمان پشتیبانی نمی‌کنند. در فدورا از core6 به بعد و ubuntu 9.10 به بعد یک بسته kernel-PAE برای پشتیبانی از ویژگی PAE و بیت غیراجرایی اضافه شده‌است. در سیستم عامل اوبونتو همواره از ویژگی بیت غیراجرایی برای سخت‌افزارهایی که قابلیت استفاده از بیت غیراجرایی را دارند، و از هسته ۶۴ بیتی و یا ۳۲ بیتی سرور استفاده می‌کنند پشتیبانی شده است. هسته ۳۲ بیتی PAE در اوبونتو ۹.۱۰ به بعد امکانات موردنیاز حالت PAE برای پشتیبانی از CPU با بیت غیراجرایی را فراهم می‌کند. برای دستگاه‌هایی که از بیت غیراجرایی در سطح سخت‌افزار پشتیبانی نمی‌کنند، نسخه ۳۲بیتی هسته تقریبی از قابلیت‌های یک CPU حاوی بیت غیراجرایی را در سطح نرم‌افزار شبیه‌سازی می‌کند که می‌تواند از حملاتی در حافظه پشته و هیپ جلوگیری کند. قابلیت عدم اجرا برای سایر پردازنده‌های غیر X86 که از این قابلیت پشتیبانی می‌کنند در نسخه‌های مختلفی ارائه شده است.Exec Shield.یک برنامه‌نویس هسته به نام یک وصله با نام برای هسته لینوکس ارائه کرد تا بتواند تقریباً قابلیت بیت غیراجرایی را برای CPUهای X86 در حالت به کار بگیرد.این وصله در تاریخ ۲ می سال ۲۰۰۳ در ثبت شد ولی پس از آن به دلیل تغییرات گسترده‌ای که برای شبیه‌سازی در هسته لینوکس اعمال شده بود از ادغام آن با هسته اصلی لینوکس جلوگیری شد. در این وصله برای پشتیبانی از CPUهای قدیمی‌تر قابلیت بیت غیراجرایی به کمک بررسی حد بالای قسمت کد برنامه شبیه‌سازی شده است. در اینصورت تنها سربار چند سیکل به تعویض زمینه‌ها اضافه می‌شود که برای کاربردهای مختلف قابل چشم‌پوشی است. در CPUهای قدیمی که بیت غیراجرایی ندارند، Exec Shield نمی‌تواند برای صفحاتی کوچکتر از حداقل اندازه بخش کد کارآمد باشد، زیرا با فراخوانی mprotect() برای حافظه‌های بزرگتر مانند حافظه پشته، علاوه بر این حافظه‌ها تمام صفحات کوچکتر از حد نیز اجرایی نشان‌گذاری می‌شوند. بنابراین در این حالت قابلیت Exec Shield دچار ناکارآمدی می‌شود که در نتیجه کاهش سربار در طراحی این وصله به وجود آمده است. Exec Shield در ساختار سرآیندهای دو نشان PT_GNU_STACK و PT_GNU_HEAP را برای تحلیل اجرایی بودن پشته و هیپ به کار می‌گیرد. این قابلیت‌ها هم برای فایل‌های اجرایی و هم برای کتابخانه‌ها وجود دارد. اگر یک فایل اجرایی یک کتابخانه با محدودیت مشخص را بارگزاری کند این محدودیت بر روی خود فایل اجرایی اعمال می‌شود و اصطلاحاً آن را به ارث می‌برد. PaX.قابلیت هم می‌تواند از بیت غیراجرایی سخت‌افزار را به کار بگیرد و هم می‌تواند آن را شبیه‌سازی کند. این قابلیت بر روی CPUهای x86 که بیت غیراجرایی ندارند مانند نسخه ۳۲بیتی آنها کارامد است. قابلیت PaX در هسته لینوکس تعبیه نشده است و وصله آن باید به صورت دستی اعمال شود. PaX برای شبیه‌سازی بیت غیراجرایی دو روش SEGMEXEC و PAGEEXEC را دارد. روش SEGMEXEC سربار کم ولی قابل محاسبه‌ای دارد، که به طور معمول مقداری ثابت و احتمالاتی کمتر از ۱٪ است که به دلیل استفاده از mirror در سطح حافظه مجازی برای جداسازی دسترسی داده و کد تحمیل شده است.همچنین روش SEGMEXEC باعث می‌شود که فضای آدرس مجازی برای برنامه نصف شود و در نتیجه برنامه به فضای کمتری نسبت به حالت معمول دسترسی خواهد داشت. البته این مساله تا زمانی که برنامه به فضایی بیشتر از نصف حد معمول نیاز نداشته باشد دردسرساز نخواهد بود و این حالت دردسرساز نادر است. این روش باعث افزایش استفاده برنامه‌ها از حافظه سیستمی نمی‌شود و تنها فضای دسترسی آنها را محدودتر می‌کند. به عنوان نمونه در CPUهای ۳۲بیتی این فضا از ۳ گیگابایت به ۱.۵ گیگابایت کاهش می‌یابد.در روش PAGEEXEC قابلیت PaX از فرایندی مشابه Exec Shield به عنوان تسریع در عملکرد استفاده می‌کند، اما زمانی که حافظه‌ی زیادی به عنوان فضای اجرایی نشان‌گذاری شود، این روش قابلیت حفاظت خود را از دست می‌دهد. در این حالت PaX از قابلیت قدیمی‌تر خود که مبتنی بر سربار متغیر است استفاده می‌کند تا از صفحات پایین بخش کد حفاظت کند. در موارد خاصی از این عملیات سربار زیادی خواهد داشت. روش PAGEEXEC در CPUهایی که از بیت غیراجرایی پشتیبانی می‌کنند از همین قابلیت استفاده می‌کند و در نتیجه سرباری را تحمیل نخواهد کرد.PaX برای حفاظت از حافظه در برابر برخی آسیب‌پذیری‌ها نشان‌گذاری برنامه‌ها را به کمک mprotect() کنترل می‌کند که ممکن است کارایی برخی از آنها را مختل کند. این قابلیت می‌تواند برای این برنامه‌ها غیرفعال شود. PaX برای هر فایل اجرایی امکان کنترل و پیکربندی قابلیت‌های زیر را فراهم می‌کند: PaX هر دو ویژگی PT_GNU_STACK و PT_GNU_HEAP را در نظر نمی‌گیرد. در نسخه‌های قدیمی‌تر این گزینه‌ها در پیکربندی قابل دسترس بود ولی به دلیل مشکلات امنیتی حذف شده است زیرا بدون استفاده تلقی می‌شد. با غیرفعال کردن محدودیت‌های mprotect() می‌توان نتایجی مشابه PT_GNU_STACK تولید کرد، زیرا برنامه معمولا در ابتدای بارگزاری این محدودیت‌ها را بر روی پشته اعمال می‌کند. البته گاهی ممکن است این حالت رخ ندهد، که در اینصورت نیز با غیرفعال‌کردن PAGEEXEC و SEGMEXEC تمام محدودیت‌های فضای اجرایی برداشته می‌شود و مشابه محدودیت‌های اعمالی بر روی دستگاه‌های فاقد PaX می‌شود. macOS. بر روی تمام CPUهایی که توسط Apple پشتیبانی می‌شوند، قابلیت بیت اجرایی را برای اینتل پشتیبانی می‌کند (از زمان اولین نسخه اینتل در MacOS X10.4.4 تا کنون). در macOS X10.4 بیت غیراجرایی تنها برای حافظه پشته پشتیبانی می‌شود. در macoS X10.5 تمام پردازنده‌های ۶۴بیتی دارای بیت غیراجرایی در فضای پشته و هیپ هستند. این ویژگی در (از core2 به بعد) و های ۶۴بیتی در macOSها نیز وجود دارد.netBSD.معماری‌هایی که از نسخه ۲ به بعد (ارائه شده در ۹ دسامبر ۲۰۰۴) پشتیبانی می‌کنند دارای حافظه پشته و هیپ غیراجرایی هستند.معماری‌های ، (به همراه (ibm4xx)، (،) امکان کنترل این قابلیت را در سطح صفحه فراهم می‌کنند.معماری‌های i386(بدون PAE) و سایر powerpcها (مانند macppc) فقط می‌توانند این قابلیت را در سطح محدوده کنترل کنند.سایر معماری‌ها نیز از پشته و هیپ غیرقابل‌اجرا پشتیبانی نمی‌کنند و netBDS نیز به صورت پیشفرض شبیه‌سازی نرم‌افزاری برای استفاده از این قابلیت‌ها در این معماری‌ها ارائه نمی‌دهد.openBSD.در یک تکنولوژی به نام وجود دارد که در صورت پشتیبانی پردازنده صفحات قابل نوشتن را به صورت غیراجرایی نشان‌گذاری می‌کند. در پردازنده‌های ۳۲بیتی ، بخش کد تنها بخشی از فضای آدرس‌دهی را شامل می‌شود تا بدین ترتیب حفاظت تقریبی از فضای آدرس اجرایی صورت پذیرد.نسخه ۳.۳ OpenBSD که در ۱ می ۲۰۰۳ منتشر شد اولین نسخه‌ای بود که شامل قابلیت W^X بود.Solaris. از نسخه ۲.۶(در سال ۱۹۹۷) به بعد روی پردازنده‌های SPARC قابلیت غیرفعال کردن اجرای کد در فضای پشته را دارد. همچنین از نسخه ۹ (در سال ۲۰۰۲) نیز قابلیت عدم اجرا در حافظه پشته در ازای هر فایل اجرایی وجود دارد.ویندوز.قابلیت بیت غیراجرایی اولین بار برای معماری در با ۲ (در سال ۲۰۰۴) و در با service pack۱ (در سال ۲۰۰۵) عرضه شد. راهکار حفاظت از فضای آدرس اجرایی در ویندوز "جلوگیری از اجرای داده" (Data Execution Prevention) و به اختصار DEP نام دارد.قابلیت بیت غیراجرایی در ویندوز xp و ویندوز سرور ۲۰۰۳ به صورت پیشفرض برای تنطیم شده است. همچنین اگر یک پردازنده این قابلیت را در سخت‌افزار خود پشتیبانی کند، در این دو نسخه ویندوز نیز این ویژگی به صورت پیشفرض فعال می‌شود و اگر چنین قابلیتی در این معماری وجود نداشته باشد، این قابلیت در ویندوز نیز در دسترس نخواهد بود. نسخه‌های ابتدایی DEP ‌(ASLR) را در نظر نگرفته بودند و احتمال وجود داشت و به وسیله آن می‌توانستند سیستم DEP را در زمان حمله از کار بیندازند.مستندات روش به طور دقیق دلیل لزوم وجود ASLR را شرح میدهد،همچنین به عنوان یک اثبات مفهومی می‌توان جزئیات روشی را در نظر گرفت که DEP در صورت عدم وجود ASLR کارایی خود را از دست می‌دهد.در صورتی که مهاجم آدرس داده‌های از پیش آماده شده مانند تصاویر و را بداند می‌تواند یک حمله موفق داشته باشد.مایکروسافت قابلیت ASLR را به و افزود. در زیرساخت ارائه شده، DEP در هسته‌های ۶۴ بیتی به صورت پیشفرض و در نسخه‌های ۳۲ بیتی به کمک بهره‌گیری از پیاده‌سازی شده است. در ویندوز ویستا DEP با نشان‌گذاری بخش‌هایی از حافظه آن‌ها را تنها به نگهداری از داده‌ها اختصاص می‌دهد که در پردازنده‌هایی با قابلیت بیت غیراجرایی، این بخش از حافظه غیراجرایی می‌باشد. در ویندوز ویستا و نسخه‌های بالاتر از آن، فعال و یا غیرفعال بودن DEP برای هر پردازه از طریق گزینه Processes/Details در قابل مشاهده است. ویندوز قابلیت DEP را به کمک Safe Structured Exception Handling" (SafeSEH)" مایکروسافت به صورت نرم‌افزاری و بدون نیاز به بیت غیراجرایی پیاده‌سازی کرده است. در برنامه‌هایی که به درستی کامپایل شده باشند، safeSEH کنترل می‌کند که خطای حین اجرای برنامه توسط هندلر خود برنامه که در زمان کامپایل وجود داشته است، مدیریت شود. با وجود چنین قابلیتی مهاجم نمی‌تواند هندلر خودش را در ورودی‌های بررسی نشده‌ی برنامه ذخیره و اجرا کند.در صورتی که سخت‌افزار از بیت غیراجرایی پشتیانی کند در ویندوز به صورت پیشفرض فعال می‌شود. در ویندوز برنامه‌ها می‌توانند هم از طریق و هم به کمک سرآیندهای موجود در صفحات غیرقابل اجرایشان را کنترل کنند. فراخوانی‌های موجود در به نام VirtualAlloc[Ex] و VirtualProtect[Ex] در زمان اجرا به برنامه امکان دسترسی به بیت غیراجرایی را میدهند. بدین ترتیب هر صفحه می‌تواند به صورت مجزا نشان اجرایی و یا غیراجرایی داشته باشد. هر دو قابلیت صفحه اجرایی و غیراجرایی از همان ابتدا تعبیه شده است. در CPUهایی که قبل از وجود بیت غیراجرایی طراحی شده است، وجود ویژگی اجرایی هیچ تاثیری نداشته است. در مستندات چنین است که این قابلیت امکان اجرا را فراهم می‌کند و در نتیجه برنامه‌نویسان نیز از آن به خوبی استفاده کرده‌اند. در قالب فایل PE نیز هر قسمتی به صورت جداگانه می‌تواند قابلیت اجرایش را مشخص کند. نشان اجرایی از زمان شروع در این قالب وجود داشته است و های استاندارد، حتی از مدتها قبل از وجود بیت غیراجرایی، به درستی از این نشان استفاده می‌کنند. به همین دلیل ویندوز می‌تواند به راحتی قابلیت بیت غیراجرایی را روی برنامه‌های قدیمی نیز به کار بگیرد. اگر برنامه‌نویس برنامه را با توجه به بهترین ساختارها کامپایل کرده باشد، برنامه پس از به کارگبری قابلیت بیت غیراجرایی نیز عملکرد خودش را ادامه می‌دهد. تنها در چندین مورد مشکلاتی وجود داشته است. به عنوان نمونه محیط اجرایی .NET مایکروسافت با بیت غیراجرایی مشکل داشته و منجر به به‌روزرسانی در این برنامه شده است.Xbox.در با وجود اینکه CPU از بیت غیراجرایی پشتیبانی نمی‌کند، اما در نسخه‌های جدیدتر بخش کد به ابتدای بخش .data ی هسته محدود می‌شود (در شرایط معمول کدی پس از این بخش در حافظه قرار نمی‌گیرد). از نسخه 51xx به بعد این ویژگی به هسته‌ی Xbox افزوده شده است. این روش آسیب‌پذیری‌های قدیمی که از تبدیل شدن به استفاده می‌کردند را مختل کرد.همچنین نسخه‌های جدیدتر برای پشتیبانی از این نسخه ارائه شدند که عملکرد اساسی را تحت تاثیر قرار نمی‌دادند.محدودیت‌ها.اگر کد در زمان اجرا نوشته و اجرا شود، مانند کامپایل درجا، از خود کامپایلر می‌توان برای ایجاد کد آسیب‌پذیری، به عنوان نمونه به کمک استفاده کرد، چرا که به عنوان بخش اجرایی نشان‌گذاری شده است و در این ساختار شناسایی نمی‌شود. نیز به مهاجم این امکان را می‌دهد که با وجود به کارگیری روش حفاظت از فضای آدرس اجرایی کد دلخواهش را اجرا کند.