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