26 мар. 2009 г.

PaX. Часть первая.

Ниже перевод официальных доков про PaX - патч безопасности для линукса.

Цель проекта PaX - исследование различных защитных механизмов, направленных против эксплуатации ошибок в программном обеспечении, которые дают атакующему произвольный доступ на запись/чтение адресного пространства атакуемой программы. Этот класс ошибок, помимо прочего, содержит множество форм переполнения буфера (основанных на переполнении стека или кучи), уязвимостей форматной строки и т.п.

Необходимо понять, что основной акцент ставится не на поиске и устранении подобных ошибок, а, в большей степени, на предотвращение и изолирование атак на уязвимые приложения. Все такие атаки могут влиять на атакуемое приложение на трёх различных уровнях:

  1. Внедрение \ исполнение произвольного кода
  2. Исполнение существующего кода вне обычного порядка исполнения программы
  3. Исполнение существующего кода в обычном порядке и произвольными данными

Например, широко известная атака на внедрение shell-кода относится к (1), а так называемые return2libc атаки - к (2)

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

Исполнение кода (как внедрённого хакером, так и уже существующего в адресной области приложения) требует возможности изменения порядка исполнения приложения при использовании уже существующего кода. Такие изменения возникают при разыменовывании ссылок на функцию. Атакующий может вмещаться в процесс исполнения, если эта ссылка (указатель) находится в перезаписываемой памяти. Несмотря на привлекательность идеи вообще не хранить указатели на функции в перезаписываемой памяти, это, к сожалению, невозможно, поэтому необходим другой поход. Так как эти изменения должны происходить в общей области памяти, а проект PaX пока что заточен под ядро, они пока не реализованы.

Следующая категория возможностей, предоставляемых PaX - это одна из форм диверсификации: случайное распределение адресного пространства (Address Space Layout Randomization - ASLR). Основная идея этого подхода основана на том наблюдении, что большинство атак требуют предварительного знания различных адресов в атакуемом процессе. Если удастся вносить энтропию в эти адреса каждый раз при создании задачи, злоумышленник будет вынужден предполагать или подбирать эти адреса. Эти атаки довольно "шумные" (заметные), так как большинство неудачных попыток, скорее всего "уронят" атакуемую задачу (вызовут сбой в работе, но не дадут злоумышленнику выполнить код, а ведь сбой в работе привлечёт внимание администратора).

В следующем посте будет информация про последнюю возможность (ASLR) ближе.

Комментариев нет:

Отправить комментарий