SV.UNBOUND_STRING_INPUT.FUNC

因无边界的字符串复制而导致缓冲区溢出

字符串复制函数用于将一串字符复制到内存缓冲区。strcpy 函数没有参数来限制写入数据的大小,因此可能导致缓冲区溢出。

SV.UNBOUNDED_STRING_INPUT.FUNC 检查器会检查那些调用了未指定缓冲区大小的不安全字符串复制函数(比如 gets()、gettext() 或 catgets())的代码。

漏洞与风险

如果字符串复制函数在调用时没有大小参数,将可能导致缓冲区溢出错误。这可能导致应用程序不稳定、精心设计的攻击、代码注入或其他漏洞。

缓解与预防

要避免该漏洞

  • 确保您使用的函数具有缓冲区大小作为输入参数,比如 fgets,而非 gets
  • 对于 Windows,使用 StrSafe 函数 String*Gets,比如 StringCchGets,或者使用安全 CRT 函数,比如 gets_s
  • 使用类似于 strlen() 这样的函数来确定您需要的缓冲区大小

漏洞代码示例 1

复制
   #include <stdio.h>
   
   int main()
   {
     char string [256];
     printf ("Insert your full address: ");
     gets (string);                /* SV.UNBOUND_STRING_INPUT.FUNC reported here */
     printf ("Your address is: %s\n",string); 
     return 0;
  }

修正代码示例 1

复制
   #include <stdio.h>
   
   int main()
   {
     char string [256];
     printf ("Insert your full address: ");
     fgets (string, 256, stdin);    /* No checker reported because fgets considers the size of the string array */
     printf ("Your address is: %s\n",string);
     return 0;
  }

漏洞代码示例 2

复制
   #include <stdio.h>
   
   int main()
   {
     char string [256];
     printf ("Please Enter Your Full Name:");
     _gettws (string);             /* SV.UNBOUND_STRING_INPUT.FUNC reported here */
     printf ("Your Full Name Is: %s\n", string);
     return 0;
  }

修正代码示例 2

复制
   #include <stdio.h>
   
   int main()
   {
     char string [256];
     printf ("Please Enter Your Full Name:");
     gets_s (string, strlen(string));  /* no SV.UNBOUND_STRING_INPUT.FUNC reported here */
     printf ("Your Full Name Is: %s\n", string);
     return 0;
  }

相关检查器

安全培训

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