Было известно немного проблем с использованием форматирующей строки до тех пор, пока кто-то не понял, как с помощью форматирующих строк можно проводить атаки. Например, было известно, что клиент BitchX IRC может аварийно завершиться при передаче ему строки %s%s%s%s в качестве одного из параметров команды IRC (Internet Relay Chat – Интернетовские посиделки). (IRC – глобальная система, посредством которой пользователи могут общаться друг с другом в реальном масштабе времени.) Но насколько известно, никто не догадывался, что эту идею можно использовать для взлома, пока не стало известно об атаке на FTP-демон Вашингтонского университета.
На самом деле в применении форматирующей строки для аварийного завершения программы нет ничего особенного. Используя уязвимости форматирующей строки, можно реализовать гораздо более интересные и полезные вещи.
Чтение памяти
Если результат работы функции, использующей форматирующую строку, общедоступен, то злоумышленник может воспользоваться уязвимостью форматирующей строки для чтения памяти программы. Это является серьезной проблемой и может привести к раскрытию важной информации. Например, если программа получает от клиентов данные аутентификации и сразу же после получения не уничтожает их, то для ознакомления с ними можно воспользоваться уязвимостью форматирующей строки. Для злоумышленника наиболее простой способ прочесть содержимое памяти, воспользовавшись уязвимостью форматирующей строки, заключается в использовании переменных памяти. Переменные памяти – это переменные, которым присвоены адреса интересующих злоумышленника областей памяти и которые соответствуют заданным им спецификациям формата. Функция семейства
Но, используя спецификацию вывода строки
Для злоумышленника возможность читать содержимое памяти очень полезна и может использоваться в сочетании с другими способами атак. В конце главы об этом как рассказано, так и показано на примере программы атаки с использованием ошибок форматирующей строки.
Запись в память
В предыдущих разделах уже затрагивалась спецификация формата
Существование подобной спецификации преобразования имеет большое значение с точки зрения безопасности, поскольку с ее помощью можно осуществлять запись в память. А это, в свою очередь, является ключом к использованию уязвимости форматирующей строки для достижения таких целей, как, например, выполнение управляющего программного кода.
Способ однократной записи.
Обсуждаемый способ позволяет увеличить права доступа, используя форматирующую строку с единственной спецификацией преобразования %n.В некоторых программах такие критические значения, как идентификатор пользователя или идентификатор группы, хранятся в памяти программы для реализации механизма понижения прав. Злоумышленник может воспользоваться уязвимостью форматирующей строки для перезаписи этих значений.