缓冲区溢出漏洞浅析

 

缓冲区是指内存中一段连续的地址空间,用来缓存数据。在大多数开发语言中,把数组和指针分配的空间作为缓冲区。缓冲区溢出是指读取或写入的范围超过数组或指针指向的缓冲区空间,导致程序运行期间发生异常。缓冲区溢出大多数情况下编译器无法给出错误信息,而只有当程序运行期间才会暴露出来,所以缓冲区溢出也归属于运行时缺陷。运行期间发生异常是由于缓冲区溢出数据(包括上界和下界),破坏了缓冲区上下边界外其它变量的数据,导致出现异常,由于在程序运行期间,是否超过边界、超过边界时,破坏了边界外的数据,而边界外数据是否发生异常,取决于收到污染的变量值,是否合理,当时是否用于其它程序功能等,所以缓冲区溢出缺陷可能会出现程序异常,也可能短期内不会出现程序异常。

 

     下面是缓冲区溢出原理示意图:

 

 

   缓冲区溢出在不同的编译器和操作系统下,溢出数据破坏栈中位置可能不同。与操作系统是否支持DEP(数据执行保护)有关。

 

   常见的缓冲区溢出缺陷包括:

  1. 写入污染数据导致的越界
  2. 污染数据由于数组下标
  3. 污染数据用于内存分配函数
  4. 污染数据用于指标操作
  5. 污染数据用于拷贝字符串
  6. 污染数据用于格式化字符串
  7. 给数组赋值字符串越界
  8. 数组下标访问越界
  9. 初始化内存越界
  10. 指针操作越界
  11. 字符串拷贝越界
  12. 格式化字符串导致的缓冲区溢出

 

缓冲区溢出可以使任何一个有黑客技术的人取得机器控制权甚至最高权限。比较著名安全漏洞事件包括2003年8月的冲击波病毒、2014年4月报出的openssl“Heartbleed”(心脏滴血)漏洞,2015年1月的glibc库幽灵漏洞。根据CNNVD2018年12月月报显示,当月采集漏洞1275个,其中缓冲区溢出错误排名第一,一共196个,占比15.37%。在CWE收集的缓冲区溢出漏洞相关的编号包括CWE 119、CWE 120、CWE 121、CWE 122、CWE 129、CWE 134、CWE 193、CWE 787、CWE 788和CWE 805等。

缓冲区溢出导致安全漏洞是主要是由于开发人员在编写程序中缓冲区使用不当引起的,这种类型有共同的特征,是可以通过源代码静态分析手段检测出来,是完全可以在开发阶段检测出来并进行修复的,这时候修复安全漏洞的成本也是最低的。

下面我们列举其中的几个包含缓冲区溢出错误的代码。

  1. 写入污染数据导致的越界

#include <stdio.h>

#include <stdlib.h>

 

int main(int argc, char *argv[])

{

  

   char cArray[10];

   scanf("%s",cArray);

   printf("%s,Hello, welcome you\n",cArray);      

   return 0;

}

上面代码中声明了数组aArray,大小为10个字符长度。在代码中通过控制台输入字符串,直接存储到数组,如果输入长度超过10个,则会导致缓冲区溢出。防止出现这种错误可以通过限制输入数据长度避免该漏洞,例如 scanf("%10s",cArray);

  所谓污染数据主要是指来自于输入设备、文件或网络等外部的数据,如果没有对输入数据的长度、类型等进行合法性检测,则会存在着安全漏洞。我们无法不允许用户输入数据,但是我们必须保证输入数据在可控范围之内。

 

  1. 污染数据用于数组下标

#include <stdio.h>

#include <stdlib.h>

 

int main(int argc, char *argv[])

{

   char cArray[10];

   ind  n=0;

   int  i=0;

 

   for(i=0 ; i<10 ; i++ )

   {

      scanf("%d",@n);

    cArray[n]=1;

   }

return 0;

}

上面代码中声明了字符数组cArray,大小为10,在循环中通过输入一个数字用于数组的下标。如果用户输入0-9之外的数字,则会导致数组越界。防止这种错误产生可以通过对读入的下标值进行判断,是否在0-9范围之内。

CWE 129属于该类漏洞。我们无法控制用户输入我们想要的数据,但是我们可以通过合法性检验防止不能接受的输入。

今天放假第一天,做了几道数学题目,感觉现在初中数学题目真很难,还是整理我们的专业技术还简单一些。由于时间关系,其它类型错误例子后续我继续整理,由浅到深逐渐把缓冲区溢出的各种情况列出来。

关注互联网安全,也不要忘记代码安全。且代码安全,我们可以通过自动化手段实现。代码错误和安全漏洞检测是可以像接口测试一样(赶快摒弃基于GUI的自动化测试吧,为什么大家都搞接口自动化测试),真正能够在企业生产中通过自动化测试工具落地。

关注安全,关注作者

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

manok

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值