Приведенные ниже код выводит содержимое my_file_name
на стандартный вывод:
printf("File %s", my_file_name);
Если my_file_name
получен от вредоносного источника и программных выходов на терминал, то возможно для вредоносного источника поставило escape-последовательностей в my_file_name
, которые говорят терминалу о выполнении нетривиальных задач, таких как отправка содержимого терминала через стандартный ввод. Трудно, но возможно, что злоумышленник может извлечь полезную информацию из такой атаки или даже попытаться испортить данные с помощью команд, как если бы они были введены пользователем.
Конечно, второй вызов вызывает неопределенное поведение, поскольку вы не передаете действительный указатель строки как второй аргумент printf
.
Вышеупомянутый сценарий, вероятно, не является тем, о чем вы ссылаетесь уязвимость переполнения буфера. Нет такой уязвимости в коде printf
, но это недостаток переполнения буфера существует где-то еще в вашем коде, и фактическая строка формата может быть исправлена через это переполнение, злоумышленник может воспользоваться возможностями printf
, особенно %n
, чтобы вывести любое значение почти в любое место в памяти программы. Это является обоснованием для удаления %n
в printf_s
, как показано в документе безопасности Microsoft.
Что вы опубликовали здесь, проблема с нехваткой буфера. Вы скажете printf, что в стеке есть строка, но не дайте ее. Если my_file_name указывает на большее количество данных, чем пространство, выделенное для него, это не является проблемой переполнения буфера –
Это кажется хорошим ответом: http://security.stackexchange.com/questions/43574/how-is-printf-in -cca-buffer-overflow-уязвимость –
Mmm .. ответ printf есть уязвимость строки формата, а не переполнение буфера @crclayton –