SV.STRBO.UNBOUND_COPY

未绑定的字符串复制中的缓冲区溢出

strcpy 函数用于将源字符串复制到内存缓冲区。strcpy 函数将固定大小的数组作为目标,但是未对复制的数据加以限制,因此可能发生缓冲区溢出。

SV.STRBO.UNBOUND_COPY 将标记调用 strcpy 的代码实例。

漏洞与风险

strcpy 函数未检查所复制字符串的长度,可能很容易导致缓冲区溢出。如果可能,建议使用 strncpy 函数并检查应用程序中缓冲区的使用情况。

漏洞代码示例

复制
  int main()
  {
       char FIXEDbuf[12];
       strcpy(FIXEDbuf, "Something rather large");
  
       return 0;
  }

Klocwork 针对第 4 行生成问题报告,指出 strcpy 函数未检查缓冲区边界并且可能使固定大小为 12 的缓冲区 FIXEDbuf 溢出。

修正代码示例

复制
  int main()
  {
       char FIXEDbuf[23];
       char *POINTERbuf;
       strcpy(FIXEDbuf, "Something rather large");
       strcpy(POINTERbuf, "Something very large as well");
  
       return 0;
  }

在该修正代码示例中,FIXEDbuf 的大小已增加为 23,以确保有足够的空间来进行 strcpy 运算。要修正代码的另一个备选方法是使用 strncpy 并检查缓冲区大小。

安全培训

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