Открыть сервис

NX-бит

NX-бит (от англ. No eXecute — «не исполнять») — это аппаратная функция процессора, используемая в архитектурах x86, x86-64, ARM и других, которая позволяет помечать области памяти как неисполняемые. Технология реализует принцип аппаратной защиты от выполнения кода в областях, предназначенных только для хранения данных, что является ключевым механизмом противодействия эксплуатации уязвимостей, связанных с переполнением буфера и внедрением вредоносного кода.

История

Идея разделения памяти на исполняемые и неисполняемые сегменты восходит к архитектурам 1960-х годов, в частности к системе Multics, где использовалась кольцевая защита. Однако в массовых процессорах x86 эта возможность долгое время отсутствовала. Первой коммерческой реализацией NX-бита на платформе x86 стала технология Execute Disable Bit (XD-бит), внедрённая компанией Intel в 2004 году в процессорах серии Pentium 4 (Prescott) и Xeon. Почти одновременно компания AMD представила аналогичную функцию под названием Enhanced Virus Protection (EVP) в процессорах AMD64 (начиная с Athlon 64 и Opteron).

Внедрение NX-бита было вызвано ростом числа атак, использующих переполнение буфера, когда злоумышленник записывал вредоносный код в область данных (например, в стек или кучу), а затем передавал управление на этот код. До появления NX-бита процессор не делал различий между данными и кодом, что позволяло выполнять произвольные инструкции из любой области памяти.

Принцип работы

NX-бит представляет собой один бит в записи таблицы страниц памяти (Page Table Entry, PTE). В архитектурах x86-64 и x86 с поддержкой PAE (Physical Address Extension) этот бит расположен в 63-м разряде PTE (для 64-битных систем) или в 63-м разряде расширенного PTE для PAE.

Операционная система при загрузке программ и распределении памяти устанавливает NX-бит для областей, предназначенных для хранения данных (стек, куча, глобальные переменные, буферы ввода-вывода). Области, содержащие исполняемый код (сегмент .text, динамические библиотеки), остаются исполняемыми.

Реализации в разных архитектурах

x86 и x86-64

ARM

В архитектуре ARM NX-бит реализован в виде бита XN (eXecute Never) в дескрипторах страниц памяти. Поддерживается начиная с ARMv6 (например, ARM11) и во всех последующих версиях (ARMv7, ARMv8-A). В процессорах ARMv8-A (64-битные) используется аналогичный механизм.

Другие архитектуры

Программная поддержка

Для использования NX-бита требуется поддержка со стороны операционной системы. Операционная система должна уметь устанавливать соответствующие флаги при создании страниц памяти.

Значение для безопасности

NX-бит является фундаментальным элементом современных механизмов защиты памяти. Он значительно усложняет эксплуатацию многих типов уязвимостей, в первую очередь — классических атак с переполнением буфера, когда злоумышленник пытается внедрить и выполнить произвольный код в стеке или куче.

Однако NX-бит не является панацеей. Существуют методы обхода этой защиты, наиболее известным из которых является Return-Oriented Programming (ROP). ROP позволяет выполнить произвольный код, не записывая его в неисполняемую память, а используя фрагменты существующего исполняемого кода (так называемые «гаджеты»), которые уже находятся в исполняемых областях памяти (например, в библиотеках). Для защиты от ROP применяются дополнительные механизмы, такие как ASLR (Address Space Layout Randomization), Shadow Stack (аппаратная защита стека) и Control-flow Integrity (CFI).

Критика и ограничения

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →