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) 参数来避免指定大于输出缓冲区大小的大小。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。