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

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 можно классифицировать по двум основным признакам:

  1. По способу реализации:
  • Аппаратная DEP: Использует NX/XD-бит процессора. Обеспечивает наиболее надёжную защиту.
  • Программная DEP: Использует методы операционной системы. Менее эффективна, но может работать на старых процессорах.
  1. По области применения:
  • 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 является обязательным требованием для сертификации безопасности многих государственных и корпоративных систем.

Источники

  1. Microsoft. «Data Execution Prevention (DEP)». Windows Dev Center.
  2. Intel Corporation. «Intel 64 and IA-32 Architectures Software Developer’s Manual». Volume 3A: System Programming Guide.
  3. AMD Corporation. «AMD64 Architecture Programmer’s Manual». Volume 2: System Programming.
  4. PaX Team. «PaX: The Guaranteed End of Arbitrary Code Execution».
  5. «Buffer Overflow Attacks: Detect, Exploit, Prevent». James C. Foster, Vitaly Osipov.
  6. «The Shellcoder’s Handbook: Discovering and Exploiting Security Holes». Chris Anley, John Heasman, Felix Lindner, Gerardo Richarte.

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

На главную BFOmetr →