扫一扫
关注微信公众号

如何防范缓冲区溢出攻击?
2007-09-29   网络

防范缓冲区溢出攻击,常见的有四种基本方法:强制要求编写正确的代码、非执行的缓冲区、数组边界检查和程序指针完整性检查。

1.编写正确的代码

要求编写正确的代码是一件非常有意义但耗时的工作,例如C语言编程就非常容易出错。尽管经过长期努力人们知道了如何编写安全的代码,具有安全漏洞的程序依然不断出现。人们开发了一些工具和技术来帮助经验不足的程序员编写安全正确的程序,防范因为缓冲区溢出漏洞引起的攻击。这些工具的目的在于通过人为随机地产生—些缓冲区溢出来寻找代码的安全漏洞。还有一些静态分析工具用于侦测缓冲区溢出的存在。虽然这些工具可以帮助程序员开发更安全的程序,但是由于C语言的特点,它们不可能找出所有的缓冲区溢出漏洞。侦错技术仅能用来减少缓冲区溢出的可能,并不能完全地消除它的存在。

2.非执行的缓冲区

通过操作系统控制,使得缓冲区不可执行,称为非执行的缓冲区技术,这是另一种阻止攻击者植入攻击代码的方法。例如可以设定堆栈数据段不可执行,这样就可以最大限度地保证了程序的兼容性。Linux和Solaris系统都发布了有关这方面的内核补丁。因为几乎没有任何合法的程序会在堆栈中存放代码,这种做法几乎不产生任何兼容性问题。通过使被攻击程序的数据段地址空间不可执行,使得攻击者不可能执行植入到被攻击程序输入缓冲区的代码,可以阻止很多缓冲区溢出攻击的发生。但是这种方法仍然存在局限性,原因在于UNIX和Windows系统为了实现更好的性能和功能,往往允许在数据段中动态地放入可执行的代码,为了保持程序的兼容性,不可能阻止所有程序的数据段都不可执行;另外,攻击者也并不一定都要依靠植入攻击代码实现缓冲区溢出攻击。

3.数组边界检查

通过利用编译器进行数组边界检查的方法,使得缓冲区溢出不可能出现,从而完全消除缓冲区溢出的威胁,实现缓冲区的保护。攻击者植入代码引起缓冲区溢出是一种手段,扰乱程序的执行流程是另一种手段。与非执行的缓冲区保护策略不同,数组边界检查策略的关键在于只要保证数组不能被溢出,溢出攻击也就无从谈起。为了实现数组边界检查,则要确保所有对数组的读写操作都应当被检查,以保证对数组的操作在正确范围内进行。最直接的方法是检查所有的数组操作,通常可采用一些优化技术减少检查的次数。

4.程序指针完整性检查

通过对程序指针进行完整性检查,也可以阻止多数缓冲区溢出攻击。这种方法试图在程序指针被引用之前检测到它的改变。因此即便一个攻击者成功地改变了程序的指针,由于系统事先检测到了指针的改变,这个指针将不会被使用。与数组边界检查相比,这种方法虽然不能解决所有的缓冲区溢出问题,但是它在性能上有很大优势,兼容性也很好。

由于最普通的缓冲区溢出攻击手段是在堆栈中植入代码,采用非执行的缓冲区策略,如非执行堆栈和堆栈保护的方法就可以有效防卫这种攻击。非执行堆栈可以防卫所有把代码植入堆栈的攻击方法,堆栈保护可以防卫所有改变活动记录的方法。这两种方法相互兼容,可以同时防卫多种可能的攻击。剩下的攻击手段基本上可以依靠指针保护的方法来防卫。


热词搜索:

上一篇:什么是缓冲区溢出攻击?这种攻击有哪些类型?
下一篇:什么是分布式拒绝服务(DDoS)攻击?

分享到: 收藏