[发明专利]一种堆栈溢出的保护方法和装置无效
申请号: | 201110251173.7 | 申请日: | 2011-08-29 |
公开(公告)号: | CN102298677A | 公开(公告)日: | 2011-12-28 |
发明(设计)人: | 宋卿 | 申请(专利权)人: | 瑞斯康达科技发展股份有限公司 |
主分类号: | G06F21/02 | 分类号: | G06F21/02 |
代理公司: | 北京德琦知识产权代理有限公司 11018 | 代理人: | 牛峥;王丽琴 |
地址: | 100085 北京*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 堆栈 溢出 保护 方法 装置 | ||
技术领域
本发明涉及计算机领域,尤其涉及一种堆栈溢出的保护方法和装置。
背景技术
计算机技术和互联网的建设和发展,对整个社会的经济、文化、科技等各方面带来了巨大的推动和冲击,大量电信、电子商务、金融网络等信息化系统已经成为国家和政府的关键基础设施,因此如何确保计算机系统的安全已成为摆在我们面前迫切需要解决的难题。
堆栈溢出漏洞是一个极其严重的系统安全漏洞,它是通过向一个有限的内存空间写入过长的数据,破坏系统的内存空间,导致系统运行异常、死机或重启。通过堆栈溢出攻击,使用攻击代码的地址覆盖函数指针,可以让攻击者获取部分或全部的系统控制权,这是一种极具威胁的安全隐患。
如图1所示,系统内存一般分为5种,代码段code用于存放程序的执行代码,数据段data用于存放初始化的全局变量和静态变量,bss数据段用于存储非初始化的全局变量和静态变量,剩余的内存空间用于系统堆栈使用,堆用于存放系统运行时内存大小未知的对象(通常用malloc分配),使用完后释放(通常用free释放),栈则用于系统运行时“保存现场”,存放临时创建的局部变量,在函数调用时保存参数、返回地址等(通常用PUSH保存),等函数返回时弹出返回所需要的数据(通常用POP弹出)。在内存中堆和栈没有确定的界限,根据程序运行动态变化。堆从低地址往高地址生长,栈则相反。
无论是堆溢出还是栈溢出,都会覆盖掉其他堆栈区域的数据,如果被覆盖的数据对于系统运行是至关重要的,那么将严重影响系统的正常工作。
如果堆中保存了程序运行的函数指针,该堆中的数据如果被覆盖,可以导致系统运行到错误的地址上。
图2所示的是父函数调用子函数后的栈分布图,父函数和子函数都有自己的栈空间,EBP(基址指针,base pointer)和ESP(堆栈指针,stack pointer)分别表示当前栈的底部和顶部指针。函数调用过程中,首先将参数压入堆栈中,然后EBP入栈,然后是子函数的局部变量等。局部数据溢出时,若使用精心设计好的数据(如某段攻击函数的地址)覆盖堆栈中保存的返回指针,那么就可以控制代码的跳转和程序的运行。
堆栈溢出对系统危害极大,目前解决堆栈溢出保护问题的方法有多种,最简单的就是保证代码的质量,如:积极进行手动的边界检查和函数指针检查;不允许执行堆栈中的命令;采用良好的编码习惯,限制使用系统中存在溢出漏洞的接口函数(如字符拷贝、格式化等),但这种方法只能尽可能的减少堆栈溢出的几率,不能从根本上消除。
另一种是通过编译器自动对代码进行优化,调整变量的位置,使容易发生溢出的数据尽可能的远离重要数据(如函数指针、返回地址等),这也只能减轻堆栈溢出对系统的危害,无法消除堆栈溢出,更无法减少堆栈溢出的几率。
目前的堆栈溢出保护实现大多使用基于Canaries的探测技术来完成对这种破坏的检测。Canaries探测方法在检测堆栈对函数栈的破坏时,分别在堆和栈插入Canaries缓冲区。这样如果堆栈在遭到无意或故意的溢出时,首先修改的是Canaries缓冲区,通过对该缓冲区的检查可以判断出是否发生了溢出,防止继续溢出破坏函数栈的控制信息,如图3所示。生成Canaries的方法目前有以下种:
一种是采用固定的特殊字符串填充,通过检查该字符串是否被修改确定是否发生溢出,固定字符串一般选择空格、换行等特殊意义的字符串。该方法虽然可以检查到溢出,但使用固定字符填充容易被攻击者查出Canaries的位置,并跳过该缓冲区直接修改其后的数据,这种情况下溢出保护就无效了。
第二种方法是生成随机数,并保存在一块未被隐射到虚拟地址空间的内存页中,试图通过指针访问保存随机数的内存时就会发生段错误(segment fault),但这个随机数最终会作为Canaries保存在函数栈中,所以攻击者仍然有机会获取该随机数的值。
第三种方法是通过随机数和函数栈中的所有控制信息、返回地址通过运算得到缓冲区填充值,这样函数栈中Canaries、控制信息、返回地址等的修改均可以检查到。但这种方法运算涉及的量多,计算Canaries消耗太大。
发明内容
本发明提供了一种堆栈溢出的保护方法,在提高堆栈溢出防护能力的同时,避免计算过于复杂度的问题。
本发明采取的技术手段是:一种堆栈溢出的保护方法,方法包括:
在堆栈的缓冲区内填充格式为“固定字符串+随机字符串”或“随机字符串+固定字符串”的填充字符串的步骤;
每隔预定的周期检查缓冲区内的填充值是否发生变化。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于瑞斯康达科技发展股份有限公司,未经瑞斯康达科技发展股份有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201110251173.7/2.html,转载请声明来源钻瓜专利网。
- 上一篇:基于计算机视觉的高速公路弯道检测方法
- 下一篇:信息存储系统及信息存储方法