C缓冲区下溢定义和相关风险

时间:2014-10-24 20:24:45

标签: c buffer

根据维基百科: 在计算中,缓冲区欠载或缓冲器下溢是当用于在两个设备或进程之间通信的缓冲器以低于从其读取数据的速度提供数据时发生的状态。

来自apple的安全编码指南: 从根本上说,当代码的两个部分不同意缓冲区的大小或缓冲区中的数据时,会发生缓冲区下溢。例如,固定长度的C字符串变量可能有256个字节的空间,但可能包含一个只有12个字节长的字符串。

Apple的定义补充了缓冲区溢出的概念。

  1. 其中哪些定义在技术上更合理?
  2. 缓冲区下溢是否是一个主要的安全问题?我有使用大缓冲区从串口或套接字轮询和读取()的习惯(虽然我确实使用了bzero())。这是正确的做法吗?

2 个答案:

答案 0 :(得分:2)

  1. 这是" underflow"这两个词的两种不同用法。由于他们描述了两个不同的东西,我不认为你可以在技术稳健性方面对它们进行比较。

  2. 根据Apple的定义,缓冲区下溢可能是一个弱点。见http://cwe.mitre.org/data/definitions/124.html

答案 1 :(得分:2)

2)'我确实使用bzero())。这是正确的做法吗?'

几乎肯定没有。系统调用返回已接收的字节数。如果你完全确定你将接收没有嵌入空值的文本样式数据,并希望在其上使用C风格的字符串lib调用,只需将一个空值推送到缓冲区的末尾,(这通常意味着阅读比声明的缓冲区长度少一个字节,以确保为null提供足够的空间。在所有其他情况下,根本不要打扰终结器。这将是毫无意义或危险的。

在网络缓冲区的情况下,

bzero()只是浪费周期。我不关心有多少网页示例或有多少消息来源说'vars / buffers必须初始化'。这是垃圾。