Защита от хакеров корпоративных сетей
Шрифт:
Пример уязвимой программы
· Признаком уязвимой программы является наличие в ней функции printf, параметрами которой являются переменные, соответствующие спецификациям преобразования форматирующей строки.
· Применяя функции, использующие внутри себя функцию printf, программисты часто забывают о возможности формирования форматирующей строки и параметров функции printf из входных данных этих функций.
· Неправильное использование функции syslog является причиной значительного числа уязвимостей форматирующей
Тестирование программ способом случайной форматирующей строки
· Тестирование программ способом случайной форматирующей строки позволяет выявить уязвимости форматирующей строки, исследуя реакцию программы на различные варианты спецификаций формата.
· Спецификации формата %s, %x, %p могут указывать на уязвимости форматирующей строки, если в отформатированной строке они замещаются данными из памяти. Использование этих спецификаций формата не всегда свидетельствует о наличии в программе уязвимости форматирующей строки, так же как и не все уязвимости проявляются при выводе отформатированной строки.
· Аварийное завершение процесса из-за спецификаций преобразования %п или %5, которым соответствуют входные данные программы, свидетельствует об уязвимости форматирующей строки.
Программа атаки с использованием форматирующей строки
· Программы атаки с использованием форматирующей строки могут читать одни данные из памяти и записывать другие в память. Уязвимость форматирующей строки не обязательно зависит от используемой платформы. Известны примеры программ, как, например, утилита Screen, которые могут выполнить злонамеренный программный код в разных операционных системах на машинах с различной архитектурой.
· При использовании уязвимости форматирующей строки в случае вывода отформатированной строки злоумышленник может, прочитав данные из памяти, воспользоваться ими для решения стоящих перед ним задач. Программы атаки могут восстанавливать стек атакованного процесса и автоматически определять место размещения спецификации преобразования %п в форматирующей строке.
· При наличии уязвимости форматирующей строки злоумышленник может воспользоваться способом многократной записи произвольных величин в память. Этим способом злоумышленник можно записать произвольные данные пользователя практически в любую доступную область памяти.
· На платформах, где не разрешается записывать данные в память по невыровненным адресам памяти, как, например, на платформе RISC, спецификация преобразования %hn может быть использована для записи коротких целых величин в адреса памяти, выровненные по двухбайтовым границам.
Часто задаваемые вопросы
Наиболее часто авторы книги отвечали на приведенные ниже вопросы. Вопросы интересны тем, что они позволяют читателю лучше усвоить изложенный в главе материал и реализовать его на практике в интересах обеспечения безопасности вычислительных систем. Если у читателя возникли вопросы по главе, то зайдите на сайт www.syngress.com/solutions и щелкните мышкой на кнопке «Ask the Author».
Вопрос: Защищают ли от уязвимости форматирующей строки конфигурации стека, запрещающие хранить в памяти выполнимый код, или схемы защиты стека типа StackGuard? Ответ: К сожалению, нет. Уязвимость форматирующей строки позволяет злоумышленнику записать нужные ему данные практически в любую область памяти. StackGuard
Вопрос: Специфичны ли уязвимости форматирующей строки в системе UNIX? Ответ: Нет. Благодаря частому использованию функции printf уязвимости форматирующей строки в системе UNIX аналогичны уязвимостям форматирующей строки в других операционных системах. Большой вклад в специфику уязвимостей форматирующей строки системы UNIX вносит неверное использование функции syslog. Возможность использования злоумышленником этих ошибок, включая запись в память, зависит от того, поддерживает ли реализация функции printf спецификацию преобразования %n. Если поддерживает, то теоретически любая программа, в которой есть ошибки форматирующей строки и которая отредактирована с этой библиотекой, может быть использована для выполнения произвольного программного кода.
Вопрос: Как можно обнаружить уязвимость форматирующей строки? Ответ: Большое количество уязвимостей форматирующей строки может быть обнаружено при анализе исходных текстов программ. Кроме того, их можно обнаружить, анализируя параметры функции printf. Вызов любой функции из семейства функций printf с единственным параметром, сформированным из входных данных программы, ясно свидетельствует об уязвимости форматирующей строки.
Вопрос: Как избежать или минимизировать риск от неизвестной уязвимости форматирующей строки в своей программе у себя на системе? Ответ: Для начала надо выработать политику безопасности. Положитесь на модель минимальных привилегий (least-privileges model). Гарантируйте, что будут инсталлированы действительно нужные утилиты, которые могут быть запущены членами доверенной группы. Отключите или заблокируйте доступ ко всем сервисам, которые не являются действительно необходимыми.
Вопрос: Что может служить признаками попыток использования уязвимостей форматирующей строки? Ответ: Этот вопрос уместен, потому что много уязвимостей форматирующей строки обязаны своим происхождением неверному использованию функции syslog. Когда злоумышленник использует уязвимость форматирующей строки, возникшую в результате неверного использования функции syslog, отформатированная строка выводится в поток журнала. Администратор, просматривая системный журнал, может выявить попытку воспользоваться уязвимостью форматирующей строки по необычной строке системного журнала. Другими общими признаками использования уязвимости форматирующей строки является пропадание программ демонов или регулярное их аварийное завершение из-за ошибок нарушения доступа.