Атаки Форматирования строк (Format String Attacks) изменяют ход выполнения приложения, используя возможности библиотеки форматирования строк, чтобы получить доступ к другой области памяти. Дыра в безопасности возникает, когда данные, введенные пользователем, используются напрямую, как входная строка форматирования для определенных C/C++ функций (такие как, fprintf, printf, sprintf, setproctitle, syslog,…).

Если злоумышленник передает строку форматирования, состоящую из printf символов преобразования (такие как, «%f», «%p», «%n», и т.д.), как значение параметра в веб-приложении, он может:

  • выполнить произвольный код на сервере;
  • считать значения стека;
  • стать причиной ошибки сегментации или аварийного отказа программного обеспечения.
Пример.

Предположим, что веб-приложение имеет некоторый параметр emailAddress, вносимый пользователем. Приложение выводит значение этой переменной, используя printf функцию:

printf(emailAddress);

Если значение, отправляемое в параметре emailAddress, содержит символы преобразования, то printf выполнит синтаксический анализ символов преобразования и воспользуется дополнительно передаваемыми аргументами. Если в действительности таких аргументов не существует, то будут использованы данные из стека в соответствии с порядком ожидаемым printf функцией.

Возможности использования Атаки Форматирования строк, в этом случае, могут быть следующие:

  • Прочитать данные из стека: Если выходной поток printf функции передается обратно злоумышленнику, он может прочитать значения из стека, отправляя символ преобразования «%x» (один или более раз).
  • Прочитать символьные строки из памяти процесса: Если выходной поток printf функции передается обратно злоумышленнику, он может прочитать символьные строки из произвольного места памяти, используя символ преобразования «%s» (и другие символы преобразования для того, чтобы добраться к необходимому местоположению).
  • Записать целое в определенное место памяти процесса: Используя символ преобразования «%n», злоумышленник может записать целое значение в любое место памяти (и таким образом, переписать важные программные признаки,  управляющие привилегиями доступа, переписать адреса возврата на стеке, и т.п.).

Нет комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *