一种缓冲区溢出的保护方法

文档序号:6441604阅读:358来源:国知局
专利名称:一种缓冲区溢出的保护方法
技术领域
本发明涉及计算机信息的读入读出保护方法,特别是一种缓冲区溢出 的保护方法。
背景技术
缓冲区是内存中存放数据的地方。在程序试图将数据放到计算机内存 中的某一位置,但没有足够空间时会发生缓冲区溢出。
缓冲区是程序运行时计算机内存中的一个连续的块,它保存了给定类 型的数据。问题随着动态分配变量而出现。为了不用太多的内存, 一个有 动态分配变量的程序在程序运行时才决定给他们分配多少内存。如果程序 在动态分配缓冲区放入太多的数据会有什么现象?它溢出了,漏到了别的 地方。 一个缓冲区溢出应用程序使用这个溢出的数据将汇编语言代码放到
计算机的内存中,通常是产生root权限的地方。单单的缓冲区溢出,并 不会产生安全问题。只有将溢出送到能够以root权限运行命令的区域才 行。这样, 一个缓冲区利用程序将能运行的指令放在了有root权限的内 存中,从而一旦运行这些指令,就是以root权限控制了计算机。总结一 下上面的描述。缓冲区溢出指的是一种系统攻击的手段,通过往程序的 缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,
使程序转而执行其它指令,以达到攻击的目的。据统计,通过缓冲区溢
出进行的攻击占所有系统攻击总数的80%以上。造成缓冲区溢出的原因 是程序中没有仔细检査用户输入的参数。
对于上述问题,现有的主要解决方法是通过编写正确的代码来实现 编写正确的代码是一件非常有意义但耗时的工作,特别像编写C语言 那种具有容易出错倾向的程序(如字符串的零结尾),这种风格是由于
追求性能而忽视正确性的传统弓l起的。尽管花了很长的时间使得人们知道 了如何编写安全的程序组具有安全漏洞的程序依旧出现。因此人们开发了 一些工具和技术来帮助经验不足的程序员编写安全正确的程序。
最简单的方法就是用gr印来搜索源代码中容易产生漏洞的库的调用, 比如对strcpy和sprintf的调用,这两个函数都没有检査输入参数的长 度。事实上,各个版本C的标准库均有这样的问题存在。为了寻找一些常 见的诸如缓冲区溢出和操作系统竞争条件等漏洞, 一些代码检查小组检査 了很多的代码。然而依然有漏网之鱼存在。尽管采用了 strcpy和sprintf 这些替代函数来防止缓冲区溢出的发生,但是由于编写代码的问题,仍旧 会有这种情况发生。比如lprm程序就是最好的例子,虽然它通过了代码 的安全检査,但仍然有缓冲区溢出的问题存在。

发明内容
本发明的目的在于提供一种缓冲区溢出的保护方法,主要解决现有的 通过编写正确的代码来实现的方法不但编写过程十分费时,而且仍然无法
彻底解决缓冲区溢出的的技术问题,降低的系统由于缓冲区溢出而被攻击 的概率。
为解决上述问题,本发明是这样实现的
一种缓冲区溢出的保护方法,其特征在于该方法主要通过非执行的 缓冲区来实现,通过使被攻击程序的数据段地址空间不可执行,从而使得 攻击者不可能执行被植入被攻击程序输入缓冲区的代码。
所述的缓冲区溢出的保护方法,其特征在于该方法在Linux系统中 采用信号传递方式来实现,Linux通过向进程堆栈释放代码然后引发中断 来执行在堆栈中的代码进而实现向进程发送Unix信号,非执行缓冲区的 补丁在发送信号的时候是允许缓冲区可执行的。
所述的缓冲区溢出的保护方法,其特征在于该方法在Linux系统中 采用GCC的在线重用方式来实现,GCC在堆栈区里放置了可执行的代码以 便在线重用,非执行堆栈的保护可以有效地对付把代码植入自动变量的缓 冲区溢出攻击,而对于其他形式的攻击则没有效果。
通过上述技术方案,本发明方法可以通过编写正确的代码来实现的方 法不但编写过程十分费时,而且仍然无法彻底解决缓冲区溢出的的技术问 题,降低的系统由于缓冲区溢出而被攻击的概率。
具体实施例方式
本发明提供了一种缓冲区溢出的保护方法,该方法主要通过非执行的 缓冲区来实现。通过使被攻击程序的数据段地址空间不可执行,从而使得
攻击者不可能执行被植入被攻击程序输入缓冲区的代码,这种技术被称为 非执行的缓冲区技术。
事实上,很多老的Unix系统都是这样设计的,但是近来的Unix和MS Windows系统为实现更好的性能和功能,往往在数据段中动态地放人可执 行的代码。所以为了保持程序的兼容性不可能使得所有程序的数据段不可 执行。但是我们可以设定堆栈数据段不可执行,这样就可以最大限度地保 证了程序的兼容性。Linux和Solaris都发布了有关这方面的内核补丁。 因为几乎没有任何合的程序会在堆栈中存放代码,这种做法几乎不产生任 何兼容性问题,除了在Linux中的两个特例,这时可执行的代码必须被放 入堆栈中
本发明的第一种实施例信号传递
Linux通过向进程堆栈释放代码然后引发中断来执行在堆栈中的代码 进而实现向迸程发送Unix信号。非执行缓冲区的补丁在发送信号的时候 是允许缓冲区可执行的。
本发明的第二种实施例GCC的在线重用
研究发现GCC在堆栈区里放置了可执行的代码以便在线重用。然而, 关闭这个功能并不产生任何问题。只有部分功能似乎不能使用。非执行堆 栈的保护可以有效地对付把代码植入自动变量的缓冲区溢出攻击,而对于 其他形式的攻击则没有效果。通过引用一个驻留的程序的指针,就可以跳 过这种保护措施。其他的攻击可以采用把代码植入堆或者静态数据段中来 跳过保护。另外,为了是本发明的效果更加明显,可配合现有的通过编写正确的 代码来实现的方法来使用,只是实施这种方法的成本更加高。
综上所述仅为本发明的较佳实施例而己,并非用来限定本发明的实施 范围。即凡依本发明申请专利范围的内容所作的等效变化与修饰,都应为 本发明的技术范畴。
权利要求
1、一种缓冲区溢出的保护方法,其特征在于该方法主要通过非执行的缓冲区来实现,通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被植入被攻击程序输入缓冲区的代码。
2、 根据权利要求l所述的缓冲区溢出的保护方法,其特征在于 该方法在Linux系统中采用信号传递方式来实现,Linux通过向进程堆 栈释放代码然后引发中断来执行在堆栈中的代码进而实现向进程发送 Unix信号,非执行缓冲区的补丁在发送信号的时候是允许缓冲区可执 行的。
3、 根据权利要求l所述的缓冲区溢出的保护方法,其特征在于-该方法在Linux系统中采用GCC的在线重用方式来实现,GCC在堆栈区 里放置了可执行的代码以便在线重用,非执行堆栈的保护可以有效地对 付把代码植入自动变量的缓冲区溢出攻击,而对于其他形式的攻击则没 有效果。
全文摘要
本发明涉及计算机信息的读入读出保护方法,特别是一种缓冲区溢出的保护方法。该方法主要通过非执行的缓冲区来实现,通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被植入被攻击程序输入缓冲区的代码。本发明方法主要解决现有的通过编写正确的代码来实现的方法不但编写过程十分费时,而且仍然无法彻底解决缓冲区溢出的技术问题,降低了系统由于缓冲区溢出而被攻击的概率。
文档编号G06F21/22GK101350051SQ200710044020
公开日2009年1月21日 申请日期2007年7月19日 优先权日2007年7月19日
发明者杰 沈, 敏 项 申请人:上海市闵行中学;项 敏
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1