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.
- Если бит установлен в 1, страница помечается как неисполняемая. Любая попытка передать управление на код, находящийся на этой странице, вызывает исключение (страничную ошибку, page fault).
- Если бит сброшен (0), страница является исполняемой.
Операционная система при загрузке программ и распределении памяти устанавливает NX-бит для областей, предназначенных для хранения данных (стек, куча, глобальные переменные, буферы ввода-вывода). Области, содержащие исполняемый код (сегмент .text, динамические библиотеки), остаются исполняемыми.
Реализации в разных архитектурах
x86 и x86-64
- Intel: XD-бит (Execute Disable). Поддерживается начиная с Pentium 4 (Prescott) и всех последующих процессорах, включая Core, Xeon, Atom.
- AMD: EVP (Enhanced Virus Protection) или NX-бит. Поддерживается начиная с AMD64 (K8) и во всех последующих архитектурах (K10, Bulldozer, Zen).
- VIA Technologies: NX-бит реализован в процессорах C7 и Nano.
ARM
В архитектуре ARM NX-бит реализован в виде бита XN (eXecute Never) в дескрипторах страниц памяти. Поддерживается начиная с ARMv6 (например, ARM11) и во всех последующих версиях (ARMv7, ARMv8-A). В процессорах ARMv8-A (64-битные) используется аналогичный механизм.
Другие архитектуры
- PowerPC: поддержка NX-бита появилась в спецификации Power ISA 2.03 (2005 год) и реализована в процессорах POWER6 и более новых.
- MIPS: поддержка NX-бита добавлена в архитектуру MIPS32/64 Release 2 (2005 год) и реализована в процессорах MIPS32 24Kc и более новых.
- RISC-V: в стандартной архитектуре RISC-V поддержка NX-бита предусмотрена в расширении для управления памятью (S-mode).
Программная поддержка
Для использования NX-бита требуется поддержка со стороны операционной системы. Операционная система должна уметь устанавливать соответствующие флаги при создании страниц памяти.
- Microsoft Windows: поддержка NX-бита (называется Data Execution Prevention, DEP) впервые появилась в Windows XP Service Pack 2 (2004 год) и Windows Server 2003 Service Pack 1. DEP может работать в аппаратном режиме (при наличии NX-бита) или в программном режиме (эмуляция). В Windows 10 и 11 DEP включён по умолчанию для всех процессов.
- Linux: поддержка NX-бита реализована начиная с ядра версии 2.6.8 (2004 год). В современных дистрибутивах (Ubuntu, Debian, Fedora, CentOS) NX-бит включён по умолчанию для всех исполняемых файлов, собранных с поддержкой этой функции (флаг
-z execstack). - macOS: поддержка NX-бита реализована начиная с Mac OS X 10.4 (Tiger) для процессоров Intel и с Mac OS X 10.5 (Leopard) для PowerPC.
- Android: поддержка NX-бита реализована начиная с Android 4.0 (Ice Cream Sandwich) и включена по умолчанию в современных версиях.
- iOS: поддержка NX-бита реализована в iOS 4.3 и более поздних версиях.
Значение для безопасности
NX-бит является фундаментальным элементом современных механизмов защиты памяти. Он значительно усложняет эксплуатацию многих типов уязвимостей, в первую очередь — классических атак с переполнением буфера, когда злоумышленник пытается внедрить и выполнить произвольный код в стеке или куче.
Однако NX-бит не является панацеей. Существуют методы обхода этой защиты, наиболее известным из которых является Return-Oriented Programming (ROP). ROP позволяет выполнить произвольный код, не записывая его в неисполняемую память, а используя фрагменты существующего исполняемого кода (так называемые «гаджеты»), которые уже находятся в исполняемых областях памяти (например, в библиотеках). Для защиты от ROP применяются дополнительные механизмы, такие как ASLR (Address Space Layout Randomization), Shadow Stack (аппаратная защита стека) и Control-flow Integrity (CFI).
Критика и ограничения
- Неполнота защиты: NX-бит не защищает от атак, не требующих внедрения кода в данные (например, ROP, атаки на целостность данных, атаки на указатели).
- Совместимость: Некоторые старые программы и драйверы могут использовать исполняемый стек или кучу (например, для динамической генерации кода или JIT-компиляции). Для таких программ может потребоваться отключение NX-бита, что снижает безопасность.
- Производительность: Установка NX-бита не оказывает значительного влияния на производительность, так как является операцией на уровне таблиц страниц, выполняемой при загрузке программы. Однако неправильное использование (например, частая смена флагов) может привести к снижению производительности.
Интересные факты
- В процессорах Intel до внедрения XD-бита (Pentium III, Pentium 4 Willamette/Northwood) существовала возможность аппаратной поддержки NX-бита через механизм PAE, но она не была задокументирована и не поддерживалась операционными системами.
- В некоторых процессорах ARM (например, ARMv5) NX-бит отсутствует, что делает их уязвимыми для классических атак с переполнением буфера. Это одна из причин, по которой ARMv6 и более новые версии стали стандартом для современных мобильных устройств.
- Технология NX-бита является обязательным требованием для сертификации безопасности по стандартам Common Criteria (EAL4+) и для работы с защищёнными операционными системами (например, Windows 10/11 в режиме Secure Boot).
Источники
- Intel 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A: System Programming Guide.
- AMD64 Architecture Programmer’s Manual, Volume 2: System Programming.
- ARM Architecture Reference Manual, ARMv7-A and ARMv8-A editions.
- Microsoft Docs: Data Execution Prevention (DEP).
- Linux Kernel Documentation:
Documentation/admin-guide/kernel-parameters.rst(разделnoexec). - Common Criteria for Information Technology Security Evaluation, Part 3: Security Assurance Components.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →