Неисполнимая память.
Метки: Grsecurity | PaX
Среда, 3 июня 2009 г.
Просмотров: 1757
Проект РаХ представляется частью большого проекта Grsecurity. РаХ предоставляет защиту памяти, делая стек неисполнимым. В дополнение к этому РаХ предоставляет несколько других важных функций: например рандомизацию размещения адресного пространства.
Неисполнимая память. (NOEXEC)
Самая распространенная форма атаки переполнения буфера представляется атака разрушения стека, при которой в буфер вставляется вредоносный код, а затем модифицируется адрес возврата таким образом, чтобы он указывал на начало данного кода.
Если сделать стек неисполнимым, то есть запретить выполнение любого кода, размещенного в стеке, такая атака станет невозможной. Данная техника не защищает стек от перезаписи - любая часть стека может быть перезаписана, просто она запрещает выполнение кода, размещенного в стеке.
В большинстве архитектур возможность чтения памяти тесно связана с возможностью ее выполнения: раз память доступна для чтения, значит, ее можно выполнить. Первой задачей NOEXEC представляется разделение этих двух свойств, чтобы чтение и выполнение были независимы друг от друга.
На платформе х86 это достаточно нетривиальная задача (на оставшихся архитектурах она решается намного проще), приводящая к проигрышу в производительности. Сейчас РаХ предоставляет два метода для реализации NOEXEC: PAGEEXEC и SEGMEXEC. Метод PAGEXEC использует функции пейджинга процессора, снижая производительность. SEGMEXEC использует функцию сегментации процессора, что не затрагивает производительность, зато снижает размер адресного пространства в два раза - с 3 Гб до 1,5 Гб.
Первая проблема заключается в том, что NOEXEC поддерживается не всеми приложениями. А вторая проблема возникает при использовании трамплинов. Трамплины - это небольшие участки кода, созданные динамически во время выполнения процессом вложенных функций (это представляется не стандартной функцией С, а расширением GCC).
К сожалению, трамплины сохраняются в стеке, что приводит к невозможности их выполнения, если мы используем NOEXEC. Позже для решения этой проблемы в РаХ начала употребляться эмуляция трамплинов - данный метод называется EMUTRAP.