Execute Disable Bit
Execute Disable Bit (EDB) — это аппаратная функция безопасности, реализованная в процессорах архитектуры x86 и x86-64, которая позволяет пометить определённые области памяти как неисполняемые. Основное назначение EDB — предотвращение выполнения вредоносного кода, внедрённого в области памяти, предназначенные только для хранения данных (например, стек, куча, буферы данных). Функция является частью более широкой концепции NX (No-Execute) и DEP (Data Execution Prevention), реализуемой на уровне операционной системы и аппаратного обеспечения.
История
Разработка технологии EDB была обусловлена ростом числа атак, основанных на эксплуатации уязвимостей переполнения буфера. В таких атаках злоумышленник записывает вредоносный код (шелл-код) в область данных, а затем перенаправляет туда поток выполнения программы. До появления EDB процессоры не различали, какие области памяти предназначены для кода, а какие — для данных, что делало подобные атаки эффективными.
Первым процессором для массовых ПК, реализовавшим EDB, стал AMD Athlon 64, выпущенный в 2003 году. Компания AMD назвала эту функцию Enhanced Virus Protection (EVP). Компания Intel внедрила аналогичную технологию в процессоры серии Pentium 4, начиная с ревизии Prescott (2004 год), и назвала её Execute Disable Bit. Позднее обе технологии стали стандартной частью архитектуры x86-64 (AMD64/Intel 64).
В операционных системах поддержка EDB появилась с выходом Windows XP Service Pack 2 (2004 год), где функция получила название Data Execution Prevention (DEP). В Linux поддержка была добавлена в ядре версии 2.6.8 (2004 год) через патч Exec-Shield, а позже — через механизм NX (No-Execute). В macOS поддержка появилась с версии Mac OS X 10.4 Tiger (2005 год).
Принцип работы
EDB реализуется на уровне аппаратного управления памятью. Каждый процессор содержит модуль управления памятью (MMU), который при обращении к виртуальной памяти использует таблицы страниц. В каждой записи таблицы страниц (Page Table Entry, PTE) есть специальный бит, обозначающий, разрешено ли выполнение кода из данной страницы памяти.
- Если бит EDB (NX-бит) установлен в 1 (или, в зависимости от реализации, сброшен в 0), то процессор блокирует любую попытку выполнения кода из этой страницы.
- Если бит сброшен (или установлен), выполнение разрешено.
При попытке процессора выполнить инструкцию из страницы, помеченной как неисполняемая, генерируется исключение (page fault), которое передаётся операционной системе. ОС, в свою очередь, завершает процесс, вызвавший нарушение, или выполняет другие действия, предусмотренные политикой безопасности.
Различие между NX и EDB
Термины NX (No-Execute) и EDB (Execute Disable Bit) часто используются как синонимы, но исторически NX — это более общее название технологии, принятое в сообществе разработчиков ПО, а EDB — фирменное название компании Intel. В спецификациях AMD аналогичная функция называется EVP (Enhanced Virus Protection) или NX. В современных процессорах обе архитектуры поддерживают единый стандарт NX-бита.
Аппаратная реализация
EDB поддерживается на следующих архитектурах:
- x86 (32-битная): поддержка появилась на процессорах Intel Pentium 4 (Prescott) и AMD Athlon 64. В 32-битном режиме используется бит NX в расширенных таблицах страниц (PAE — Physical Address Extension). Без PAE (обычный 32-битный режим) поддержка EDB невозможна из-за отсутствия свободного бита в стандартной PTE.
- x86-64 (64-битная): поддержка является обязательной для всех процессоров, совместимых с архитектурой AMD64/Intel 64. В 64-битном режиме для NX-бита выделен отдельный бит в PTE (бит 63).
- ARM: аналогичная технология называется XN (Execute Never) и поддерживается начиная с архитектуры ARMv6 (2005 год).
Ограничения
- EDB работает только в том случае, если операционная система включает поддержку NX-бита. Если ОС не использует PAE (в 32-битном режиме) или не поддерживает 64-битный режим, функция неактивна.
- EDB не защищает от атак, использующих методы обхода NX, например, от атак «возврат в libc» (return-to-libc) или ROP (Return-Oriented Programming), где вредоносный код не внедряется, а используются уже существующие исполняемые участки памяти.
- В некоторых случаях (например, при работе с драйверами или программами, требующими исполнения кода из динамически выделяемой памяти) может потребоваться отключение EDB для отдельных процессов или страниц памяти.
Программная поддержка
Microsoft Windows
В Windows функция DEP (Data Execution Prevention) реализована на основе EDB. DEP может работать в двух режимах:
- Аппаратный DEP (Hardware DEP): использует NX-бит процессора. Доступен только в 64-битных версиях Windows или в 32-битных версиях при включённом PAE.
- Программный DEP (Software DEP): эмулирует защиту на уровне операционной системы, не требуя аппаратной поддержки. Менее эффективен.
Настройка DEP производится через панель управления («Система» → «Дополнительные параметры системы» → «Быстродействие» → «Предотвращение выполнения данных»). Пользователь может включить DEP для всех программ или для системных служб и выбранных приложений.
Linux
В Linux поддержка NX-бита реализована через механизм Exec-Shield (в ядрах до 2.6.8) и через стандартный NX (начиная с ядра 2.6.8). В современных дистрибутивах (например, Ubuntu, Fedora, Debian) NX включён по умолчанию для всех процессов. Для проверки поддержки NX используется команда cat /proc/cpuinfo | grep nx (наличие флага nx в строке flags).
macOS
В macOS (начиная с версии 10.4 Tiger) поддержка NX-бита включена по умолчанию для всех приложений, собранных для 64-битной архитектуры. Для 32-битных приложений NX может быть отключён, если они не помечены флагом NXEnabled в бинарном файле.
Критика и ограничения
Несмотря на значительное повышение безопасности, EDB не является панацеей. Основные недостатки:
- Не защищает от атак без внедрения кода: методы ROP, JOP (Jump-Oriented Programming) и return-to-libc используют только существующие исполняемые участки памяти, что делает EDB бесполезным против них.
- Необходимость совместимости: некоторые старые программы (особенно написанные на ассемблере или использующие динамическую генерацию кода, например, JIT-компиляторы) могут работать некорректно при включённом EDB. Для таких приложений может потребоваться отключение DEP.
- Зависимость от ОС: EDB не работает, если операционная система не использует PAE (в 32-битном режиме) или не поддерживает 64-битный режим. Это делает уязвимыми системы, работающие в 32-битном режиме без PAE (например, некоторые встраиваемые системы).
Применение
EDB является стандартной мерой защиты в современных операционных системах и используется в:
- Настольных и серверных ОС: Windows, Linux, macOS.
- Мобильных ОС: Android (начиная с версии 4.0) и iOS (начиная с версии 2.0) используют NX-бит для защиты приложений.
- Встраиваемых системах: многие RTOS (Real-Time Operating Systems) поддерживают NX, если процессор имеет соответствующий бит.
Интересные факты
- Технология EDB была впервые реализована в процессорах AMD, а не Intel. Intel внедрила её только через год после AMD.
- В процессорах Intel до архитектуры Nehalem (2008 год) EDB поддерживался только в 64-битном режиме. В 32-битном режиме без PAE он был недоступен.
- В некоторых процессорах AMD (например, серии K8) EDB мог быть отключён через BIOS, что приводило к снижению безопасности системы.
- Название «Execute Disable Bit» отражает прямой принцип работы: бит, который запрещает выполнение. В отличие от «No-Execute», где запрет подразумевается, EDB явно указывает на отключение.
Источники
- Intel 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A: System Programming Guide, Part 1.
- AMD64 Architecture Programmer’s Manual, Volume 2: System Programming.
- Microsoft TechNet: Data Execution Prevention (DEP).
- Linux Kernel Documentation: NX (No-Execute) support.
- «Smashing the Stack for Fun and Profit» by Aleph One (Phrack Magazine, 1996) — классическая статья, иллюстрирующая проблему, которую решает EDB.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →