Лекция: Способы реализации атак переполнения буфера

 

Переполнение буфера (buffer overflow) – явление, возникающее, когда компьютерная программа записывает данные за пределами выделенного в памяти буфера. Атаки переполнения буфера – это класс компьютерных атак, основанных на возможности изменить ход исполнения атакуемой программы с помощью специально сформированных некорректных входных данных, вызывающих переполнение буфера.

Данная атака является самой распространенной уязвимостью в области безопасности программного обеспечения. Первая атака с применением данной уязвимости использовалась в вирусе-черве Морриса в 1988 г. С тех пор их число увеличивается с каждым годом. В настоящее время можно говорить, что уязвимости, связанные с переполнением буфера, являются доминирующими при удаленных атаках, где обычный пользователь сети получает частичный или полный контроль над атакуемым хостом. Анализ атак и обнаруженных уязвимостей последних лет показывает, что данная проблема является первостепенной. Так, большая часть выпусков CERT (Computer Emergency Response Team) связана с переполнением буфера.

Цели атаки переполнения буфера следующие:

1) чтение секретных переменных;

2) модификация секретных переменных;

3) передача управления на секретную функцию программы;

4) передача управления на код, переданный жертве самим злоумышленником.

Основа атак с использованием этой уязвимости – принцип функционирования операционных систем, где программа получает привилегии и права запустившего ее пользователя или процесса. Таким образом, менее привилегированный пользователь или процесс, который взаимодействует с данной программой, может использовать ее права в своих целях. Штатные средства программного обеспечения не позволяют выполнять такие действия. Однако «переполнение буфера» все же делает это возможным. Использование данной уязвимости подразумевает изменение хода выполнения привилегированной программы, например запуск командной оболочки с правами администратора.

Реализация атаки переполнения буфера требует решения двух подзадач:

1) подготовки кода, который будет выполняться в контексте привилегированной программы;

2) изменения последовательности выполнения программы с передачей управления подготовленному коду.

Методы решения этих двух подзадач могут служить основой классификации атак, связанных с переполнением буфера.

Рассмотрим пути решения подзадачи подготовки кода.

1. Подготавливаемый код представляет собой исполняемые машинные инструкции соответствующего процессора и может передаваться в программу в качестве ее параметра или команды. При этом параметр или команда сохраняются программой в отведенном для этого буфере. Буфер может находиться в любой области памяти: в стеке (локальные переменные), в динамически распределяемой памяти, в области статических данных. Например, программе, запрашивающей ввод строки, под видом строки может быть передан нужный атакующему код, которому в дальнейшем будет передано управление.

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

3. Если параметризированный код уже присутствует в адресном пространстве программы, то подготовки кода не требуется.

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

1) искажение адреса возврата из функции;

2) искажение указателя на функцию;

3) искажение таблиц перехода;

4) искажение указателей на данные.

Рассмотрим подробнее каждый способ.

еще рефераты
Еще работы по информатике