攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为堆栈溢出攻击 Stack Smashing Attack ,是目前最常用的缓冲区溢出攻击方式。 2、函数指针 Function Pointers : 函数指针可以用来定位任何地址空间。例如:“void * foo ”声明了一个返回值为void的函数指针变量foo。所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了。它的一个攻击范例就是在Linux系统下的superprobe程序。 长跳转缓冲区 Longjmp buffers : 在C语言中包含了一个简单的检验/恢复系统,称为setjmp/longjmp。意思是在检验点设定“setjmp buffer ”,用“longjmp buffer ”来恢复检验点。然而,如果攻击者能够进入缓冲区的空间,那么“longjmp buffer ”实际上是跳转到攻击者的代码。
象函数指针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。一个典型的例子就是Perl 5.003的缓冲区溢出漏洞;攻击者首先进入用来恢复缓冲区溢出的的longjmp缓冲区,然后诱导进入恢复模式,这样就使Perl的解释器跳转到攻击代码上了。 缓冲区溢出影响及危害 在几乎所有计算机语言中,不管是新的语言还是旧的语言,使缓冲区溢出的任何尝试通常都会被该语言本身自动检测并阻止(比如通过引发一个异常或根据需要给缓冲区添加更多空间),但是有两种语言不是这样:C和C++语言。C\C++语言由于其针灵活应用的特性,通常允许让额外的数据乱写到其余内存的任何位置,而这种情况可能被利用从而导致意想不到的结果。而且,用C\C++编写正确的代码来始终如一地处理缓冲区溢出则更为困难;很容易就会意外地导致缓冲区溢出。更重要的一点就是C\C++的应用非常广泛,例如,Red Hat Linux 7.1中86%的代码行都是用C或C++编写的。因此,大量的代码对这个问题都是脆弱的,出现缓冲区溢出也就是常见的事情。 缓冲区溢出漏洞很容易被蠕虫病毒利用造成了很大的危害,如2001年7月19日,CodeRed蠕虫爆发,造成的损失估计超过20亿美元[2],2001年9月18日,Nimda蠕虫被发现,造成的损失更大,超过26亿美元,2002年Slapper蠕虫出现,2003年1月25日Slammer蠕虫爆发,2004年5月1日,“震荡波”被发现,这几个病毒对网络安全造成的破坏之大是前所未有的。
而以上病毒都利用了缓冲区溢出漏洞。 缓冲区溢出的防御方法 缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权。如果能有效地消除缓冲区溢出的漏洞,则很大一部分的安全威胁可以得到缓解。 目前有4种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响。 3.1、写正确的代码的方法 编写正确的代码是一件非常有意义的工作,特别象编写C语言那种风格自由而容易出错的程序,这种风格是由于追求性能而忽视正确性的传统引起的。尽管花了很长的时间使得人们知道了如何编写安全的程序,具有安全漏洞的程序依旧出现。因此人们开发了一些工具和技术来帮助经验不足的程序员编写安全正确的程序。 最简单的方法就是用grep来搜索源代码中容易产生漏洞的库的调用,比如对strcpy和sprintf的调用,这两个函数都没有检查输入参数的长度。事实上,各个版本C的标准库均有这样的问题存在。 此外,人们还开发了一些高级的查错工具,如fault injection等。这些工具的目的在于通过人为随机地产生一些缓冲区溢出来寻找代码的安全漏洞。还有一些静态分析工具用于侦测缓冲区溢出的存在。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30187-3.html
其他都搜不到
我辈仍需努力