Атрибут (біт) NX-Bit ( в термінології фірми AMD) або XD-Bit ( в термінології фірми Intel) — біт заборони виконання, доданий до атрибутів сторінок пам'яті для реалізації можливості запобігання виконання даних як коду. Використовується для запобігання уразливості типу «переповнення буфера», що дозволяє виконувати довільний код на атакується системі локально або віддалено. Технологія вимагає програмної підтримки (див. ) з боку ядра операційної системи.

Підтримка у процесорних архітектурах

x86 
NX (XD) — атрибут (біт) сторінки пам'яті в архітектурах x86 і x86-64, доданий для захисту системи від помилок програм, а також використовують їх вірусів, троянських коней та інших шкідливих програм.

Фірма AMD назвала біт «NX» від англ. no execute. Фірма Intel назвала той же біт «XD» від англ. execution disable.

Оскільки в сучасних комп'ютерних системах пам'ять розділяється на сторінки, що мають певні атрибути, розробники процесорів додали ще один: заборона виконання коду на сторінці. Тобто, така сторінка може бути використана для зберігання даних, але не програмного коду. При спробі передати управління на таку сторінку виникне переривання, ОС отримає управління і завершить програму. Атрибут захисту від виконання давно присутній в інших [яких?] Мікропроцесорних архітектурах; однак, в x86-системах такий захист реалізовувалася тільки на рівні програмних сегментів, механізм яких давно не використовується сучасними ОС. Тепер вона додана ще і на рівні окремих сторінок.

Сучасні програми чітко розділяють на сегменти коду («text»), даних («data»), неініціалізованих даних («bss»), а також область пам'яті, що динамічно виділяється (поділяється на купу («heap») і програмний стек). Якщо програма написана без помилок, покажчик команд ніколи не вийде за межі сегментів коду; однак, в результаті програмних помилок, перехід може бути здійснено в інші області пам'яті. При цьому процесор перестане виконувати якісь запрограмовані дії, а буде виконувати випадкову послідовність команд, за які він буде приймати дані, до тих пір, поки не зустріне неприпустиму послідовність, або спробує виконати операцію, що порушує цілісність системи, яка викличе спрацьовування системи захисту. В обох випадках програма завершиться аварійно. Також процесор може зустріти послідовність команд, що спричиняє нескінченний цикл, і програма «зависне», забравши 100 % процесорного часу. Для запобігання подібним випадкам і був введений цей додатковий атрибут: якщо деяка область пам'яті не призначена для зберігання програмного коду, то всі її сторінки повинні позначатися NX-бітом, і у разі спроби переходу на таку ділянку пам'яті процесор сформує виняткову ситуацію і операційна система негайно аварійно завершить програму, сигналізуючи вихід за межі сегмента (SIGSEGV).

Основним мотивом введення цього атрибута була не стільки забезпечення швидкої реакції на подібні помилки, скільки те, що дуже часто такі помилки використовувались зловмисниками для несанкціонованого доступу до комп'ютерів, а також написання вірусів. З'явилася величезна кількість таких вірусів і черв'яків, що використовують уразливості в поширених програмах.

Один із сценаріїв атак полягає в тому, що скориставшись переповненням буфера в програмі (найчастіше це демон, що надає деякий мережевий сервіс), спеціально написана шкідлива програма (експлойт) може записати деякий код в область даних вразливою програми таким чином, що в результаті помилки цей код отримає управління і виконає дії, запрограмовані зловмисником (найчастіше це запит виконати програму-оболонку ОС, за допомогою якої зловмисник отримає контроль над вразливою системою з правами власника вразливою програми; дуже часто це root).

Технічні деталі 
Переповнення буфера часто виникає, коли розробник програми виділяє певну область даних (буфер) фіксованої довжини, вважаючи, що цього буде достатньо, але потім, маніпулюючи даними, ніяк не перевіряє вихід за її межі. У результаті надходять дані займуть області пам'яті, їм не призначені, знищивши наявну там інформацію. Дуже часто тимчасові буфери виділяються всередині процедур (підпрограм), пам'ять для яких виділяється в програмному стеку, в якому також зберігаються адреси повернень в зухвалу підпрограму. Ретельно дослідивши код програми, зловмисник може виявити такий баг, і тепер йому достатньо передати в програму таку послідовність даних, обробивши яку програма помилково замінить адресу повернення в стеку на адресу, потрібну зловмисникові, який також передав під виглядом даних деякий програмний код. Після завершення підпрограми виконується команда повернення з процедури (RET), таким чином запускається процедура зловмисника, — контроль над комп'ютером отриманий.

Завдяки атрибуту NX, таке стає неможливим. Область стека позначається NX-бітом і будь-яке виконання коду в ньому заборонено. Тепер же, якщо передати керування стеку, то спрацює захист. Хоч програму і можна змусити аварійно завершитися, але використовувати її для виконання довільного коду стає дуже складно (для цього буде потрібно помилкове зняття програмою NX-захисту).

Однак, деякі програми використовують виконання коду в стеці або купі. Таке рішення може бути пов'язано з оптимізацією, динамічної компіляцією або просто оригінальним технічним рішенням. Зазвичай, операційні системи надають системні виклики для запиту пам'яті з дозволеною функцією виконання якраз для таких цілей, проте багато старих програм завжди вважають всю пам'ять придатною для зберігання коду. Для запуску таких програм під Windows доводиться відключати функцію NX на весь сеанс роботи, і щоб увімкнути її знову, потрібне перезавантаження. Хоча в Windows і передбачений механізм білого списку програм, для яких відключений DEP, проте даний метод не завжди працює коректно. Прикладом такої програми може служити Iris.

NX-біт є найстаршим розрядом елемента 64-бітових таблиць сторінок, використовуваних процесором для розподілу пам'яті в адресному просторі. 64-розрядні таблиці сторінок використовуються операційними системами, що працюють в 64-бітному режимі, або з увімкненим розширенням фізичних адрес (PAE). Якщо ОС використовує 32-розрядні таблиці, то можливості використовувати захист сторінок від виконання немає.

ARM

SPARC

PA-RISC

Джерела 

Алгоритми керування пам'яттю
Виявлення та виправлення помилок