Уязвимость переполнения буфера

The 146X Project Dublikat Web Studio Avram Lincoln AL Service Navigator Knyaz

Tartuga

💰 Проверенный продавец
Регистрация
19.12.2019
Сообщения
93
Для начала, буфер — это область памяти, используемая программой для временного хранения данных при вводе или выводе.

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

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

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



Пример:

У нас есть код

#include <stdio.h>
int main(int argc, char **argv)
{
char buf[8];
gets(buf);
printf("%s\n", buf);
return 0;
}

Этот код считывает с ввода массив символов и копирует его в буфер типа char. Размер буфера был определен char buf [8]. После этого отображается содержимое буфера, и приложение завершает работу.

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

Но при этом функция printf() будет выводить ровно столько символов, сколько мы ввели, к примеру:

123456dpdpd9// наш ввод
123456dpdpd9 // вывод строки от printf
Segmentation fault

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



Рассмотрим также эксплойт Buffer Overrun in JPEG Processing (GDI +).

Файл библиотеки динамической ссылки Microsoft, называемый GDIPlus.dll, содержит библиотеки для интерфейса прикладного программирования графического интерфейса устройства (GDI +) (API). Это позволяет программистам представлять графические объекты и передавать их на устройства вывода(мониторы, принтеры). Эта DLL(Dynamic Link Library) включает в себя возможность обработки файлов изображений JPEG, но она нормализует объявленную длину области, предназначенной для комментариев в файле JPEG, до проверки ее значения. Это может привести к переполнению буфера.

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



Безопасность:

1)Защита от повреждения стека

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

2)Защита пространства исполняемого кода для Windows

Microsoft предложила своё решение, получившее название DEP (Data Execution Prevention), включив его в пакеты обновлений для windows XP. Данную штуку Microsoft естественно развивали, и сейчас она также присутствует в том числе и в windows 10.

3)Использование библиотек абстрактных типов данных, которые включают в себя проверку на переполнение.
 

📌 Золотая реклама

AnonPaste

Верх