Проблема уязвимости безопасности snprintf Format String

StackOverflow https://stackoverflow.com/questions/631661

  •  08-07-2019
  •  | 
  •  

Вопрос

У нас есть ошибка 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 () не имеет возможности проверить, соответствует ли количество параметров количеству спецификаторов формата, он просто возьмет следующий адрес из стека, чтобы использовать его в качестве значения для следующего спецификатора формата, и могут произойти странные вещи затем.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top