Уязвимости строк форматирования

Наличие данной уязвимости позволяет передать в качестве входного параметра функции ввода/вывода специальным образом сконструированную строку, что позволяет атакующему получить информацию об управлении приложением и даже изменить ход выполнения приложения. Многие функции ввода/вывода позволяют нужным образом отформатировать строку, переданную им в качестве входного параметра. Это означает, что входные параметры функции могут содержать специальные символы, определяющие формат преобразования. Специальным образом подобранные символы форматирования позволяют прочесть содержимое областей памяти, организовать переполнение буфера. В худшем случае эксплуатация уязвимости позволяет атакующему выполнить произвольный код в системе. Первопричиной такой уязвимости является недостаточная проверка входных данных.

Основным методом обнаружения уязвимости строк форматирования является анализ исходных текстов программ. Следует очень осторожно использовать такой спецификатор форматирования, как %p (указатель) и избегать спецификатора %n (количество символов, записанных по адресу, указанному в качестве второго аргумента).

При тестировании приложения следует вставлять спецификаторы форматирования во вводимые данные во всех точках ввода строковых данных и анализировать полученный результат. Количество и вид спецификаторов существенно варьируется в зависимости от используемого языка программирования. При тестировании, кроме спецификаторов, определенных в используемом языке, следует обязательно проверять спецификаторы, определенные в языках С/С++.

Чтобы минимизировать вероятность появления данной уязвимости, необходимо придерживаться следующих правил:

  • для проверки текстов программ использовать инструментальные средства анализа, обладающие низкой вероятностью ошибок 2-го рода для уязвимостей данного типа;
  • проверять все полученные извне данные перед обработкой, разрешая только заведомо корректные данные;
  • функции форматирования строк, используемые в приложении, должны быть доступны только привилегированным пользователям;
  • если исходный код приложения написан на языке С++, нужно использовать операторы управления потоком (stream operators) вместо функций семейства printf;
  • если используется компилятор GCC, необходимо устанавливать режимы -Wformat, -Wformat-security для обнаружения ошибок использования функций форматирования строк;
  • предпочтение следует отдавать компилятору Microsoft Visual C++ 2005 или более позднему для обнаружения ошибок использования функций форматирования строк в процессе выполнения.

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

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.