2009-03-10 2 views
5

У нас есть ошибка Coverity для этой строки кода:snprintf вопрос уязвимость форматной строки

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 к константным, но не что-либо:

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

Любые идеи относительно того, что эта ошибка действительно говорит?

ответ

10

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

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

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

Где имя_пользователя поставляется пользователем, пользователь может передать «% S», и получить функцию, чтобы начать доступ к данным в случайном адрес в стеке, что может привести к авария. printf попытается вытащить дополнительные параметры из стека, что приведет к повреждению стека. Атака на отказ в обслуживании, как это, вероятно, является лучшим случаем, информация может быть раскрыта путем получения printf для сброса значений в стеке, и есть даже способы получить функции стиля printf для изменения адреса возврата в стеке.

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

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

2

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

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

Он известен как format string attack.

Смежные вопросы