1.现象描述
入侵者利用缓冲区溢出中常见的堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来Web应用程序崩溃导致拒绝服务,还可以导致Web应用程序跳转并且执行指定恶意代码,获取系统shell或root权限;
2.攻击成因
采用形式
通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。
攻击办法
缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,拥有足够权限后控制整个主机。攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标:在程序的地址空间里安排适当的代码或通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。比如,攻击者通过构建一个畸形的、超长的或不存在的文件请求,导致web服务器没有预料或不能正常处理,这时往往会返回出错信息,暴漏出物理路径。
3.解决办法
事件发现
Web 缓冲区溢出发生时,恶意用户会向Web服务器发送大量非法或畸形数据使得目标Web系统瘫痪。系统收到的数据量通常会大于缓冲区,部分数据就会溢出到堆栈中。如果这些数据是代码,系统随后就会执行溢出到堆栈上的任何代码。
处理办法
有以下基本的方法可以保护缓冲区溢出的攻击和影响。
通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码;
强制编写正确代码;
使用编译器的边界检查来实现缓冲区的保护,这个方法使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁,但是相对而言代价比较大;
间接方法在程序指针失效前进行完整性检查。虽然这种方法不能使得所有的缓冲区溢出失效,但它能阻止绝大多数的缓冲区溢出攻击;
Web应用对用的应用和操作系统定期升级打补丁。