【问题标题】:Can this code contain buffer overflows? [closed]此代码可以包含缓冲区溢出吗? [关闭]
【发布时间】:2014-05-29 11:37:37
【问题描述】:

这几天看了缓冲区溢出攻击,其实我也不能说我了解大局,心里有些疑惑。

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

例如,考虑以下代码:

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

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

【问题讨论】:

  • 不会溢出(如果指定大小还不错的话) fgets 不会只在指定范围的区域内执行写入。
  • 有一个错误.. 应该检查 fgets 的返回值

标签: c security buffer stack-overflow fgets


【解决方案1】:

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

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

来自手册页:

fgets() 函数应该从流中读取字节到 s 指向的数组中,直到 n-1 个字节 被读取,或者 a 被读取并传输到 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/感兴趣

【讨论】:

  • 请不要将纯文本格式化为代码,随机单词高亮时看起来很难看。
  • buf[0] = '\0'; 没有帮助。如果发生 IO 错误,buf 的状态未定义,因此在不检查 fgets() 结果的情况下,使用 buf 不知道是有效字符串。通过检查fgets() 的结果,不需要buf[0] = '\0'; “更好地检查fgets 的返回值”的建议是最好的方法。最好不要printf( s);,因为s可能有'%',最好使用fputs()。否则,很好的答案。
  • 谢谢你现在很清楚,也谢谢你的链接。 :)
【解决方案2】:

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

fgets() 函数最多从给定流中读取比 size 指定的字符数少 1 的字符,并将它们存储在字符串 str 中。读- ing 在找到换行符、文件结尾或错误时停止。保留换行符(如果有)。如果读取任何字符并且没​​有错误, 一个 `\0' 字符被附加到字符串的结尾。

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

sizeof(buf)

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

【讨论】:

  • 好点,但您没有考虑错误情况。
  • 手册页声明“字符串以空字节终止。”这是在它之后的一个 '\n' 或 'EOF'。为什么EOF“意味着不能附加NULL?”
  • @Rob11311,我没有评论你的观点。对不起。
  • 在 EOF 上是正确的,我的重点是解释假设中潜伏的危险,这表明安全编程是多么困难。您需要找到一种方法来导致错误情况,然后它可能会非安全地失败..或者系统可能会意外安全。只需检查返回值.. 如果您关心安全性
  • 其实我以为我已经在手册页上粘贴了返回值.. 现在应该清楚了!
猜你喜欢
  • 1970-01-01
  • 2013-08-31
  • 2010-09-15
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2014-10-05
相关资源
最近更新 更多