Коллектив авторов - Защита от хакеров корпоративных сетей
Злоумышленники хорошо разбираются в интересующих их вопросах. Они знают, как воспользоваться коварными ошибками в программах. Ныне злоумышленники изучают каждую программу, анализируя ее реакцию на различные варианты входных данных. Сейчас как никогда для программистов важно осознать, что многие ошибки, ранее считавшиеся безобидными, могут привести к серьезным последствиям, если их вовремя не исправить. Системные администраторы и пользователи должны знать, что в используемых программах скрытно присутствуют ошибки программного обеспечения, ныне представляющиеся несущественными, но пригодные для использования в злонамеренных целях.
Конспект
Уязвимость форматирующей строки
· Уязвимость форматирующей строки обязана своим происхождением программистам, позволяющим присваивать входные данные программы параметрам функции printf() без необходимой в таких случаях проверки.
· Уязвимость форматирующей строки позволяет злоумышленникам читать из памяти данные программы и записывать в память данные злоумышленника.
· Уязвимость форматирующей строки может быть использована для вызова произвольного программного кода посредством подмены адресов возврата, содержимого таблицы GOT, указателей на функции и т. д.
Пример уязвимой программы
· Признаком уязвимой программы является наличие в ней функции printf(), параметрами которой являются переменные, соответствующие спецификациям преобразования форматирующей строки.
· Применяя функции, использующие внутри себя функцию printf(), программисты часто забывают о возможности формирования форматирующей строки и параметров функции printf() из входных данных этих функций.
· Неправильное использование функции syslog() является причиной значительного числа уязвимостей форматирующей строки, большинство из которых чревато опасными последствиями.
Тестирование программ способом случайной форматирующей строки
· Тестирование программ способом случайной форматирующей строки позволяет выявить уязвимости форматирующей строки, исследуя реакцию программы на различные варианты спецификаций формата.
· Спецификации формата %s, %x, %p могут указывать на уязвимости форматирующей строки, если в отформатированной строке они замещаются данными из памяти. Использование этих спецификаций формата не всегда свидетельствует о наличии в программе уязвимости форматирующей строки, так же как и не все уязвимости проявляются при выводе отформатированной строки.
· Аварийное завершение процесса из-за спецификаций преобразования %п или %5, которым соответствуют входные данные программы, свидетельствует об уязвимости форматирующей строки.
Программа атаки с использованием форматирующей строки
· Программы атаки с использованием форматирующей строки могут читать одни данные из памяти и записывать другие в память. Уязвимость форматирующей строки не обязательно зависит от используемой платформы. Известны примеры программ, как, например, утилита Screen, которые могут выполнить злонамеренный программный код в разных операционных системах на машинах с различной архитектурой.
· При использовании уязвимости форматирующей строки в случае вывода отформатированной строки злоумышленник может, прочитав данные из памяти, воспользоваться ими для решения стоящих перед ним задач. Программы атаки могут восстанавливать стек атакованного процесса и автоматически определять место размещения спецификации преобразования %п в форматирующей строке.
· При наличии уязвимости форматирующей строки злоумышленник может воспользоваться способом многократной записи произвольных величин в память. Этим способом злоумышленник можно записать произвольные данные пользователя практически в любую доступную область памяти.
· На платформах, где не разрешается записывать данные в память по невыровненным адресам памяти, как, например, на платформе RISC, спецификация преобразования %hn может быть использована для записи коротких целых величин в адреса памяти, выровненные по двухбайтовым границам.
Часто задаваемые вопросы
Наиболее часто авторы книги отвечали на приведенные ниже вопросы. Вопросы интересны тем, что они позволяют читателю лучше усвоить изложенный в главе материал и реализовать его на практике в интересах обеспечения безопасности вычислительных систем. Если у читателя возникли вопросы по главе, то зайдите на сайт www.syngress.com/solutions и щелкните мышкой на кнопке «Ask the Author».
Вопрос: Защищают ли от уязвимости форматирующей строки конфигурации стека, запрещающие хранить в памяти выполнимый код, или схемы защиты стека типа StackGuard? Ответ: К сожалению, нет. Уязвимость форматирующей строки позволяет злоумышленнику записать нужные ему данные практически в любую область памяти. StackGuard защищает целостность стекового фрейма, а конфигурация стека, запрещающая хранение в стеке выполнимых команд, не позволяет командам выполниться из стека. Благодаря уязвимости форматирующей строки эти две схемы защиты могут быть преодолены. Для того чтобы обойти защиту StackGuard, злоумышленник может вместо адресов возврата функций подменять ссылки на выполняемые команды, а злонамеренный управляющий программный код записать вне стека, например в динамически распределяемую область памяти. Хотя средства защиты стека, такие как StackGuard и выбор конфигурации стека, запрещающей хранение в стеке выполнимых команд, могут отразить некоторые известные атаки, тем не менее для квалифицированного злоумышленника эти средства защиты не преграда.
Вопрос: Специфичны ли уязвимости форматирующей строки в системе UNIX? Ответ: Нет. Благодаря частому использованию функции printf() уязвимости форматирующей строки в системе UNIX аналогичны уязвимостям форматирующей строки в других операционных системах. Большой вклад в специфику уязвимостей форматирующей строки системы UNIX вносит неверное использование функции syslog(). Возможность использования злоумышленником этих ошибок, включая запись в память, зависит от того, поддерживает ли реализация функции printf() спецификацию преобразования %n. Если поддерживает, то теоретически любая программа, в которой есть ошибки форматирующей строки и которая отредактирована с этой библиотекой, может быть использована для выполнения произвольного программного кода.
Вопрос: Как можно обнаружить уязвимость форматирующей строки? Ответ: Большое количество уязвимостей форматирующей строки может быть обнаружено при анализе исходных текстов программ. Кроме того, их можно обнаружить, анализируя параметры функции printf(). Вызов любой функции из семейства функций printf() с единственным параметром, сформированным из входных данных программы, ясно свидетельствует об уязвимости форматирующей строки.
Вопрос: Как избежать или минимизировать риск от неизвестной уязвимости форматирующей строки в своей программе у себя на системе? Ответ: Для начала надо выработать политику безопасности. Положитесь на модель минимальных привилегий (least-privileges model). Гарантируйте, что будут инсталлированы действительно нужные утилиты, которые могут быть запущены членами доверенной группы. Отключите или заблокируйте доступ ко всем сервисам, которые не являются действительно необходимыми.
Вопрос: Что может служить признаками попыток использования уязвимостей форматирующей строки? Ответ: Этот вопрос уместен, потому что много уязвимостей форматирующей строки обязаны своим происхождением неверному использованию функции syslog(). Когда злоумышленник использует уязвимость форматирующей строки, возникшую в результате неверного использования функции syslog(), отформатированная строка выводится в поток журнала. Администратор, просматривая системный журнал, может выявить попытку воспользоваться уязвимостью форматирующей строки по необычной строке системного журнала. Другими общими признаками использования уязвимости форматирующей строки является пропадание программ демонов или регулярное их аварийное завершение из-за ошибок нарушения доступа.
Вопрос: Где можно найти дополнительные материалы о поиске и использовании уязвимости форматирующей строки? Ответ: По этой теме известно много материалов. Официальный документ, подготовленный Тимом Невшамом (Tim Newsham) и изданный Gaurdent, можно найти на сайте www.guardent.com. Также рекомендуется просмотреть материалы TESO (www.team-teso.net/articles/formatstring) и HERT (www.hert.org/papers/format.html).
Глава 10 Прослушивание сетевого графика
В этой главе обсуждаются следующие темы:
• Что такое прослушивание сетевого графика?