缓冲区溢出漏洞的预防

时间:2021-05-03 06:58:16
    由于缓冲区滋出漏洞非常广泛.如何防止其造成系统安全性下降也就成为了人们的重要研究对象。事实上.有大量的方法可以在一定程度L减少或者防止特定的缓冲区滋出漏洞
缓冲区溢出漏洞的预防出现.这些方法包括程序语ii、编译器、运行库,以至于硬件等。
    c语言(以及C++)的广泛使川与缓冲区滋出有密切的关系.重要原因就在于c语言不提供自动的缓冲区边界检查。事实上现在流行的绝人多数编程语言都有自动的缓冲区边界检查机制,这种检查在一定程度上影响了程序的执行效率。当比较安全的语言能够很好地满足需求的时候.可以考虑用它们作为主要开发语言。
    从前面的讨论中还可以看到,人最的缓冲区滋出漏洞都是因为使用strcpy函数而造成的,标准C提供了atrn函数族,但是很多研究都指出了其安全性的不足。同样的问题也存
缓冲区溢出漏洞的预防在于。Iprintf函数上.不同的操作系统提供了一些非标准的·更加安全”的函数,用以替代这些不安全的函数.如OpenBSD的strlcpy和Window,的RtlStringCbCupy.相比之下这些函数要确实更加安全.但是它们依然有缺陷,最主耍的几点是非标准、使用相对麻烦、依然可能会造成N润。这些问皿使得这些安全由数并没有很好地解决缓冲区滋出的问越。
    编译器、C库或者操作系统还可以提供栈和堆的缓冲区滋出保护.以栈滋出为例.这种保护基于函数返回时对栈的完整性检查.在栈上放入合适的标志(canary).当函数返回检查时.如果这些标志发生了改变则认为有缓冲区滋出发生.这种方法在Linux和Wind,下都有应用.如Linux下的libsafe. gcc的StackCuard和ProPolice补一J‘.或者Windows F的DEP机制(Software Data Execution Prevention.在无硬件执行保护时检古ST IE折针的正确性)。
缓冲区溢出漏洞的预防    X86处理器硬件也开始加入7执行保护机制,即NX  (No eXecute )或XD  (eXecuteDisable).通过在数据区.尤其是堆找的贞表项打开NX/XD位,数拟区变为可读不可执行.
当处理器试图在这些页上执行代码时会产生缺贞异常。山操作系统处理。由于这种执行保护延基于页(而不是以前的段),使得保护堆找成为可能。各种常见的操作系统己经开始逐渐加入NX/XD的支持.如Window,的DEP.然而.在较老的操作系统或者不支持NX/XD的处理器上.这种保护不能起到作用。硬件保护极大地提高了数据区的安全性.
缓冲区溢出漏洞的预防    地址空间布间随机化(Address up,layout ran‘一。mmition. ASIA)也是很有效地防止缓冲区沮出的方法,由前面的分析可知.准确地预侧缓冲区的地址在滋出攻击中有漪举足轻
重的作用,ASIA则通过随机性使这种预测变得更加困难。
    对于网络攻击来说,还可以采用深度分组检查的方法。防火墙对所有的分组进行检查.通过特征搜索枪查可能的攻击分组,如前面提到的长串trop指令等.
缓冲区溢出漏洞的预防    前面简要介绍的方法是现在预防缓冲区翻洞的常见方法。当然,新的绕过这些方法的攻击也在不断地被发现.作为软件开发者中.除去工具和系统的辅助,还应努力写出更加安全
健壮的代码.才能更好地减少潜在的缓冲区滋出攻击。