Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СРС_ИПОВС_МСЗИ.doc
Скачиваний:
41
Добавлен:
05.06.2015
Размер:
1.79 Mб
Скачать

Виды переполнения буфера

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

Как вы уже знаете из предыдущей главы, "Отказ в обслуживании", таким образом производится атака отказа в обслуживании. После него придется перезагружать компьютер, если же это будет центральный сервер сети, то последствия предугадать нетрудно.

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

Почему так много уязвимых программ

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

Обычно разработчики проверяют, достаточно ли памяти для размещения там переменной с необходимыми для работы данными. Если все сходится, они умывают руки и идут дальше. Когда же злоумышленник ищет в программе возможные "дыры", то проверяется работа приложения в экстремальных условиях. Иногда бывает так, что после выпуска программы она безупречно работает несколько лет, потому что ею правильно пользовались. Затем вдруг появляется хакер и задает интригующий вопрос: "а что если я дам программе другие виды данных" или "а что будет, если ввести больше информации, чем нужно?". Довольно мало программ осуществляют нормальный контроль за ошибками, поэтому как только появляются такие любопытствующие, приложения "умирают" одно за другим..

Возьмем, к примеру, программу Ping. Верой и правдой служила она людям больше чем 20 лет, без единого нарекания. Затем какая-то светлая голова догадалась в начале 90-х отправить пакеты ping с большим количеством данных, и системы во всем мире стали валится как деревья в ураган. Эта атака теперь известна как "смертельный ping" (ping of death), и она имела значительно влияние на Internet.

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

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

Пример переполнения буфера

Здесь представлен более конкретный пример переполнения буфера. Итак, пускай буфер рассчитан на 256 символов. Так как нет контроля за ошибками, хакер вводит в буфер 512 символов, что приводит к его переполнению. Это элементарный пример атаки DoS, злоумышленник пытается ввести в стек как можно больше данных, надеясь что это приведет к разрушению системы. Вот исходный код примера:

void func(char *str)

{

int i=0; char buffer[256];

while(str[i]!=’\0’)

{

buffer[i]=str[i];

i++;

}

buffer[i]=’\0’;

return;

}

Контейнер рассчитан на 256 символов, в него вводится 512, и готово типичное переполнение буфера.