首页 理论教育计算机网络与信息安全:缓冲区溢出攻击与防御

计算机网络与信息安全:缓冲区溢出攻击与防御

【摘要】:目前最流行的一种攻击技术就是缓冲区溢出攻击。当目标操作系统收到了超过了它能接收的最大信息量时,将发生缓冲区溢出。缓冲区溢出是由编程错误引出的。如果缓冲区被写满,而程序没有检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生。缓冲区溢出之所以泛滥,是由开放源代码程序的本质决定的。(二)缓冲区溢出的防御缓冲区溢出是目前导致“黑客”型病毒横行的主要原因。

目前最流行的一种攻击技术就是缓冲区溢出攻击。当目标操作系统收到了超过了它能接收的最大信息量时,将发生缓冲区溢出。这项攻击对技术要求比较高,但是攻击的过程却非常简单。

(一)缓冲区溢出

缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区又被称为堆栈,在各个操作进程之间,指令被临时存储在堆栈当中,堆栈也会出现缓冲区溢出。

缓冲区溢出的原理很简单,如下所示。

程序中利用strcpy()函数将str中的内容拷贝到buff中,只要str的长度大于16,就会造成缓冲区溢出,存在类似strcpy()函数这样问题的C语言函数还有很多。

当一个超长的数据进入到缓冲区时,超出部分就会被写入其他缓冲区,其他缓冲区存放的可能是数据、下一条指令的指针或者是其他程序的输出内容,这些内容都被覆盖或者破坏掉了。可见一小部分数据或者一套指令的溢出就可能导致一个程序或者操作系统崩溃。

缓冲区溢出是由编程错误引出的。如果缓冲区被写满,而程序没有检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生。缓冲区溢出之所以泛滥,是由开放源代码程序的本质决定的。标准C语言具有许多复制和添加字符串的函数,这使得标准C语言很难进行边界检查。一般情况下,覆盖其他数据区的数据是没有意义的,最多造成应用程序错误,但是,如果输入的数据是经过“黑客”精心设计的,覆盖缓冲区的数据恰恰是“黑客”或者病毒的攻击程序代码,一旦多余字节被编译执行,“黑客”或者病毒就有可能为所欲为,获取系统的控制权。(www.chuimin.cn)

(二)缓冲区溢出的防御

缓冲区溢出是目前导致“黑客”型病毒横行的主要原因。从“红色代码”到Slammer,再到“冲击波”,都是利用缓冲区溢出漏洞的典型病毒案例。缓冲区溢出是一个编程问题,防止利用缓冲区溢出发起的攻击,关键在于程序开发者在开发程序时仔细检查溢出情况,不允许数据溢出缓冲区。此外,用户需要经常登录操作系统和应用程序提供商的网站,跟踪公布的系统漏洞,及时下载补丁程序,弥补系统漏洞。因此,防御方法大致可以划分为两类。

1.编译时防御

编译时防御,是指在进行编译的时候通过检测程序防止或侦测缓冲区溢出。完成该防御的可能性依赖于选择一种不允许缓冲区溢出的高级语言,鼓励使用安全的编码技术,使用安全的标准库,或者包含用来检测栈帧是否被破坏的附加代码。

2.运行时防御

就像我们已经注意到的那样,大多数编译时防御方法需要对现有的程序重新编译。因此,人们有了对运行时防御的兴趣,像操作系统通过更新来对存在漏洞的程序提供保护一样,运行时防御也能像这样配置。