Коллектив авторов - Защита от хакеров корпоративных сетей
Используя четыре спецификации преобразования %n и четыре адреса памяти, младшие биты записываемых целых чисел побайтно формируют нужные слова.
На некоторых платформах, например платформах с архитектурой RISK (архитектура RISK (Reduced Instruction Set Computer) – архитектура с сокращенным набором команд. Тип архитектуры микропроцессора, ориентированный на быстрое и эффективное выполнение относительно небольшого набора встроенных команд), запрещено при записи использовать адрес, не выровненный на границу двух байт. Во многих случаях это ограничение удается снять, используя запись коротких целых чисел при помощи спецификации преобразования %hn.
Рис. 9.1. Получение адреса с помощью четырех операций записиВозможность построения произвольных значений целых чисел путем последовательности операций записи – наиболее серьезный способ использования уязвимости форматирующей строки. Он позволяет злоумышленнику полностью контролировать программу, подменяя правильные указатели на указатели злоумышленника. Если злоумышленник воспользуется уязвимостью этим способом, то он сможет, используя программную ошибку атакованной программы, заставить атакованный процесс выполнить нужный ему управляющий программный код.
Что перезаписывать?
Имея возможность использовать любые значения почти в любом месте памяти, перед злоумышленником встает вопрос: «Что перезаписывать?» Обладая возможностью использовать практически любой адрес памяти, у злоумышленника большой выбор. Он может изменить адрес точки возврата функции аналогично тому, как это делается при переполнении буфера. С помощью перезаписи адресов возврата может быть выполнен управляющий программный код злоумышленника. Но в отличие от переполнения буфера злоумышленник не ограничивает себя только подменой адресов возврата.
Перезапись адресов возвратаБольшинство атак переполнения буфера сводятся к перезаписи адреса возврата какой-либо функции на адрес управляющего кода злоумышленника. Модифицированная подобным образом функция в конце своей работы передает управление не в точку возврата, а по подмененному злоумышленником адресу. При переполнении буфера перезаписывается адрес возврата из-за того, что фактически больше нечего перезаписывать. При атаках переполнения буфера злоумышленник не указывает точного адреса перезаписываемой области памяти. Запись ведется в области памяти, находящейся рядом с атакуемым буфером. В отличие от атак переполнения буфера при использовании уязвимости форматирующей строки данные злоумышленника записываются в указанную им область. Адрес области задается переменной, соответствующей спецификации преобразования %n. При завершении функции управление будет передано по адресу, записанному злоумышленником в результате многократной записи с использованием нескольких спецификаций преобразования %n.
При перезаписи адресов возврата злоумышленник может столкнуться с двумя проблемами. Одна из них состоит в том, что функция, у которой делается попытка подменить адрес возврата, в конце своей работы не возвращает управление вызвавшей ее функции. При использовании уязвимости форматирующей строки это обычное явление, потому что в большинстве случаев атакуемая функция выдает диагностическое сообщение и после выдачи диагностики инициирует аварийное завершение программы. Другими словами, выводится сообщение об ошибке, возможно, с использованием передаваемых программе данных, которые используются как параметры форматирующей строки, а затем вызывается функция завершения программы exit(). В этом случае перезапись адреса возврата для любой функции, кроме printf(), ничего не даст. Второй проблемой является то, что перезапись адресов возврата может пресекаться специальными средствами, например StarckGard.
Перезапись указателей таблицы глобальных смещений и указателей на функцииТаблица глобальных смещений (GOT – Global Оffset Table) – это секция в скомпонованной в формате ELF (executable and linkable format – формат исполняемых и компонуемых модулей) программе, в которой хранятся указатели на используемые программой библиотечные функции. Если заменить содержащийся в таблице GOT указатель так, чтобы вместо библиотечной функции он указывал на программный код злоумышленника, то при обращении к библиотечной функции с подмененным указателем будет вызван код злоумышленника.
Не все уязвимые выполнимые файлы, которые злоумышленник может использовать в своих целях, представлены в формате ELF. Прежде всего это касается широко распространенных указателей на функции, которые используются для вызова функций. Указатели функций – определенные в программе переменные, которые слабо защищены от атак злоумышленника. Для того чтобы злоумышленник смог выполнить свою программу, ему необходимо найти в программе вызов функции по ссылке с использованием указателя функции.Пример уязвимой программы
На примере уязвимой программы рассмотрим, каким образом злоумышленник может использовать уязвимости форматирующей строки для достижения своих целей. Наибольший интерес представляют способы удаленного использования уязвимостей форматирующей строки. О степени серьезности уязвимости форматирующей строки можно судить по тому, с какой легкостью злоумышленник может внедриться в сетевой компьютер через Интернет без каких-либо мандатов – учетных записей с параметрами доступа пользователя, сформированными после его успешной аутентификации. Для примера лучше всего рассмотреть уязвимость форматирующей строки в программе широко известного или уважаемого автора, для того чтобы показать, что уязвимости форматирующей строки могут существовать, и существуют, в программах, которые считаются хорошо написанными. Кроме того, пример уязвимой программы должен позволить изучить различные вопросы использования уязвимости форматирующей строки, как, например, вывод отформатированной строки.
В примере рассматривается программа, получившая название rwhoisd. Программа rwhoisd, или демон RWHOIS, является одной из реализаций сервиса RWHOIS. Научно-исследовательское отделение компании Network Solutions, Inc., в настоящее время поддерживает программу rwhoisd сервера RWHOIS, исходные тексты которой доступны по лицензии GNU PublicLicense.
...Приоткрывая завесу
Примеры важных уязвимостей форматирующей строки
Кроме упомянутой уязвимости форматирующей строки FTP-демона Вашингтонского университета при передаче параметра команде SITE EXEC, следует пару слов сказать о некоторых других уязвимостях. Часть из них была использована саморазмножающимися вирусами (червями) и утилитами, нашедшими широкое применение среди злоумышленников, в результате применения которых были скомпрометированы тысячи хостов.
IRIX telnetdclient. Включенные в форматирующую строку данные клиента, которая передавалась как параметр функции syslog(), позволяли удаленному злоумышленнику выполнить произвольный код безо всякой аутентификации. Эта уязвимость была обнаружена Last Stage of Delirium. Дополнительные сведения можно найти по адресу www.securityfocus.com/bid/1572.
Linux rpc.statd. Эта уязвимость форматирующей строки также обязана своим происхождением неправильному использованию функции syslog(). Она позволяет удаленному злоумышленнику получить права суперпользователя. Уязвимость была обнаружена Дэниелом Джакобоуитцом (Daniel Jacobowitz) и опубликована 16 июля 2000 года в извещении Bugtraq. Материалы по данному вопросу опубликованы по адресу www.securityfocus.com/bid/1480.
Cfingerd. Очередная уязвимость форматирующей строки функции syslog() была обнаружена Мигелем Ласзло (Megyer Laszlo). Если злоумышленник успешно воспользуется ей, то он получит возможность удаленно управлять основным хостом. Описание уязвимости может быть найдено по адресу www.securityfocus.com/bid/2576. Multiple Vendor LibC Locale Implementation. Юко Пуннонен (Jouko Pynn^en) и Core SDI независимо друг от друга обнаружили уязвимость форматирующей строки в реализации библиотеки языка C, поставляемой с некоторыми UNIX-системами. Выявленная уязвимость позволяла злоумышленнику повысить свои права на локальной машине. Подробный отчет о проделанной работе можно найти по адресу www.securityfocus.com/bid/1634.
Multiple CDE Vendor rpc.ttdbserverdISS X-Force обнаружила уязвимость, связанную с неправильным использованием функции syslog() в версиях демона серверной базы данных ToolTalk, поставляемой в нескольких операционных системах с CDE. Благодаря этой уязвимости удаленный злоумышленник, не прошедший аутентификацию, может выполнить произвольный код на атакованном хосте. Подробные сведения по этому вопросу можно найти по адресу www.securityfocus.com/bid/3382.
Классическую удаленную уязвимость форматирующей строки можно найти в версиях программы rwhoisd 1.5.7.1 и более ранних. Она позволяла удаленному злоумышленнику после подключения к серверу выполнить произвольный код. Впервые об уязвимости стало известно благодаря сообщению списка рассылки Bugtraq. Заархивированное сообщение может быть найдено по адресу www.securityfocus.com/archive/1/222756.