Атаки Форматирования строк (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», злоумышленник может записать целое значение в любое место памяти (и таким образом, переписать важные программные признаки, управляющие привилегиями доступа, переписать адреса возврата на стеке, и т.п.).
Нет комментариев