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

Шрифт
Интервал


Значение экспертизы исходного текста программы

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

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

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

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

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

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

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


>/* scpybufo.c */

>/* Hal Flynn */

>/* 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

>#include

>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. Данные из массива