Защита от хакеров корпоративных сетей - страница 65
Последний, заслуживающий внимания метод поиска уязвимостей – это применение анализаторов. Анализаторы – это инструмент исследования уязвимостей, который применяется как средство поиска неисправностей или для отладки. Другими словами, анализаторы – это модули проверки текущего состояния программы. К сожалению, цели применения анализаторов могут быть разными.
Анализаторы могут применяться для контроля взаимодействия между системой и ее пользователями. С их помощью можно графически отображать происходящие в работе программы события, например генерацию последовательности чисел. Они также позволяют контролировать работу программ общего шлюзового интерфейса, определять предназначение программ CGI и даже собирать информацию о критических ошибках проектирования этих программ.
Анализаторы применяются совместно с ранее упомянутым аудитом документации проектирования. С их помощью проводятся исследования Web-интерфейсов или других сетевых протоколов, которые хотя и не являются общепризнанными стандартами, но широко используются.
Значение экспертизы исходного текста программы
Аудит исходных текстов программы должен быть предусмотрен при установке любой системы. Аудит исходных текстов предполагает поиск потенциально опасных (подверженных ошибкам) функций и методологии построчного анализа исходных текстов программы. Часто это затруднено из-за того, что исходный текст программы размещается в нескольких файлах, а не в одном. Например, исходный текст почтовых транспортных агентов, 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. Данные из массива