Відкрити головне меню

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

ОписРедагувати

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

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

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

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

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

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

Технічні деталіРедагувати

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

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

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

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

ДжерелаРедагувати