SV.STRBO.UNBOUND_SPRINTF
未绑定的 sprintf 中的缓冲区溢出
sprintf 函数用于将格式化输出写入内存缓冲区。sprintf 函数将固定大小的数组作为目标,但是未对输出数据加以限制,因此可能发生缓冲区溢出。
SV.STRBO.UNBOUND_SPRINTF 检查器可查找调用 sprintf 的代码。
漏洞与风险
sprintf 函数未检查所输出字符串的长度,可能很容易导致缓冲区溢出。如果可能,建议使用 snprintf 函数并检查应用程序中缓冲区的使用情况。
漏洞代码示例
复制
int main()
{
char fixed_buf[10];
sprintf(fixed_buf,"Very long format string\n");
return 0;
}
Klocwork 在第 4 行生成了一个问题报告,指出 sprintf 函数未检查缓冲区边界并且可能使固定大小为 10 的缓冲区 fixed_buf 溢出。
修正代码示例
复制
int main()
{
char fixed_buf[23];
char *pointer_buf;
strcpy(fixed_buf, "Something rather large");
strcpy(pointer_buf, "Something very large as well");
return 0;
}
在该修正代码示例中,fixed_buf 的大小已增加为 23,以确保有足够的空间进行 sprintf 运算。要修正代码的另一个选择是使用 snprintf 并检查缓冲区大小。