这段代码可以包含缓冲区溢出吗?

时间:2014-05-29 11:37:37

标签: c security buffer stack-overflow fgets

这些天我读过缓冲区溢出攻击,实际上我不能说我已经了解了大局,我心里有些疑惑。

所以,为了解决我的疑问,问题出现了,如果我的程序是用C语言编写的,并且所有代码都用于获取输入或复制/合并缓冲区,检查边界,是否会发生缓冲区溢出?或直接说,是输入(无论何处来)攻击者可以用来导致缓冲区溢出的唯一方法?

例如,请考虑以下代码:

int main(){
    int size = 15;
    char buf[size];
    fgets(buf, size , stdin);
    printf("%s",buf);}

是否容易受到缓冲区溢出的影响? 谢谢!:)

2 个答案:

答案 0 :(得分:3)

实际上伙计们代码中存在错误,并且可能存在潜在的安全问题,在某些应用程序中进行编码!简而言之,检查返回值很重要。

虽然可能有人认为他的程序确实是安全的,但更大的图景是关于代码上的模式,并确保代码的假定不变量,即buf,包含0到14字节之间的NULL终止字符串长。

从手册页:

  

fgets()函数必须从流中读取字节到s指向的数组,直到n-1个字节       读取,或读取并传输到s,或遇到文件结束条件。       然后该字符串以空字节终止。

     

返回值

     

成功完成后,fgets()将返回s。如果流位于文件末尾,则       应设置流的文件结束指示符,并且fgets()应返回空指针。       如果发生读错误,则应设置流的错误指示符,fgets()应返回       空指针,[CX] [Option Start],并设置errno以指示错误。

安排错误条件,可能意味着没有NULL可以附加到字符串并且缓冲区被自动分配,因此printf(3)可能泄漏信息..想想Heardbleed。

当chux指出初始化自动分配的缓冲区buf[0] = '\0';,或者静态声明buf以使其系统初始化为0时,不应该依赖于错误,buf的状态是未定义的

因此需要检查fgets的返回值。所以更像是:

{ 
  char *s;
  if ((s = fgets( buf, sizeof buf, stdin)) {
      puts( s);
  }
}

以下是有关安全编程的文章的链接,可能会引起您的兴趣http://www.dwheeler.com/secure-programs/

答案 1 :(得分:1)

使用'fgets'确实可以防止缓冲区溢出。根据手册页:

  

fgets()函数最多读取一个小于给定流中size指定的字符数,并将它们存储在字符串str中。读-        在找到换行符时,在文件结尾或错误时停止。保留换行符(如果有)。如果读取任何字符且没有错误,        附加一个“\ 0”字符以结束字符串。

注意上面的“阻止”。如果将大小设置为大于实际缓冲区,则可以提取比缓冲区可容纳的更多信息,从而导致缓冲区溢出。建议使用

sizeof(buf)

以防止可能超过缓冲区大小。