缓冲区溢出攻击的原理是什么?
分析:
如果你把一加仑的水倒进一品脱的水里,水就会流得到处都是,然后你就会完全理解溢出的含义了。同理,在计算机中,如果在有限的内存空间中存储了过多的数据,数据也会溢出内存空间。输入数据通常存储在一个临时空间中,这个空间称为缓冲区,缓冲区的长度已经由程序或系统预先定义。
什么是缓冲区溢出?
缓冲区溢出是指当计算机程序填充到缓冲区中的数据位数超过缓冲区本身的容量时。溢出数据覆盖在合法数据上。理想情况下,程序会检查数据长度,不允许输入超过缓冲区长度的字符串。然而,大多数程序都假设数据长度总是与分配的存储空间相匹配,这就为缓冲区溢出埋下了隐患。系统使用的缓冲区也称为堆栈。在各个进程之间,指令临时存储在堆栈中,堆栈也会溢出缓冲区。
当一个超长数据进入缓冲区时,超出的部分将被写入其他缓冲区。其他缓冲区可能存储数据、指向下一条指令的指针或其他程序的输出内容,这些都将被覆盖或销毁。可见,一小部分数据或一组指令的溢出都可能导致程序或系统崩溃。
溢出的根源在于编程
缓冲区溢出是由编程错误引起的。如果缓冲区已满,而程序没有检查缓冲区边界或停止接收数据,则会发生缓冲区溢出。缓冲区边界检查被认为是无利可图的管理开销,计算机资源或内存的不足是程序员不写缓冲区边界检查语句的原因。然而,摩尔定律已经让这个理由失去了基础,但大多数用户仍然在他们的主要应用程序中运行十年甚至二十年前的程序代码。
由于开源程序的性质,缓冲区溢出现象非常普遍。有些编程语言对缓冲区溢出免疫,比如Perl可以自动调整字节排列的大小,Ada95可以检查并防止缓冲区溢出。但是,广泛使用的C语言并没有建立检测机制。标准C语言有许多复制和添加字符串的功能,这使得标准C语言很难检查边界。c++稍微好一点,但是还是有缓冲区溢出。一般来说,覆盖其他数据区的数据是没有意义的,最多会造成应用错误。但如果输入数据是黑客或病毒精心设计的,那么覆盖缓冲区的数据只是黑客或病毒的代码。一旦额外的字节被编译和执行,黑客或病毒就可以为所欲为,控制系统。
溢出导致“黑客”病毒猖獗。
缓冲区溢出是病毒编写者和特洛伊病毒编写者首选的攻击方法。攻击者或病毒善于在系统中寻找容易发生缓冲区溢出的地方,运行特殊程序,获取优先权,指令计算机破坏文件、更改数据、泄露敏感信息、创建后门接入点,感染或攻击其他计算机。
2000年7月,微软Outlook和Outlook Express被发现存在漏洞,使得攻击者仅通过发送电子邮件就能危及目标主机的安全。只要电子邮件标题程序运行,就会导致缓冲区溢出并触发恶意代码。2001年8月,“红队”利用微软IIS的漏洞制造缓冲区溢出,成为攻击企业网络的“罪魁祸首”。2003年6月5438+10月,Slammer蠕虫利用微软SQL漏洞产生缓冲区溢出,冲击全球互联网。近日,一种名为“Shockwave”的蠕虫利用微软RPC远程调用的缓冲区漏洞攻击了Windows 2000/XP和Windows Server 2003,并蔓延至全球网络系统。据CERT安全团队介绍,工作系统中超过50%的安全漏洞是由内存溢出引起的,其中大部分与微软技术有关。这些与内存溢出相关的安全漏洞正被越来越多的蠕虫利用。
缓冲区溢出是目前“黑客”病毒肆虐的主要原因。从红队到Slammer,再到前几天爆发的“冲击波”,利用缓冲区溢出漏洞就是典型。缓冲区溢出是一个编程问题。防止利用缓冲区溢出攻击的关键是程序开发人员在开发程序时仔细检查溢出情况,不允许数据溢出缓冲区。此外,用户还需要经常登录系统和应用提供商的网站,跟踪已发布的系统漏洞,及时下载补丁,弥补系统漏洞。