Как и почему возникают ошибки форматирующей строки?
Основная причина возникновения ошибок форматирующей строки заключается в использовании программистом непроверенных входных данных в форматирующей строке. Ниже приведены наиболее известные ошибки программирования, обусловленные уязвимостью форматирующей строки.
Первая ошибка состоит в том, что при вызове функции
printf()ей передается единственная непроверенная строка. Например:
printf(argv[1]);
При этом единственная передаваемая переменная (часто передается первый аргумент командной строки) расценивается функцией как форматирующая строка. И если в эту переменную будут включены спецификации преобразования, то функция среагирует на них.
[dma@victim]$ ./format_example %i -1073742936
Часто эта ошибка совершается начинающими программистами из-за плохого знания особенностей функций обработки строк. Но порой эта ошибка является следствием лени программиста, не удосужившегося задать форматирующую строку (то есть дополнительно написать спецификацию вывода строки %s). Обычно именно это становится основной причиной появления брешей в системе безопасности программ. Очень часто программисты пользуются функциями записи сообщений в системный журнал и выдачи сообщений об ошибке. При использовании функции выдачи сообщения об ошибке программисты-разработчики нередко забывают о том, что она вызывает внутри себя функцию printf() (или любую другую из семейства функций printf()) и передает ей переменное число аргументов. Может быть, они привыкли вызывать ее для печати единственной строки:
error warn(errmsg);
Рассмотренный ниже пример программы использования ошибки форматирующей строки основан на подобной ошибке. Наиболее общей причиной возникновения уязвимости форматирующей строки в системе Unix является использование функции syslog(). Функция syslog() служит программным интерфейсом для демона системного журнала. (Демон – скрытая от пользователя служебная программа, вызываемая при выполнении какой-либо функции.) Программист использует функцию syslog() для записи сообщений об ошибке в файлы системного журнала с указанием их приоритетов. Параметрами функции syslog(), кроме первого, может быть как единственная строка символов, так и форматирующая строка с произвольным числом спецификаций преобразования и соответствующие им параметры. Первым параметром функции является приоритет сообщения. Многие программисты при использовании функции syslog() забывают или не знают о том, что в форматирующую строку не должны помещаться входные данные программы. Большинство уязвимостей связано с кодированием подобно следующему фрагменту кода
error warn(errmsg);
Если в строке errmsg содержатся входные данные программы, например имя пользователя, неудачно попытавшегося войти в систему, то они могут быть использованы для типичной атаки с использованием ошибок форматирующей строки.
Как устранить уязвимость форматирующей строки?
Источником большинства уязвимостей в системе безопасности программного обеспечения является небезопасное программирование. Поэтому наилучшим способом избавления от ошибок форматирующей строки является их предотвращение на этапе создания программы. Для этого необходимо, чтобы программисты были осведомлены о серьезности подобных ошибок и о возможности их использования для атаки. К сожалению, непохоже, что в ближайшее время произойдет всеобщее осознание проблем безопасности.
Для администраторов и пользователей программного обеспечения наилучшей линией является поддержание разумного уровня безопасности своих систем. Для достижения этого должны быть удалены все ненужные и запрещенные программы, а все лишние сервисы должны быть выключены или заблокированы.
Майк Франтцен (Mike Frantzen) опубликовал методику вылизывания программ с целью максимального устранения недоделок, которая позволяет администраторам и программистам предотвращать любые атаки с использованием ошибок форматирующей строки. Его методика основана на сравнении числа параметров, передаваемых функции printf(), с числом спецификаций формата в форматирующей строке. Эта методика под названием Format Guard реализована в Immunix, одном из безопасных дистрибутивов ОС Linux.
Заархивированную методику Майка Франтцена в списке рассылки Bugtraq можно найти по адресу www.securityfocus.com/archive/1/72118. Format Guard находится по адресу www.immunix.org/formatguard.html.
Способы использования ошибок форматирующей строки для атаки
Читать дальше
Конец ознакомительного отрывка
Купить книгу