c代码段中的安全漏洞?

时间:2011-08-24 12:47:07

标签: c security

据说这个代码片段在软件安全性方面存在错误,我似乎无法弄明白......函数die在显示字符串参数后终止程序。

void get_user(char* user)
{
  char buf[1024];
  if (strlen(user) > sizeof(buf))
    die("error: user string too long\n");
  strcpy(buf, user);
  …
} 

-thx!

6 个答案:

答案 0 :(得分:4)

它不计算字符串的NUL(\0)终止符。

if (strlen(user) >= sizeof(buf))

user有1024个字符(在堆栈的某处写0)是不安全的。

答案 1 :(得分:4)

如果strlen(user)等于1024,strcpy将在buf的末尾写一个字节。

答案 2 :(得分:3)

问题在于:

if (strlen(user) > sizeof(buf))

这不考虑strlen(user) == sizeof( buf )时的空终止符。检查应

if (strlen(user) > sizeof(buf) - 1 )

以便strcpy()可以随时复制空终止符。

答案 3 :(得分:2)

有一个可能导致缓冲区溢出的off-by-one错误。请记住,strlen为您提供字符串中的字符数,排除空终止符。检查应该是:

if (strlen(user) + 1 > sizeof(buf)) 

答案 4 :(得分:1)

答案是与字符strcpy副本的数量相比,字符数为strlen返回。

提示:strcpystrlen

答案 5 :(得分:1)

来自strlen联机帮助页:

  

strlen()函数计算字符串s的长度,而不是   包括终止'\ 0'字符。

并从strcpy手册页中获取:

  

strcpy()函数复制src指向的字符串,包括   终止空字节('\ 0'),指向dest。

指向的缓冲区

尺寸比较不匹配。代码检查字符串长度是否小于缓冲区,但复制字符串长度为+1个字符。如果字符串长度(减去终止'\ 0')为1024,则发生溢出。