Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Удаленные атаки на корпоративные сети.doc
Скачиваний:
42
Добавлен:
10.12.2013
Размер:
192 Кб
Скачать

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

Способ под названием переполнение буфера (англ. buffer overflow) — это большой отдельный класс атак, основанный на возможности изменить ход исполнения атакуемой программы с помощью специально сформированных некорректных входных данных. Переполнение буфера используется различными зловредными программами и атаками: вирусами, программами повышения полномочий, удаленными атаками на сервера и клиентов. Те специалисты, которые отсле­живают появления информационных бюллетеней по безопасности, согласятся, что такие атаки очень актуальны и в настоящее время.

Способ основан на том, что все программы для своей работы используют некоторые данные, получаемые, возможно и не от авторизованных клиен­тов. Обработкой полученных данных в программе занимается некоторая функция (или метод, если говорить языком объектно-ориентированного программирования). При этом предполагается, что данные, подлежащие обработке, имеют некоторый, заранее предопределенный формат, скажем, введенный пароль состоит не более чем из 15 символов.

Перед обработкой полученные данные (в нашем случае — пароль) будут за­писаны в некоторую переменную, место памяти которой будет выделено в некотором оперативном пространстве, которое и называется стеком. Не вдаваясь в особенности функционирования стека, скажем, что в нем же хранится и служебная информация, например, адрес возврата исполнения программного кода, куда программа должна будет вернуть управление после завершения работы данной функции (метода) — в нашем случае, после об­работки пароля.

А теперь представим, что введенный пароль оказался длиной не 15 симво­лов, а гораздо больше, настолько, что данные, вводимые как пароль, при записи в стек, "затерли" команды возврата управления. В этом случае скорее всего, программа не сможет продолжать исполнение инструкций кода и прекратит работу с сообщением об ошибке.

Если же предположить, что данные, вводимые как пароль, были не бес­смысленным набором символов, а тщательно подобранными двоичными байтами, то при возврате управления из функции (метода) вполне можно добиться, чтобы они были интерпретированы программой как корректный код процессора и выполнены компьютером (рис. 11.5). Тогда получается, что программа анализа пароля (то есть часть программы аутентификации, а следовательно, процесс с достаточно высокими привилегиями), выполнила инструкции, направленные пользователем, который еще не был авторизован (он еще только вводил пароль), возможно, злоумышленником.

Естественно, данный пример утрирован. Реально программы аутентифика­ции пишутся без возможностей реализации таких атак, хотя то, что о них ничего не известно, еще не означает, что их нет или не будет через некото­рое время. Даже в приведенном нами примере опытные программисты сра­зу укажут ряд возможностей избежать подобных уязвимостей. Это и провер­ка данных на соответствие предопределенному размеру перед началом обработки, и корректная обработка исключительных ситуаций, когда про­грамма возвращает код ошибки, и специальное размещение данных в стеке, и т.п. Вся беда заключается в том, что в программах на сотни строк кода, да еще создаваемых различными программистами, не всегда уделяется должное внимание таким подозрительным моментам.

В качестве реального примера приведем сообщение CERT Advisory CA-2001-21 Buffer Overflow in telnetd. Telnetd — это программа-сервер, обеспе­чивающая работу удаленных виртуальных терминалов. В данном случае ре­зультат выполнения функции telrcv сохраняется в буфере фиксированного размера, при этом предполагается, что размер результата меньше, чем раз­мер буфера. Если же результат окажется по размеру большим, даже еще и сформированным специальным образом, то это может привести к сбою в работе сервера (отказ в обслуживании) или выполнению постороннего кода с привилегиями программы telnetd (обычно привилегии root).