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



В статье «Виды компьютерных уязвимостей» я немного рассказывал об уязвимости «Переполнение буфера», а в этой статье рассмотрим данную уязвимость подробнее.

Переполнение буфера (buffer overrun или buffer overflow) — это уязвимость, известная с момента появления компьютеров и существующая до сих пор. Даже первый само-распространяющийся Интернет-червь — Червь Морриса 1988 года — использовал переполнение буфера в Unix-демоне finger для распространения между машинами.

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

Лишние два байта данных, вышедшие за пределы отведенной области памяти, записываются вне её и стирают находящиеся там данные. Если таким образом будет уничтожен важный фрагмент данных, программа аварийно завершит работу. Рассмотрим пример уязвимой программы на языке Си:

#include <string.h>

int main(int argc, char *argv[])
{
	char buf[100];
	strcpy(buf, argv[1]);
	return 0;
}

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

Если запустить данную программу в системе Windows с аргументом, длина которого превышает 100 байт, скорее всего, работа программы будет аварийно завершена, а пользователь получит сообщение об ошибке. Следующая программа не подвержена данной уязвимости:

#include <string.h>

int main(int argc, char *argv[])
{
	char buf[100];
	strncpy(buf, argv[1], sizeof(buf));
	return 0;
}

Здесь strcpy заменена на strncpy, в которой максимальное число копируемых символов ограничено размером буфера.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Chinese (Traditional)EnglishJapaneseRussianUkrainian

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: