Проблема уязвимости безопасности snprintf Format String - PullRequest
5 голосов
/ 10 марта 2009

У нас есть ошибка Coverity для этой строки кода:

snprintf( tempStr, size, testStrings[testID], A2DtoV(testResults[testID].value),
A2DtoV(testResults[testID].min),A2DtoV(testResults[testID].max));

Ошибка говорит:

non_const_printf_format_string: "format string is not a string literal, 
potential security vulnerability if user controlled"

Я изменил testStrings на const, но ничего не сделал:

static const char *testStrings[] = {"1", ... etc};

Есть идеи о том, что на самом деле говорит эта ошибка?

Ответы [ 2 ]

11 голосов
/ 10 марта 2009

Ваш код в порядке.

Проблема в том, что если вы передадите строку, контролируемую пользователем, в виде строки формата printf, могут возникнуть ошибки безопасности.

Например, printf(userName);

Если userName предоставляется пользователем, пользователь может передать «% s» и заставить вашу функцию начать доступ к данным по случайному адресу в стеке, что может привести к сбою. printf попытается вытолкнуть дополнительные параметры из стека, что приведет к повреждению стека. Подобная атака типа «отказ в обслуживании», вероятно, является наилучшим случаем, информацию можно раскрыть, если заставить printf вывести значения в стек, и даже есть способы получить функции стиля printf для изменения адреса возврата в стеке.

Поскольку ваши строки не контролируются пользователем, это сообщение можно игнорировать. Типичное исправление заключается в замене примера printf, который я привел, на printf("%s", userName);, который, по-видимому, не поможет в вашем случае, потому что строки const содержат строки формата.

В Википедии есть больше уязвимостей форматной строки здесь: http://en.wikipedia.org/wiki/Format_string_vulnerabilities

2 голосов
/ 10 марта 2009

Идея состоит в том, что значение testStrings[testID] может быть изменено каким-либо образом для включения дополнительных спецификаторов формата.

Поскольку snprintf() не имеет возможности проверить, соответствует ли количество параметров количеству спецификаторов формата, он просто возьмет следующий адрес из стека, чтобы использовать его в качестве значения для следующего спецификатора формата, и тогда могут произойти странные вещи.

Он известен как атака формата строки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...