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

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 →