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 并检查缓冲区大小。

安全培训

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