Личный блог Suvan`a.

Работая и играя с Linux... И что из этого иногда получается.

Неисполнимая память.

Рубрика: Безопасность -> Укрепляем Linux
Метки: |
Среда, 3 июня 2009 г.
Просмотров: 4964

Проект РаХ представляется частью большого проекта Grsecurity. РаХ предоставляет защиту памяти, делая стек неисполнимым. В дополнение к этому РаХ предоставляет несколько других важных функций: например рандомизацию размещения адресного про­странства.


     Неисполнимая память. (NOEXEC)

     Самая распространенная форма атаки переполнения бу­фера представляется атака разрушения стека, при которой в буфер вставляется вредоносный код, а затем модифицируется адрес возврата таким образом, чтобы он указывал на начало данного кода.

Если сделать стек неисполнимым, то есть запретить выполнение любого кода, размещенного в стеке, такая атака станет невозможной. Данная техника не защищает стек от перезаписи - любая часть стека может быть перезаписана, просто она запрещает выполнение кода, размещенного в стеке.

     В большинстве архитектур возможность чтения памяти тесно связана с воз­можностью ее выполнения: раз память доступна для чтения, значит, ее мож­но выполнить. Первой задачей NOEXEC представляется разделение этих двух свойств, чтобы чтение и выполнение были независимы друг от друга.

     На платформе х86 это достаточно нетривиальная задача (на оставшихся архитек­турах она решается намного проще), приводящая к проигрышу в про­изводительности. Сейчас РаХ предоставляет два метода для реализации NOEXEC: PAGEEXEC и SEGMEXEC. Метод PAGEXEC использует фун­кции пейджинга процессора, снижая производительность. SEGMEXEC ис­пользует функцию сегментации процессора, что не затрагивает производи­тельность, зато снижает размер адресного пространства в два раза - с 3 Гб до 1,5 Гб.

     Первая проблема заключается в том, что NOEXEC поддерживается не все­ми приложениями. А вторая проблема возникает при использовании трам­плинов. Трамплины - это небольшие участки кода, созданные динамичес­ки во время выполнения процессом вложенных функций (это представляется не стандартной функцией С, а расширением GCC).

     К сожалению, трамплины сохраняются в стеке, что приводит к невозмож­ности их выполнения, если мы используем NOEXEC. Позже для решения этой проблемы в РаХ начала употребляться эмуляция трамплинов - данный метод называется EMUTRAP.