BC/NW 2006, №1, (8) : 14.1

 

 

АВТОМАТИЗАЦИЯ ПОИСКА УЯЗВИМОСТЕЙ В ПРОГРАММНОМ ОБЕСПЕЧЕНИИ

 

А.В. Дорфман, У.Р. Каримов

 

(Самара, Самарский государственный технический университет, Россия)

 

 

Переполнение буфера – наверное, одна из самых интересных и широко распространённых уязвимостей программного обеспечения. Сложность современных компьютерных систем неизбежно приводит к ошибкам проектирования и реализации. Эти ошибки заключаются в том, что в каком-либо месте программы происходит копирование данных из одного участка памяти в другой без проверки того, достаточно ли для них места там, куда их копируют. Область памяти, куда копируются данные, принято называть буфером. Таким образом, если данных слишком много, то часть их попадает за границы буфера – происходит «переполнение буфера».

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

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