- •1.3.1.2. По цели. С точки зрения защиты, атаки можно рассматривать, как направленные на конкретные составляющие безопасности - конфиденциальность, целостность и доступность.
- •1.3.1.3. По характеру взаимодействия с жертвой. Относительно характера взаимодействия злоумышленника с системой все удаленные атаки можно разделить на "интерактивные" и "безусловные".
- •I am in a harry, I promise you will love it! Attachment: gone.Scr
- •1.3.3.2. Отказ в обслуживании
- •1.3.3.3. Маскировка
- •1.3.3.4. Атаки на маршрутизацию
- •1.3.3.5. Атаки на серверы: cgi и http
- •1.3.3.6. Атаки на клиентов: ActiveX, Java и другие
- •1.3.3.7. Переполнение буфера.
1.3.3.7. Переполнение буфера.
Способ под названием переполнение буфера (англ. buffer overflow) — это большой отдельный класс атак, основанный на возможности изменить ход исполнения атакуемой программы с помощью специально сформированных некорректных входных данных. Переполнение буфера используется различными зловредными программами и атаками: вирусами, программами повышения полномочий, удаленными атаками на сервера и клиентов. Те специалисты, которые отслеживают появления информационных бюллетеней по безопасности, согласятся, что такие атаки очень актуальны и в настоящее время.
Способ основан на том, что все программы для своей работы используют некоторые данные, получаемые, возможно и не от авторизованных клиентов. Обработкой полученных данных в программе занимается некоторая функция (или метод, если говорить языком объектно-ориентированного программирования). При этом предполагается, что данные, подлежащие обработке, имеют некоторый, заранее предопределенный формат, скажем, введенный пароль состоит не более чем из 15 символов.
Перед обработкой полученные данные (в нашем случае — пароль) будут записаны в некоторую переменную, место памяти которой будет выделено в некотором оперативном пространстве, которое и называется стеком. Не вдаваясь в особенности функционирования стека, скажем, что в нем же хранится и служебная информация, например, адрес возврата исполнения программного кода, куда программа должна будет вернуть управление после завершения работы данной функции (метода) — в нашем случае, после обработки пароля.
А теперь представим, что введенный пароль оказался длиной не 15 символов, а гораздо больше, настолько, что данные, вводимые как пароль, при записи в стек, "затерли" команды возврата управления. В этом случае скорее всего, программа не сможет продолжать исполнение инструкций кода и прекратит работу с сообщением об ошибке.
Если же предположить, что данные, вводимые как пароль, были не бессмысленным набором символов, а тщательно подобранными двоичными байтами, то при возврате управления из функции (метода) вполне можно добиться, чтобы они были интерпретированы программой как корректный код процессора и выполнены компьютером (рис. 11.5). Тогда получается, что программа анализа пароля (то есть часть программы аутентификации, а следовательно, процесс с достаточно высокими привилегиями), выполнила инструкции, направленные пользователем, который еще не был авторизован (он еще только вводил пароль), возможно, злоумышленником.
Естественно, данный пример утрирован. Реально программы аутентификации пишутся без возможностей реализации таких атак, хотя то, что о них ничего не известно, еще не означает, что их нет или не будет через некоторое время. Даже в приведенном нами примере опытные программисты сразу укажут ряд возможностей избежать подобных уязвимостей. Это и проверка данных на соответствие предопределенному размеру перед началом обработки, и корректная обработка исключительных ситуаций, когда программа возвращает код ошибки, и специальное размещение данных в стеке, и т.п. Вся беда заключается в том, что в программах на сотни строк кода, да еще создаваемых различными программистами, не всегда уделяется должное внимание таким подозрительным моментам.
В качестве реального примера приведем сообщение CERT Advisory CA-2001-21 Buffer Overflow in telnetd. Telnetd — это программа-сервер, обеспечивающая работу удаленных виртуальных терминалов. В данном случае результат выполнения функции telrcv сохраняется в буфере фиксированного размера, при этом предполагается, что размер результата меньше, чем размер буфера. Если же результат окажется по размеру большим, даже еще и сформированным специальным образом, то это может привести к сбою в работе сервера (отказ в обслуживании) или выполнению постороннего кода с привилегиями программы telnetd (обычно привилегии root).