有哪些潜在的安全漏洞? C ++

时间:2011-05-04 21:32:57

标签: c++ security code-access-security

我的老板告诉我查看下面的代码并告诉他潜在的安全漏洞是什么。我不是很擅长这种事情,因为我不认为试图破解代码。我只看到没有任何东西被宣布为私人,但除此之外,我只是不知道。

#define NAME_SIZE (unsigned char) 255
// user input should contain the user’s name (first name space
// middle initial space last name and a null
// character), and was entered directly by the user.
// Returns the first character in the user input, or -1 if the method failed.
char poor_method(char* user_input, char* first, char *middle, char* last)
{
   char*buffer;
   char length;

   // find first name
   buffer = strtok(user_input, " ");
   if(buffer==0)
   {
        return -1;
   }
   length = strlen(buffer);
   if(length <= NAME_SIZE)
   {
        strcpy(first, buffer);
   }

   // find middle name
   buffer = strtok(NULL, " ");
   if(buffer==0)
   {
        return-1;
   }
   if(middle)
       *middle = buffer[0];

   // find last name
   buffer = strtok(NULL, "\0");
   length = strlen(buffer);
   if(length <= NAME_SIZE)
   {
       strcpy(last, buffer);
   }
   // Check to make sure that all of the user input was used
   buffer = strtok(NULL, "\0");
   if(buffer != NULL)
   {
       return-1;
   }
   return first[0];
}

有哪些安全漏洞?

4 个答案:

答案 0 :(得分:6)

善于撰写安全代码

您很可能想要您负责找到bugtraqcve的系统。如果你不理解,请老实说实话。告诉他你不理解,你想要努力。拿起3}}。阅读,学习,喜欢它。从长远来看,问这个问题并给你的老板答案绝对没有帮助你。

然后再次查看示例代码:)

答案 1 :(得分:5)

我所看到的(绝不是完整的清单):

  1. 不能保证你会得到一个指向空终止字符串的字符指针(除非你被允许做出这个假设,而不是真正安全的做法)。
  2. strtok和strcpy是C语言的做法,并带有编程C代码的有趣内容。如果你必须使用它们,那就这样吧(只要确保你能保证你对这些功能的输入确实有效)。否则,尝试切换代码以使用std::string和“C ++方式”(如Cat Plus Plus所述)
  3. 我认为这是一个错字:

    charpoor_method(
    您错过了charpoor_method(

  4. 之间的空格
  5. 您没有检查firstlast是否确实是有效的指针(不幸的是,您可以做的最好是针对NULL检查它们。)

  6. 无法保证缓冲区firstlast确实可以容纳您复制到它们的任何内容。
  7. 另一个错字:
  8. returnfirst[0];

    returnfirst[0]之间缺少空格

    学习编写安全代码是非常重要的事情。遵循布莱希特的建议并擅长。

答案 2 :(得分:2)

  1. Ok strtok假设user_input被NULL终止,这可能不是真的。
  2. 
     charlength = strlen(buffer);
      if(length <= NAME_SIZE)
      {
            strcpy(first, buffer);
      }
    
    
    1. charlenght这里是未声明的,长度也是如此,它们应该被声明为unsigned int。

    2. strlen不会将'\ 0'计算为长度的一部分,因此如果缓冲区的len为255 + 1('\ 0',strcpy会将'\ 0'复制到First之后的任何值。 )

    3. 如果char *第一个大小是,它也应该是NAME_SIZE但是comparisson应该是 长度&lt; = NAME_SIZE - 1 或者首先将char *分配给NAME_SIZE + 1

    4. 我可能会重写整件事,非常难看。

答案 3 :(得分:2)

不是使用strcpy(),而是使用具有特定长度参数的strncpy(),因为该函数(如strtok())假设源为NULL终止的缓冲区,可能不是这种情况,为复制到firstlast所指向的缓冲区中的数据提供缓冲区溢出。此外,您不知道为firstlast分配的缓冲区有多长...不要假设您的函数用户已正确分配了足够的内存来复制,除非它们已经传递了一个参数,告诉你缓冲区中有足够的内存插槽。否则,您可能(并且很可能会)以缓冲区溢出结束。

如果您使用的是C99,则可能需要使用restrict关键字,以防止您的函数调用者为buffer first的同一内存位置别名,和last