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