2015_лекции / Переполнение буфера
.pdfПереполнение буфера 3-его поколение
Форматирование строки
Уязвимые функции
printf – форматированная запись в стандартный поток
fprintf – форматированная запись в поток (в файл)
sprint – форматированный вывод в строку
vprintf - запись в стандартный поток с помощью
указателей на данные
Используемые параметры форматирования
%s - строка
%d - десятичное число
%x - шестнадцатеричное число
Пример корректного использования:
printf(\format %s%d", s, i)
Пример уязвимого кода
int vuln(char buffer[256]){ |
|
int nReturn=0 |
|
printf(buffer); |
//вывод в командную строку |
// printf("%s",buffer); |
// правильное решение |
return(nReturn);} |
|
void main(int argc,char *argv[])
{
char buffer[256]=""; |
|
// выделить буфер |
if (argc == 2){ |
|
|
strncpy(buffer,argv[1],255); |
// скопировать |
|
// второй аргумент из командной строки |
||
} |
|
|
vuln(buffer); |
// передать буфер «плохой» функции |
}
Переполнение буфера 3-его поколение
Управление кучей
Различные реализации управления кучей
древовидная структура
одно/двухнаправленный список
Указатель на следующий блок в цепочке |
|
|
Блок |
Указатель на предыдущий блок в |
|
цепочке |
памяти1 |
|
|
|
|
Размер |
|
|
|
Статус(free/busy) |
|
|
|
Память, выделяемая блоку. |
|
|
|
Склейка блоков:
указатель на следующий блок := указатель на предыдущий блок в цепочке
Механизмы предотвращения переполнения буфера
решения на основе стека
инструментальные решения
аппаратные решения
статические методы
решения на уровне операционной системы
анализ данных, фильтрация пакетов на наличие shell-кода.
Общие недостатки применения
механизмов, предотвращающих переполнение буфера
не существуют никаких надежных методик автоматического (или хотя бы полуавтоматического) поиска переполняющихся буферов
Статический поиск по шаблону PREfix, PREfast, АК-ВС, UCA,
FlawFinder, ITS4, RATS, FxCop. невозможность обнаружения уязвимостей, для которых отсутствуют сигнатуры.
фаззинг (fuzzing) OWASP JBroFuzz, Bunny the Fuzzer, SPIKE, PFF (Php Fuzzing Framework), ProxyFuzz
все разработанные методики борьбы с переполняющимися буферами снижают производительность, но не исключают возможность переполнения полностью, хотя и портят атакующему жизнь;
Решения на основе стека
StackGuard
Схематическое изображение стека с использование StackGuard
Решения на основе стека
LibSafe & LibVerify
Принцип работы LibSafe
Решения на основе стека
LibSafe & LibVerify
Принцип работы LibVerify
Решения на основе стека
Достоинства
Классическое переполнение стека
Недостатки
Пропускают все остальные виды узявимостей
Дополнительные вычислительные расходы до 125%