Испорченный формат строки

Аргумент формата ввода из небезопасного источника

Описание

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

Риск

Если вы используете внешне управляемые элементы, чтобы отформатировать строку, можно вызвать проблемы представления данных или переполнение буфера. Атакующий может использовать эти элементы форматирования строки, чтобы просмотреть содержимое стека с помощью %x или записать в стек с помощью %n.

Фиксация

Передайте статическую строку функциям строки формата. Эта фиксация гарантирует, что внешний агент не может управлять строкой.

Другой возможная фиксация должен позволить только ожидаемое количество аргументов. Если возможно, используйте функции, которые не поддерживают уязвимый оператор %n в строках формата.

Примеры

развернуть все

#include "stdio.h"

void taintedstringformat(char* userstr) {
    printf(userstr);   
}

Этот пример распечатывает входной параметр userstr. Строка неизвестна. Если это содержит элементы, такие как %, printf может интерпретировать userstr как формат строки вместо строки, заставив вашу программу отказать.

Исправление — печать как строка

Одно возможное исправление должно распечатать userstr явным образом как строку так, чтобы не было никакой неоднозначности.

#include "stdio.h"

void taintedstringformat(char* userstr) {
    printf("%.20s", userstr); 
}

Информация о результате

Группа: испорченные данные
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: TAINTED_STRING_FORMAT
Влияние: низко
ID CWE: 134

Введенный в R2015b