Проблема уязвимости безопасности snprintf Format String
Вопрос
У нас есть ошибка 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};
Есть идеи, что на самом деле говорит эта ошибка?
Решение
Ваш код в порядке.
Проблема в том, что если вы передадите строку, контролируемую пользователем, в виде строки формата printf, могут возникнуть ошибки безопасности.
Например, printf (userName);
Если userName предоставляется пользователем, пользователь может передать «% s» и заставить вашу функцию начать доступ к данным со случайного адреса в стеке, что может привести к сбою. printf попытается вытолкнуть дополнительные параметры из стека, что приведет к повреждению стека. Подобная атака типа «отказ в обслуживании», вероятно, является наилучшим случаем, информацию можно раскрыть, если заставить printf вывести значения в стек, и даже есть способы получить функции стиля printf для изменения адреса возврата в стеке.
Поскольку ваши строки не контролируются пользователем, это сообщение можно игнорировать. Типичное исправление заключается в замене примера printf, который я привел, на printf ("% s " ;, userName);
, который в вашем случае не поможет, поскольку строки const содержат строки формата. р>
В Википедии есть больше информации об уязвимостях форматной строки здесь: http://en.wikipedia.org/wiki/Format_string_vulnerabilities р>
Другие советы
Идея состоит в том, что значение testStrings [testID]
можно каким-то образом изменить, чтобы включить дополнительные спецификаторы формата.
Поскольку snprintf ()
не имеет возможности проверить, соответствует ли количество параметров количеству спецификаторов формата, он просто возьмет следующий адрес из стека, чтобы использовать его в качестве значения для следующего спецификатора формата, и могут произойти странные вещи затем. р>
Он известен как атака форматной строки .