我的老板告诉我查看下面的代码并告诉他潜在的安全漏洞是什么。我不是很擅长这种事情,因为我不认为试图破解代码。我只看到没有任何东西被宣布为私人,但除此之外,我只是不知道。
#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];
}
有哪些安全漏洞?
答案 0 :(得分:6)
善于撰写安全代码
您很可能不想要您负责找到bugtraq或cve的系统。如果你不理解,请老实说实话。告诉他你不理解,你想要努力。拿起3}}。阅读,学习,喜欢它。从长远来看,问这个问题并给你的老板答案绝对没有帮助你。
然后再次查看示例代码:)
答案 1 :(得分:5)
我所看到的(绝不是完整的清单):
std::string
和“C ++方式”(如Cat Plus Plus所述)我认为这是一个错字:
charpoor_method(
您错过了char
和poor_method(
您没有检查first
或last
是否确实是有效的指针(不幸的是,您可以做的最好是针对NULL
检查它们。)
first
或last
确实可以容纳您复制到它们的任何内容。returnfirst[0];
return
和first[0]
之间缺少空格
学习编写安全代码是非常重要的事情。遵循布莱希特的建议并擅长。
答案 2 :(得分:2)
charlength = strlen(buffer);
if(length <= NAME_SIZE)
{
strcpy(first, buffer);
}
charlenght这里是未声明的,长度也是如此,它们应该被声明为unsigned int。
strlen不会将'\ 0'计算为长度的一部分,因此如果缓冲区的len为255 + 1('\ 0',strcpy会将'\ 0'复制到First之后的任何值。 )
如果char *第一个大小是,它也应该是NAME_SIZE但是comparisson应该是 长度&lt; = NAME_SIZE - 1 或者首先将char *分配给NAME_SIZE + 1
我可能会重写整件事,非常难看。
答案 3 :(得分:2)
不是使用strcpy()
,而是使用具有特定长度参数的strncpy()
,因为该函数(如strtok()
)假设源为NULL终止的缓冲区,可能不是这种情况,为复制到first
或last
所指向的缓冲区中的数据提供缓冲区溢出。此外,您不知道为first
和last
分配的缓冲区有多长...不要假设您的函数用户已正确分配了足够的内存来复制,除非它们已经传递了一个参数,告诉你缓冲区中有足够的内存插槽。否则,您可能(并且很可能会)以缓冲区溢出结束。
如果您使用的是C99,则可能需要使用restrict
关键字,以防止您的函数调用者为buffer
first
的同一内存位置别名,和last
。