SV.STRBO.BOUND_SPRINTF
绑定的 sprintf 导致的缓冲区溢出
函数 snprintf 用于将格式化输出写入内存缓冲区。其参数中有一个指向输出参数和最大字节数的指针,用于写入输出缓冲区,包括 null 结尾字节。大小参数必须小于或等于输出缓冲区中分配的字节数。如果大小参数大于输出缓冲区大小,可能导致缓冲区溢出。
SV.STRBO.BOUND_SPRINTF 检查器查找调用 snprintf 的代码,snprintf 将固定大小的数组用作输出缓冲区,其中大小参数大于缓冲区的已知大小。
漏洞与风险
如果 snprintf 函数使用大于输出缓冲区大小的大小参数调用,可能导致缓冲区溢出错误。这可能导致应用程序不稳定、精心设计的攻击、代码注入或其他漏洞。
漏洞代码示例
复制
void foo(const char *src)
{
char buf[20];
snprintf(buf, 40, "%s", src);
}
Klocwork 针对第 4 行生成问题报告,因为赋予 snprintf 的大小参数为 40,该值大于输出缓冲区 buf 的大小 (20)。snprintf 函数中的大小参数必须小于或等于输出缓冲区中分配的字节数,因此如果在此例中,“src”中的字符串长度等于或大于 20,将导致缓冲区溢出。
修正代码示例
复制
void foo(const char *src)
{
char buf[20];
snprintf(buf, sizeof(buf), "%s", src);
}
在该修正代码示例中,使用了 sizeof(buf) 参数来避免指定大于输出缓冲区大小的大小。