Data Execution Prevention
Data Execution Prevention (DEP) — это аппаратно-программная технология защиты компьютерных систем, реализованная на уровне операционной системы и центрального процессора, предназначенная для предотвращения выполнения вредоносного кода из областей памяти, помеченных как неисполняемые. DEP является одним из ключевых механизмов защиты от атак, использующих переполнение буфера и другие уязвимости, связанные с внедрением и выполнением произвольного кода в областях данных (стеке, куче, пулах памяти).
История и предпосылки создания
Идея разделения памяти на исполняемые и неисполняемые области возникла в 1990-х годах как ответ на рост числа атак, основанных на переполнении буфера. Классическая архитектура x86 изначально не предусматривала аппаратного разделения прав на выполнение кода в различных сегментах памяти. Это позволяло злоумышленникам, используя уязвимости в программном обеспечении, записывать вредоносный код в область данных (например, в стек) и затем передавать на него управление.
Первые реализации защиты от выполнения кода в данных появились в операционных системах семейства BSD (OpenBSD, 2003 год) и в Linux (патчи PaX, 2000 год). В 2004 году корпорация Microsoft представила собственную реализацию DEP в составе пакета обновлений для Windows XP SP2. Одновременно с этим производители процессоров (AMD и Intel) начали внедрять аппаратные средства поддержки DEP, известные как NX-бит (No-eXecute) у AMD и XD-бит (eXecute Disable) у Intel.
Принцип работы
Основная идея DEP заключается в том, что операционная система, совместно с процессором, помечает определённые страницы виртуальной памяти как неисполняемые. Если программа пытается выполнить код из такой страницы, процессор генерирует исключение (например, #PF — page fault), которое перехватывается операционной системой. В результате процесс, нарушивший правило, аварийно завершается.
Аппаратная поддержка
Аппаратная DEP (Hardware-enforced DEP) использует специальный бит в таблицах страниц (Page Table Entry, PTE), который указывает, разрешено ли выполнение кода на данной странице. Этот бит называется NX (No-eXecute) в процессорах AMD и XD (eXecute Disable) в процессорах Intel. Для работы аппаратной DEP требуется:
- Процессор с поддержкой NX/XD-бита (все современные процессоры, начиная с AMD64 и Intel Pentium 4 Prescott).
- Операционная система, способная управлять этим битом (Windows XP SP2 и новее, Linux с ядром 2.6.8+, macOS 10.4.4+).
- Включение поддержки в BIOS/UEFI (часто называется «Execute Disable Bit» или «NX»).
Программная поддержка
Программная DEP (Software-enforced DEP) — это дополнительный механизм, реализованный на уровне операционной системы. Она не полагается на аппаратный NX-бит, а использует другие методы, такие как:
- Проверка исключений: Операционная система отслеживает исключения, возникающие при попытке выполнения кода из неисполняемой памяти, и анализирует их. Если исключение не связано с легальным использованием (например, с обработкой исключений в структурированных исключениях SEH), процесс завершается.
- Управление сегментацией: В некоторых архитектурах (например, в 32-битной x86) программная DEP может использовать сегментные дескрипторы для ограничения выполнения кода в определённых сегментах.
Программная DEP менее эффективна, чем аппаратная, так как может быть обойдена более сложными атаками (например, атаками на основе ROP — Return-Oriented Programming). Однако она обеспечивает защиту на системах, где аппаратная поддержка отсутствует или отключена.
Режимы работы DEP в Windows
В операционных системах Microsoft Windows DEP может работать в одном из нескольких режимов, настраиваемых через системные параметры (например, через панель управления или командную строку bcdedit):
- Включена для всех процессов (OptIn): DEP включена по умолчанию только для системных процессов и приложений, которые явно этого не запрещают. Пользовательские приложения могут быть исключены из-под действия DEP администратором.
- Включена для всех процессов, кроме выбранных (OptOut): DEP включена для всех процессов, за исключением тех, которые явно добавлены в список исключений. Этот режим обеспечивает максимальную защиту, но может вызывать проблемы совместимости с некоторыми старыми или неправильно написанными приложениями.
- Включена для всех процессов (AlwaysOn): DEP включена для всех процессов без возможности отключения. Этот режим используется в критически важных системах (например, в серверных версиях Windows).
- Отключена (AlwaysOff): DEP полностью отключена. Этот режим не рекомендуется к использованию, так как существенно снижает безопасность системы.
Классификация и типы DEP
DEP можно классифицировать по двум основным признакам:
- По способу реализации:
- Аппаратная DEP: Использует NX/XD-бит процессора. Обеспечивает наиболее надёжную защиту.
- Программная DEP: Использует методы операционной системы. Менее эффективна, но может работать на старых процессорах.
- По области применения:
- DEP для стека: Запрещает выполнение кода в области стека вызовов.
- DEP для кучи: Запрещает выполнение кода в области динамической памяти (кучи).
- DEP для пула памяти: Запрещает выполнение кода в системных пулах памяти (например, в ядре).
Применение и значение
DEP является фундаментальным компонентом современной модели безопасности операционных систем. Её основное значение заключается в предотвращении целого класса атак, известных как «атаки с выполнением кода» (code execution attacks). К таким атакам относятся:
- Переполнение буфера (buffer overflow): Злоумышленник записывает вредоносный код в стек или кучу, а затем перезаписывает адрес возврата, чтобы передать управление на этот код. DEP блокирует выполнение кода из этих областей.
- Атаки на основе ROP (Return-Oriented Programming): Хотя DEP не блокирует ROP напрямую (так как ROP использует существующие фрагменты кода), она вынуждает злоумышленников использовать более сложные и дорогостоящие методы, что значительно повышает порог атаки.
- Атаки на основе SEH (Structured Exception Handling): DEP может блокировать выполнение кода из обработчиков исключений, если они расположены в неисполняемой памяти.
Критика и ограничения
Несмотря на свою эффективность, DEP имеет ряд ограничений и критикуется за:
- Проблемы совместимости: Некоторые легальные приложения, особенно старые или написанные с использованием динамического кода (например, JIT-компиляторы, некоторые драйверы), могут пытаться выполнять код из областей данных. Это приводит к аварийному завершению таких приложений. Для решения этой проблемы разработчики могут использовать API-функции для явного выделения исполняемой памяти (например,
VirtualAllocс флагомPAGE_EXECUTE_READWRITE). - Неэффективность против ROP: DEP не предотвращает атаки, которые используют существующие фрагменты кода (гаджеты) в исполняемых областях памяти. Для защиты от ROP требуются дополнительные механизмы, такие как ASLR (Address Space Layout Randomization) и Control Flow Guard (CFG).
- Обход с помощью атак на ядро: Если злоумышленник получает доступ к ядру операционной системы, он может отключить DEP или изменить атрибуты страниц памяти.
Интересные факты
- Первая массовая реализация DEP в Windows (XP SP2) была программной и не использовала аппаратный NX-бит. Аппаратная поддержка была добавлена позже, в Windows Vista и Windows Server 2008.
- В процессорах ARM также существует аналог NX-бита, называемый XN (eXecute Never).
- В Linux поддержка аппаратного NX-бита была добавлена в ядро версии 2.6.8 (2004 год). В более старых ядрах использовались программные методы, такие как
exec-shieldиPaX. - DEP является обязательным требованием для сертификации безопасности многих государственных и корпоративных систем.
Источники
- Microsoft. «Data Execution Prevention (DEP)». Windows Dev Center.
- Intel Corporation. «Intel 64 and IA-32 Architectures Software Developer’s Manual». Volume 3A: System Programming Guide.
- AMD Corporation. «AMD64 Architecture Programmer’s Manual». Volume 2: System Programming.
- PaX Team. «PaX: The Guaranteed End of Arbitrary Code Execution».
- «Buffer Overflow Attacks: Detect, Exploit, Prevent». James C. Foster, Vitaly Osipov.
- «The Shellcoder’s Handbook: Discovering and Exploiting Security Holes». Chris Anley, John Heasman, Felix Lindner, Gerardo Richarte.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →