# حفاظت از فضای آدرس اجرایی

در امنیت رایانه روال **حفاظت از فضای آدرس اجرایی** (به انگلیسی: Executable Space Protection) قسمت‌هایی از حافظه را به عنوان فضای غیرقابل اجرا نشانه‌گذاری می‌کند تا در صورت اجرای کد ماشین در این فضاهای نشانه‌گذاری‌شده، یک خطا تولید شود. این روال از تعدادی ویژگی سخت‌افزاری مانند بیت NX (بیت غیراجرایی) و یا مشابه‌سازی‌های نرم‌افزاری این ویژگی‌ها استفاده می‌کند. روش‌هایی که بیت غیراجرایی را شبیه‌سازی می‌کنند سرریز قابل‌توجهی دارند در حالیکه استفاده از سخت‌افزار حاوی بیت غیراجرایی سربار قابل محاسبه‌ای را تحمیل نمی‌کند.

Burroughs 5000 که در سال ۱۹۶۱ معرفی شد، سخت‌افزار با قابلیت پشتیبانی از روال حفاظت از فضای آدرس اجرایی را پیشنهاد کرد که این ویژگی حداقل تا سال ۲۰۰۶ در نسل‌های بعدی آن نیز وجود داشت. در معماری مبتنی بر نشان این سامانه، هر کلمه از حافظه یک بیت نشان مرتبط و پنهان دارد که مشخص می‌کند این کلمه حاوی داده است یا کد اجرایی. در نتیجه برنامه‌های کاربر نمی‌توانند یک کلمه اجرایی را بخوانند و بنویسند و کلمات داده نیز قابل اجرا نمی‌باشند.

اگر سیستم‌عامل بتواند همه و یا بخشی از حافظه قابل نوشتن را به عنوان غیراجرایی نشان‌گذاری کند، شاید این امکان برایش وجود داشته باشد که از فضای پشته و هیپ در برابر اجرای کد حفاظت کند. در اینصورت می‌توان تا حد خوبی با برخی حملات سرریز بافر مقابله کرد، به ویژه حملاتی مانند کرمهای Sasser و Blaster که با تزریق کد و اجرای آن باعث اختلال عملکرد می‌شوند. این حملات با توجه به اینکه قسمت‌هایی از حافظه مانند پشته قابل نوشتن و قابل اجرا هستند عمل می‌کنند و اگر چنین قابلیتی در حافظه وجود نداشته باشد، باعث جلوگیری از این حملات می‌شود.

## پیاده‌سازی در سیستم‌عامل‌های گوناگون

تعداد زیادی از سیستم‌عامل‌ها دارای خط‌مشی و راهکاری برای حفاظت از فصای اجرایی می‌باشند. در ادامه لیستی از این سیستم‌عامل‌ها به ترتیب الفبا ارائه می‌شود و در هر بخش راهکارها از جدیدترین به قدیمی‌ترین مرتب شده است.

قابلیت‌های مهمی که برخی از این روش‌ها پشتیبانی می‌کنند را می‌توان در قالب زیر خلاصه کرد:

* سخت افزار پردازنده‌های قابل پشتیبانی:(لیستی از معماری CPUها که با کاما از هم تفکیک شده‌اند. )
* شبیه‌سازی: (پشتیبانی نمی‌شود) یا (مستقل از معماری است) یا (لیستی از معماری CPUهای که با کاما جدا شده‌اند.)
* سایر سخت‌افزارهای پشتیبانی‌شده: (هیچ سخت‌افزاری) یا (لیستی از معماری CPUهای که با کاما جدا شده‌اند.)
* توزیع استاندارد: (ندارد) یا (دارد) یا (لیستی از توزیع و یا نسخه‌هایی که از این روش پشتیبانی می‌کنند.)
* تاریخ انتشار:(تاریخ اولین انتشار)

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

### اندروید

معماری دستگاه‌هایی که از اندروید ۲.۳ به بعد پشتیبانی می‌کنند به صورت پیشفرض مبتنی بر صفحات غیراجرایی به ویژه در پشته و هیپ می‌باشد.

### FreeBSD

اولین بار در این سیستم‌عامل پشتیبانی از بیت غیراجرایی در نسخه freeBSD-current (منتشرشده در ۸ ژوئن ۲۰۰۴) برای پردازنده‌های x86-64 و IA-32 دارای این قابلیت ارائه شد و پس از آن نیز این قابلیت تا نسخه ۵.۳ سیستم‌عامل freeBSD وجود داشت.

### لینوکس

هسته لینوکس از بیت غیراجرایی بر روی پردازنده‌های x86-64 و IA-32 دارای این قابلیت مانند پردازنده‌های جدید شرکت AMD، اینتل، Transmeta و VIA پشتیبانی می‌کند. پشتیبانی از این قابلیت برای CPUهای x86-64 در حالت ۶۴بیتی در سال ۲۰۰۴ توسط Andi Kleen و برای CPUهای ۶۴بیتی در حالت ۳۲ بیت در همان سال توسط Ingo Molnar به این سیستم‌عامل افزوده شد. این ویژگی‌ها از زمان انتشار نسخه ۲.۶.۸ در آگوست ۲۰۰۴ در نسخه‌های بعدی هسته‌ی لینوکس قرار دارد.

استفاده از قابلیت بیت غیراجرایی در هسته‌های ۳۲بیتی x86، که هم در CPU های ۳۲بیتی x86 و هم در CPUهای ۶۴بیتی هماهنگ با IA-32 استفاده می‌شود، از اهمیت ویژه‌ای برخوردار است زیرا هسته‌ی ۳۲بیتی x86 انتظار بیت غیراجرایی را که توسط AMD64 یا AI-64 تامین می‌شود، ندارد. در این حالت یک وصله برای فعال‌سازی استفاده از بیت غیراجرایی در صورت پشتیبانی سخت‌افزار به این هسته افزوده می‌شود.

برخی از نسخه‌های دسکتاپ لینوکس مانند فدورا، اوبونتو، و openSUSE به صورت پیشفرض گزینه HIGHMEM64 را روی هسته فعال نمی‌کنند. این گزینه برای دسترسی به بیت غیراجرایی در حالت ۳۲بیتی موردنیاز است. زیرا در حالت PAE که برای به کارگیری بیت غیراجرایی لازم است، در پردازنده‌های pre-Pentium Pro و Pentium M و Celeron M که قابلیت بیت غیراجرایی ندارند دچار خطای بارگزاری می‌شوند.
پردازنده‌های دیگری که از حالت PAE پشتیبانی نمی‌کنند عبارتند از: AMD K6 و نسخه‌های قبلی آن، VIA C3 و نسخه‌های قبلی آن، Transmeta Crusoe، و Geode GX و LX. در Vmware Workstation نسخه ۴ و قدیمی‌تر، Parallels Workstation قدیمی‌تر از نسخه ۴، Microsoft Visual PC و Virtual Server از PAE بر روی سیستم مهمان پشتیبانی نمی‌کنند. در فدورا از core6 به بعد و ubuntu 9.10 به بعد یک بسته kernel-PAE برای پشتیبانی از ویژگی PAE و بیت غیراجرایی اضافه شده‌است.

در سیستم عامل اوبونتو همواره از ویژگی بیت غیراجرایی برای سخت‌افزارهایی که قابلیت استفاده از بیت غیراجرایی را دارند، و از هسته ۶۴ بیتی و یا ۳۲ بیتی سرور استفاده می‌کنند پشتیبانی شده است.
هسته ۳۲ بیتی PAE در اوبونتو ۹.۱۰ به بعد امکانات موردنیاز حالت PAE برای پشتیبانی از CPU با بیت غیراجرایی را فراهم می‌کند. برای دستگاه‌هایی که از بیت غیراجرایی در سطح سخت‌افزار پشتیبانی نمی‌کنند، نسخه ۳۲بیتی هسته تقریبی از قابلیت‌های یک CPU حاوی بیت غیراجرایی را در سطح نرم‌افزار شبیه‌سازی می‌کند که می‌تواند از حملاتی در حافظه پشته و هیپ جلوگیری کند. قابلیت عدم اجرا برای سایر پردازنده‌های غیر X86 که از این قابلیت پشتیبانی می‌کنند در نسخه‌های مختلفی ارائه شده است.

#### Exec Shield

یک برنامه‌نویس هسته Red Hat به نام Ingo Molnar یک وصله با نام Exec Shield برای هسته لینوکس ارائه کرد تا بتواند تقریباً قابلیت بیت غیراجرایی را برای CPUهای X86 در حالت ۳۲ بیتی به کار بگیرد.
این وصله در تاریخ ۲ می سال ۲۰۰۳ در لیست نوشته‌های هسته‌ی لینوکس ثبت شد ولی پس از آن به دلیل تغییرات گسترده‌ای که برای شبیه‌سازی در هسته لینوکس اعمال شده بود از ادغام آن با هسته اصلی لینوکس جلوگیری شد. در این وصله برای پشتیبانی از CPUهای قدیمی‌تر قابلیت بیت غیراجرایی به کمک بررسی حد بالای قسمت کد برنامه شبیه‌سازی شده است. در اینصورت تنها سربار چند سیکل به تعویض زمینه‌ها اضافه می‌شود که برای کاربردهای مختلف قابل چشم‌پوشی است. در CPUهای قدیمی که بیت غیراجرایی ندارند، Exec Shield نمی‌تواند برای صفحاتی کوچکتر از حداقل اندازه بخش کد کارآمد باشد، زیرا با فراخوانی mprotect() برای حافظه‌های بزرگتر مانند حافظه پشته، علاوه بر این حافظه‌ها تمام صفحات کوچکتر از حد نیز اجرایی نشان‌گذاری می‌شوند. بنابراین در این حالت قابلیت Exec Shield دچار ناکارآمدی می‌شود که در نتیجه کاهش سربار در طراحی این وصله به وجود آمده است.
Exec Shield در ساختار سرآیندهای ELF دو نشان PT\_GNU\_STACK و PT\_GNU\_HEAP را برای تحلیل اجرایی بودن پشته و هیپ به کار می‌گیرد. این قابلیت‌ها هم برای فایل‌های اجرایی و هم برای کتابخانه‌ها وجود دارد. اگر یک فایل اجرایی یک کتابخانه با محدودیت مشخص را بارگزاری کند این محدودیت بر روی خود فایل اجرایی اعمال می‌شود و اصطلاحاً آن را به ارث می‌برد.

* سخت افزار پردازنده‌های قابل پشتیبانی: در تمام سخت‌افزارهایی که Linux قابلیت بیت غیراجرایی را در آنها پشتیبانی می‌کند.
* شبیه سازی: تقریبی از قابلیت بیت غیراجرایی به کمک محدودیت بخش کد بر روی IA-32(x86) و موارد قابل تطبیق
* سایر سخت‌افزارهای پشتیبانی‌شده: هیچ سخت‌افزاری
* توزیع استاندارد: Fedora Core و Red Hat Enterprise
* تاریخ انتشار: ۲ می ۲۰۰۳

#### PaX

قابلیت PaX هم می‌تواند از بیت غیراجرایی سخت‌افزار را به کار بگیرد و هم می‌تواند آن را شبیه‌سازی کند. این قابلیت بر روی CPUهای x86 که بیت غیراجرایی ندارند مانند نسخه ۳۲بیتی آنها کارامد است. قابلیت PaX در هسته لینوکس تعبیه نشده است و وصله آن باید به صورت دستی اعمال شود.

PaX برای شبیه‌سازی بیت غیراجرایی دو روش SEGMEXEC و PAGEEXEC را دارد. روش SEGMEXEC سربار کم ولی قابل محاسبه‌ای دارد، که به طور معمول مقداری ثابت و احتمالاتی کمتر از ۱٪ است که به دلیل استفاده از mirror در سطح حافظه مجازی برای جداسازی دسترسی داده و کد تحمیل شده است.
همچنین روش SEGMEXEC باعث می‌شود که فضای آدرس مجازی برای برنامه نصف شود و در نتیجه برنامه به فضای کمتری نسبت به حالت معمول دسترسی خواهد داشت. البته این مساله تا زمانی که برنامه به فضایی بیشتر از نصف حد معمول نیاز نداشته باشد دردسرساز نخواهد بود و این حالت دردسرساز نادر است. این روش باعث افزایش استفاده برنامه‌ها از حافظه سیستمی نمی‌شود و تنها فضای دسترسی آنها را محدودتر می‌کند. به عنوان نمونه در CPUهای ۳۲بیتی این فضا از ۳ گیگابایت به ۱.۵ گیگابایت کاهش می‌یابد.

در روش PAGEEXEC قابلیت PaX از فرایندی مشابه Exec Shield به عنوان تسریع در عملکرد استفاده می‌کند، اما زمانی که حافظه‌ی زیادی به عنوان فضای اجرایی نشان‌گذاری شود، این روش قابلیت حفاظت خود را از دست می‌دهد. در این حالت PaX از قابلیت قدیمی‌تر خود که مبتنی بر سربار متغیر است استفاده می‌کند تا از صفحات پایین بخش کد حفاظت کند. در موارد خاصی از الگوهای دسترسی به حافظه این عملیات سربار زیادی خواهد داشت. روش PAGEEXEC در CPUهایی که از بیت غیراجرایی پشتیبانی می‌کنند از همین قابلیت استفاده می‌کند و در نتیجه سرباری را تحمیل نخواهد کرد.

PaX برای حفاظت از حافظه در برابر برخی آسیب‌پذیری‌ها نشان‌گذاری برنامه‌ها را به کمک mprotect() کنترل می‌کند که ممکن است کارایی برخی از آنها را مختل کند. این قابلیت می‌تواند برای این برنامه‌ها غیرفعال شود.

PaX برای هر فایل اجرایی امکان کنترل و پیکربندی قابلیت‌های زیر را فراهم می‌کند:

* PAGEEXEC
* SEGMEXEC
* محدودیت‌های mprotect()
* شبیه‌سازی ترامپولین
* تصادفی‌کردن شروع بخش اجرایی
* تصادفی کردن شروع بخش مرتبط با mmap()

PaX هر دو ویژگی PT\_GNU\_STACK و PT\_GNU\_HEAP را در نظر نمی‌گیرد. در نسخه‌های قدیمی‌تر این گزینه‌ها در پیکربندی قابل دسترس بود ولی به دلیل مشکلات امنیتی حذف شده است زیرا بدون استفاده تلقی می‌شد. با غیرفعال کردن محدودیت‌های mprotect() می‌توان نتایجی مشابه PT\_GNU\_STACK تولید کرد، زیرا برنامه معمولا در ابتدای بارگزاری این محدودیت‌ها را بر روی پشته اعمال می‌کند. البته گاهی ممکن است این حالت رخ ندهد، که در اینصورت نیز با غیرفعال‌کردن PAGEEXEC و SEGMEXEC تمام محدودیت‌های فضای اجرایی برداشته می‌شود و مشابه محدودیت‌های اعمالی بر روی دستگاه‌های فاقد PaX می‌شود.

* سخت افزار پردازنده‌های قابل پشتیبانی: alpha، AMD64، IA-64، MIPS(32/64)،PA-RISC، PowerPC، SPARC
* شبیه سازی: IA-32(x86)
* سایر سخت‌افزارهای پشتیبانی‌شده: PowerPC (۳۲ و ۶۴ بیتی)، SPARC (۳۲ و ۶۴ بیتی)
* توزیع استاندارد: Alpine Linux
* تاریخ انتشار: ۱ اکتبر ۲۰۰۰

### macOS

macOS بر روی تمام CPUهایی که توسط Apple پشتیبانی می‌شوند، قابلیت بیت اجرایی را برای اینتل پشتیبانی می‌کند (از زمان اولین نسخه اینتل در MacOS X10.4.4 تا کنون).
در macOS X10.4 بیت غیراجرایی تنها برای حافظه پشته پشتیبانی می‌شود. در macoS X10.5 تمام پردازنده‌های ۶۴بیتی دارای بیت غیراجرایی در فضای پشته و هیپ هستند. این ویژگی در X86-64 (از core2 به بعد) و PowerPCهای ۶۴بیتی در نسل پنجم macOSها نیز وجود دارد.

### netBSD

معماری‌هایی که از NetBSD نسخه ۲ به بعد (ارائه شده در ۹ دسامبر ۲۰۰۴) پشتیبانی می‌کنند دارای حافظه پشته و هیپ غیراجرایی هستند.

معماری‌های
alpha،
amd64،
hppa،
i386 (به همراه
PAE)،
PowerPC(ibm4xx)،
sh5،
sparc(sun4m،sun4d) امکان کنترل این قابلیت را در سطح صفحه فراهم می‌کنند.

معماری‌های i386(بدون PAE) و سایر powerpcها (مانند macppc) فقط می‌توانند این قابلیت را در سطح محدوده کنترل کنند.

سایر معماری‌ها نیز از پشته و هیپ غیرقابل‌اجرا پشتیبانی نمی‌کنند و netBDS نیز به صورت پیشفرض شبیه‌سازی نرم‌افزاری برای استفاده از این قابلیت‌ها در این معماری‌ها ارائه نمی‌دهد.

### openBSD

درسیستم‌عامل
OpenBSD یک تکنولوژی به نام W^X وجود دارد که در صورت پشتیبانی پردازنده صفحات قابل نوشتن را به صورت غیراجرایی نشان‌گذاری می‌کند. در پردازنده‌های ۳۲بیتی X86، بخش کد تنها بخشی از فضای آدرس‌دهی را شامل می‌شود تا بدین ترتیب حفاظت تقریبی از فضای آدرس اجرایی صورت پذیرد.
نسخه ۳.۳ OpenBSD که در ۱ می ۲۰۰۳ منتشر شد اولین نسخه‌ای بود که شامل قابلیت W^X بود.

* سخت افزار پردازنده‌های قابل پشتیبانی: alpha، AMD64، HPPA ،SPARC
* شبیه سازی: IA-32(x86)
* سایر سخت‌افزارهای پشتیبانی‌شده: هیچ
* توزیع استاندارد: دارد
* تاریخ انتشار: ۱ می ۲۰۰۳

### Solaris

Solaris از نسخه ۲.۶(در سال ۱۹۹۷) به بعد روی پردازنده‌های SPARC قابلیت غیرفعال کردن اجرای کد در فضای پشته را دارد. همچنین از نسخه ۹ (در سال ۲۰۰۲) نیز قابلیت عدم اجرا در حافظه پشته در ازای هر فایل اجرایی وجود دارد.

### ویندوز

قابلیت بیت غیراجرایی اولین بار برای معماری X86 در ویندوز XP با service pack۲ (در سال ۲۰۰۴) و در
ویندوز سرور ۲۰۰۳ با service pack۱ (در سال ۲۰۰۵) عرضه شد. راهکار حفاظت از فضای آدرس اجرایی در ویندوز "جلوگیری از اجرای داده" (Data Execution Prevention) و به اختصار DEP نام دارد.

قابلیت بیت غیراجرایی در ویندوز xp و ویندوز سرور ۲۰۰۳ به صورت پیشفرض برای سرویس‌های حیاتی ویندوز تنطیم شده است. همچنین اگر یک پردازنده X86 این قابلیت را در سخت‌افزار خود پشتیبانی کند، در این دو نسخه ویندوز نیز این ویژگی به صورت پیشفرض فعال می‌شود و اگر چنین قابلیتی در این معماری وجود نداشته باشد، این قابلیت در ویندوز نیز در دسترس نخواهد بود.

نسخه‌های ابتدایی DEP تصادفی کردن چیدمان فضای آدرس‌(ASLR) را در نظر نگرفته بودند و احتمال حمله بازگشتی به libc وجود داشت و به وسیله آن می‌توانستند سیستم DEP را در زمان حمله از کار بیندازند.

مستندات روش PaX به طور دقیق دلیل لزوم وجود ASLR را شرح میدهد،
همچنین به عنوان یک اثبات مفهومی می‌توان جزئیات روشی را در نظر گرفت که DEP در صورت عدم وجود ASLR کارایی خود را از دست می‌دهد.
در صورتی که مهاجم آدرس داده‌های از پیش آماده شده مانند تصاویر و mp3ها را بداند می‌تواند یک حمله موفق داشته باشد.

مایکروسافت قابلیت ASLR را به ویندوز ویستا و ویندوز سرور ۲۰۰۸ افزود. در زیرساخت ارائه شده، DEP در هسته‌های ۶۴ بیتی به صورت پیشفرض و در نسخه‌های ۳۲ بیتی به کمک بهره‌گیری از هسته‌های PAE پیاده‌سازی شده است. در ویندوز ویستا DEP با نشان‌گذاری بخش‌هایی از حافظه آن‌ها را تنها به نگهداری از داده‌ها اختصاص می‌دهد که در پردازنده‌هایی با قابلیت بیت غیراجرایی، این بخش از حافظه غیراجرایی می‌باشد.
در ویندوز ویستا و نسخه‌های بالاتر از آن، فعال و یا غیرفعال بودن DEP برای هر پردازه از طریق گزینه Processes/Details در مدیریت وظایف ویندوز قابل مشاهده است.

ویندوز قابلیت DEP را به کمک Safe Structured Exception Handling" (SafeSEH)" مایکروسافت به صورت نرم‌افزاری و بدون نیاز به بیت غیراجرایی پیاده‌سازی کرده است. در برنامه‌هایی که به درستی کامپایل شده باشند، safeSEH کنترل می‌کند که خطای حین اجرای برنامه توسط هندلر خود برنامه که در زمان کامپایل وجود داشته است، مدیریت شود. با وجود چنین قابلیتی مهاجم نمی‌تواند هندلر خودش را در ورودی‌های بررسی نشده‌ی برنامه ذخیره و اجرا کند.

در صورتی که سخت‌افزار از بیت غیراجرایی پشتیانی کند در ویندوز به صورت پیشفرض فعال می‌شود. در ویندوز برنامه‌ها می‌توانند هم از طریق رابط کاربری و هم به کمک سرآیندهای موجود در فایل‌های PE صفحات غیرقابل اجرایشان را کنترل کنند. فراخوانی‌های موجود در Win32 به نام VirtualAlloc[Ex] و VirtualProtect[Ex] در زمان اجرا به برنامه امکان دسترسی به بیت غیراجرایی را میدهند. بدین ترتیب هر صفحه می‌تواند به صورت مجزا نشان اجرایی و یا غیراجرایی داشته باشد. هر دو قابلیت صفحه اجرایی و غیراجرایی از همان ابتدا تعبیه شده است. در CPUهایی که قبل از وجود بیت غیراجرایی طراحی شده است، وجود ویژگی اجرایی هیچ تاثیری نداشته است. در مستندات چنین است که این قابلیت امکان اجرا را فراهم می‌کند و در نتیجه برنامه‌نویسان نیز از آن به خوبی استفاده کرده‌اند. در قالب فایل PE نیز هر قسمتی به صورت جداگانه می‌تواند قابلیت اجرایش را مشخص کند. نشان اجرایی از زمان شروع در این قالب وجود داشته است و
linkerهای استاندارد، حتی از مدتها قبل از وجود بیت غیراجرایی، به درستی از این نشان استفاده می‌کنند. به همین دلیل ویندوز می‌تواند به راحتی قابلیت بیت غیراجرایی را روی برنامه‌های قدیمی نیز به کار بگیرد. اگر برنامه‌نویس برنامه را با توجه به بهترین ساختارها کامپایل کرده باشد، برنامه پس از به کارگبری قابلیت بیت غیراجرایی نیز عملکرد خودش را ادامه می‌دهد. تنها در چندین مورد مشکلاتی وجود داشته است. به عنوان نمونه محیط اجرایی .NET مایکروسافت با بیت غیراجرایی مشکل داشته و منجر به به‌روزرسانی در این برنامه شده است.

* سخت افزار پردازنده‌های قابل پشتیبانی: X86-64 (AMD64/ Intel 64)، IA-64، Efficeon، Pentium M، AMD Sempron
* شبیه سازی: دارد
* سایر سخت‌افزارهای پشتیبانی‌شده: هیچ
* توزیع استاندارد: نسخه‌های بعد از ویندوز XP
* تاریخ انتشار: ۶ آگوست ۲۰۰۴

### Xbox

در Xbox با وجود اینکه CPU از بیت غیراجرایی پشتیبانی نمی‌کند، اما در نسخه‌های جدیدتر XDK بخش کد به ابتدای بخش .data ی هسته محدود می‌شود (در شرایط معمول کدی پس از این بخش در حافظه قرار نمی‌گیرد). از نسخه 51xx به بعد این ویژگی به هسته‌ی Xbox افزوده شده است. این روش آسیب‌پذیری‌های قدیمی که از تبدیل شدن به TSR استفاده می‌کردند را مختل کرد.همچنین نسخه‌های جدیدتر برای پشتیبانی از این نسخه ارائه شدند که عملکرد اساسی را تحت تاثیر قرار نمی‌دادند.

## محدودیت‌ها

اگر کد در زمان اجرا نوشته و اجرا شود، مانند کامپایل درجا، از خود کامپایلر می‌توان برای ایجاد کد آسیب‌پذیری، به عنوان نمونه به کمک JIT spray استفاده کرد، چرا که به عنوان بخش اجرایی نشان‌گذاری شده است و در این ساختار شناسایی نمی‌شود.

برنامه‌نویسی مبتنی بر کد بازگشت
نیز به مهاجم این امکان را می‌دهد که با وجود به کارگیری روش حفاظت از فضای آدرس اجرایی کد دلخواهش را اجرا کند.

## جستارهای وابسته

* سرریز بافر
* حفاظت از سرریز بافر
* سرریز هیپ
* حفاظت از خردکردن پشته
* رشته قالب کنترل‌نشده

## منابع