对于避免缓冲区溢出,可以使用很多安全防御措施,包括:
1)精心编程避免缓冲区溢出。编写程序时,应当严格检查缓冲区长度,避免出现将过长的数据复制到长度较小的缓冲区空间,程序员一方面要预估并控制输入数据的长度,并且根据需要动态地申请/分配内存以便灵活处理具有不定长度的输人数据,甚至在处理更长输人数据时采用分段复制、分段处理的程序流程。
2)使用替代的安全函数或函数库。不使用C或C++语言中那些存在缓冲区溢出问题的函数,而改用一些更安全的函数,如使用sU'ncpy()代替strcpy();此外,可以使用一些知名的底层库来代替使用C/C÷+语言提供的基础库,如采用Libmih、libsafe等,这些库提供了一 些更为安全的基础函数。
3)基于探测方法防御,使用更新、更具安全性的编译环境,打开一些具有安全防御机制的选项。有些高级编程环境会在复制用户数据之前主动探测目标空间,将一个“探测” 值插入到返回地址的前面,以保证不会出现缓冲区溢出,如1m一u LlIllX提供的StackGuarc'l、 OpenBSD提供的ProPolice、Microsoft提供的/GS选项等。
4)非执行的堆栈防御。这种方法要求不允许执行堆栈上的代码,从而防止攻击者利用缓冲区溢出后执行堆栈上的代码。这包括为OpenWall所使用non-exec补丁和为Red Hat/ Feclora所使用exec shield。