Чтение онлайн

на главную - закладки

Жанры

Защита от хакеров корпоративных сетей

авторов Коллектив

Шрифт:

Поиск функций, подверженных ошибкам

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

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

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

Переполнение

буфера, известное также как ошибка граничных условий, происходит в том случае, когда размер записываемых в память данных превышает размер выделенной для этого области памяти. Елиас Леви (Elias Levy), известный как Alephl, написал на эту тему статью «Smashing the Stack for Fun and Profit» («Разрушение стека для забавы и обогащения»). Со статьей можно ознакомиться в 49-ом выпуске Phrack, статья номер 14.

Посмотрите на следующую программу:

/* scpybufo.c */

/* Hal Flynn <mrhal@mrhal.com> */

/* December 31, 2001 */

/* scpybufo.c demonstrates the problem */

/* with the strcpy function which */

/* is part of the c library. This */

/* program demonstrates strcpy not */

/* sufficiently checking input. When */

/* executed with an 8 byte argument, a */

/* buffer overflow occurs. */

#include <stdio.h>

#include <strings.h>

int main(int argc, char *argv[])

{

overflow_function(*++argv);

return (0);

}

void overflow_function(char *b)

{

char c[8];

strcpy(c, b);

return;

}

В этой написанной на языке C программе приведен пример использования функции strcpy. Данные из массива argv [1], в котором хранится аргумент вызова программы, копируются функцией strcpy в массив символов, для которого при объявлении была выделена память для восьми символов. Поскольку в программе не выполняется никаких проверок размера пересылаемых данных, то при копировании более восьми символов происходит переполнение буфера. Функция sprintf — еще один пример часто встречающейся подверженной ошибкам функции. В результате ее применения возможно переполнение буфера, как это показано в следующем примере:

/* sprbufo.c */

/* Hal Flynn <mrhal@mrhal.com> */

/* December 31, 2001 */

/* sprbufo.c demonstrates the problem */

/* with the sprintf function which */

/* is part of the c library. This */

/* program demonstrates sprintf not */

/* sufficiently checking input. When */

/* executed with an argument of 8 bytes */

/* or more a buffer overflow occurs. */

#include <stdio.h>

int main(int argc, char *argv[])

{

overflow_function(*++argv);

return (0);

}

void overflow_function(char *b)

{

char c[8];

sprintf(c, “%s”, b);

return;

}

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

размера обрабатываемых данных также может привести к переполнению буфера, как это видно из следующего примера:

/* scatbufo.c */

/* Hal Flynn <mrhal@mrhal.com> */

/* December 31, 2001 */

/* scatbufo.c demonstrates the problem */

/* with the strcat function which */

/* is part of the c library. This */

/* program demonstrates strcat not */

/* sufficiently checking input. When */

/* executed with a 7 byte argument, a */

/* buffer overflow occurs. */

#include <stdio.h>

#include <strings.h>

int main(int argc, char *argv[])

{

overflow_function(*++argv);

return (0);

}

void overflow_function(char *b)

{

char c[8] = «0»;

strcat(c, b);

return;

}

Данные командной строки из массива argv [1] передаются функции overflow_function, которая сцепляет их с данными восьмибайтового массива символов с. Поскольку в программе размер сцепляемых данных не проверяется, то в результате возможен выход за границы массива c. Gets – еще одна проблематичная функция языка C. Компилятор GNU языка C выдает предупреждающее сообщение при компиляции программ с функцией gets, потому что эта функция никак не контролирует размер получаемых данных. Посмотрите на следующий пример:

/* getsbufo.c */

/* Hal Flynn <mrhal@mrhal.com> */

/* December 31, 2001 */

/* This program demonstrates how NOT */

/* to use the gets function. gets */

/* does not sufficient check input */

/* length, and can result in serious */

/* problems such as buffer overflows. */

#include <stdio.h>

int main

{

get_input;

return (0);

}

void get_input(void)

{

char c[8];

printf(“Enter a string greater than seven bytes: ”);

gets(c);

return;

}

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

Подробнее с проблемой переполнения буфера можно познакомиться в главе 8.

Ошибки проверки входных данных

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

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

Но перед этим приведем пример программы с уязвимой форматирующей строкой. Проанализируйте следующую программу:

Поделиться:
Популярные книги

На границе тучи ходят хмуро...

Кулаков Алексей Иванович
1. Александр Агренев
Фантастика:
альтернативная история
9.28
рейтинг книги
На границе тучи ходят хмуро...

Кодекс Охотника. Книга III

Винокуров Юрий
3. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Кодекс Охотника. Книга III

Последний попаданец 11. Финал. Часть 1

Зубов Константин
11. Последний попаданец
Фантастика:
фэнтези
юмористическое фэнтези
рпг
5.00
рейтинг книги
Последний попаданец 11. Финал. Часть 1

Книга пяти колец

Зайцев Константин
1. Книга пяти колец
Фантастика:
фэнтези
6.00
рейтинг книги
Книга пяти колец

Поступь Империи

Ланцов Михаил Алексеевич
7. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Поступь Империи

Купидон с топором

Юнина Наталья
Любовные романы:
современные любовные романы
7.67
рейтинг книги
Купидон с топором

Наследник в Зеркальной Маске

Тарс Элиан
8. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник в Зеркальной Маске

Совок 5

Агарев Вадим
5. Совок
Фантастика:
детективная фантастика
попаданцы
альтернативная история
6.20
рейтинг книги
Совок 5

Аномальный наследник. Том 1 и Том 2

Тарс Элиан
1. Аномальный наследник
Фантастика:
боевая фантастика
альтернативная история
8.50
рейтинг книги
Аномальный наследник. Том 1 и Том 2

Теневой путь. Шаг в тень

Мазуров Дмитрий
1. Теневой путь
Фантастика:
фэнтези
6.71
рейтинг книги
Теневой путь. Шаг в тень

Попаданка в академии драконов 2

Свадьбина Любовь
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
6.95
рейтинг книги
Попаданка в академии драконов 2

Гром над Империей. Часть 2

Машуков Тимур
6. Гром над миром
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Гром над Империей. Часть 2

Ритуал для призыва профессора

Лунёва Мария
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Ритуал для призыва профессора

Измена. Осколки чувств

Верди Алиса
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Осколки чувств