6

我们对这行代码有一个 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};

关于这个错误的真正含义有什么想法吗?

4

2 回答 2

12

你的代码很好。

问题是,如果您将用户控制的字符串作为 printf 格式字符串传递,则可能会出现安全错误。

例如,printf(userName);

如果 userName 由用户提供,用户可以传递“%s”,并让您的函数开始访问堆栈上随机地址的数据,这可能会导致崩溃。printf 将尝试从堆栈中弹出其他参数,从而导致堆栈损坏。像这样的拒绝服务攻击可能是最好的情况,可以通过让 printf 将值转储到堆栈上来泄露信息,甚至还有一些方法可以让 printf 风格的函数修改堆栈上的返回地址。

由于您的字符串不是用户控制的,因此忽略此消息是安全的。典型的解决方法是用 替换我给出的 printf 示例printf("%s", userName);,这对您的情况似乎没有帮助,因为 const 字符串似乎包含格式字符串。

维基百科在这里有更多关于格式字符串漏洞的信息:http ://en.wikipedia.org/wiki/Format_string_vulnerabilities

于 2009-03-10T18:40:24.720 回答
2

想法是testStrings[testID]可以以某种方式更改的值以包含额外的格式说明符。

因为snprintf()无法检查参数的数量是否与格式说明符的数量匹配,所以它只会从堆栈中获取下一个地址作为下一个格式说明符的值,然后可能会发生奇怪的事情。

它被称为格式字符串攻击

于 2009-03-10T18:38:41.497 回答