我在 Fortify 静态代码分析器 上运行了 ossec-hids 存储库,并报告了以下
我的问题是:
在这种情况下,Fortify的发现可能是一个误报吗?或者当将
如果使用
缓冲区溢出:格式化字符串
的发现,位于 src/analysisd/stats.c:415:
stats.c 文件的第 415 行中,fscanf() 的格式化字符串参数未正确限制函数可以写入的数据量,这允许程序在已分配内存的范围之外进行写入。此行为可能会破坏数据、导致程序崩溃或执行恶意代码。
有问题的代码行如下所示:
if (fscanf(fp, "%d", &_RWHour[i][j]) <= 0) {
_RWHour
被声明为
static int _RWHour[7][25];
在同一文件的第33行。我相信在第33行声明和第415行使用_RWHour
之间不存在屏蔽,因为当我选择第33行的声明时,我的IDE(Visual Studio 2019)会在第415行中突出显示_RWHour
。
当我查看fscanf
的cppreference文档时,它说:
我从上面引用的表格中可以看出,当对d 匹配十进制整数。数字的格式与期望的
strtol
的基本参数值为10
相同。
%d
不使用长度修饰符(正如所讨论的fscanf
调用的情况),参数类型应为signed int*
或unsigned int*
。我的问题是:
在这种情况下,Fortify的发现可能是一个误报吗?或者当将
int
的地址传递给fscanf
时,是否可能写入到int
之外的内存?如果使用
%d
和fscanf
时可能写入到int
之外的内存,如何安全地避免这种情况?
i
和j
必须在适当的范围内。 - Tom Karzesfscanf
读取整数时,当所读取的值无法被对象的类型表示时,会产生其他可能(且不可避免的)未定义行为。 - Ian Abbottif (fscanf(fp, "%4d", &_RWHour[i][j]) <= 0) {
语句,并告诉我们报告是否仍然存在。 - chux - Reinstate Monicaif (fscanf(fp, "%4d", &_RWHour[i][j]) <= 0) {
,并告诉我们报告是否仍然存在。 - chux - Reinstate Monica