您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > Win32平台堆栈溢出的检测保护
Win32平台堆栈溢出的检测保护目前,在缓冲区溢出漏洞检测技术研究方面,国外的研究比较深入,而国内的研究尚处于起步阶段。总体上,缓冲区溢出漏洞检测技术大致上可分成基于源代码的静态检测技术、基于目标代码的检测技术、基于源代码的动态检测技术、基于攻击代码不可执行的检测技术以及基于缓冲区溢出攻击代码特征的检测技术等几大类。对于堆栈溢出攻击可采取主动和被动两种方式来防范。所谓主动方式,就是在软件开发过程中采取一些措施来避免出现溢出漏洞。例如避免使用存在缓冲区溢出漏洞的库函数;对代码进行数组边界检查;在程序发布之前,使用一些错误注入软件来测试程序,发现漏洞后及时修改。然而即使软件通过了代码安全检查,仍有可能存在缓冲区溢出问题。这时只能使用一些被动的措施来防范可能的攻击。一种是对存在溢出漏洞的程序打补丁。然而很多系统管理员只是在遭到攻击后才想起给系统打补丁,因此这种方法的有效性完全依赖于系统管理员的管理水平。另外一种方法是运行一个监控程序,实时监控进程的运行状况,一旦出现缓冲区溢出,就将进程杀死或者提示管理员。1)向API中勾挂监控代码在某些溢出程序中,攻击者有时会采取间接跳转的技术,利用系统核心dll中的指令完成跳转。例如攻击者可首先在系统动态链接库中寻找类似于FFE4的数据,FFE4是汇编指令jmpesp的二进制代码。如果找到了,则将返回地址A等于该指令的地址。这样当函数返回时,程序将执行jmpesp指令,而此时esp恰好指向shellcode的位置。对于这种攻击方式,上面的方法就不起作用了。然而绝大多数溢出攻击程序溢出成功后,在其shellcode的代码中都会调用WindowsAPI函数,对此可在API中勾挂监控代码,检查API函数的返回地址,一旦发现调用者来自堆栈,就可中断程序的运行,因为对于正常的程序而言,它是不会在堆栈上运行代码的。而且也没必要监控所有的API函数,只需监控一些shellcode常用的函数。例如LoadLibray,GetProcAddress,system,winexec,Socket等函数。2)基于攻击代码不可执行的检测技术不可执行缓冲区技术是指即使发生缓冲区溢出,攻击程序空间也是不可执行的,从而不会导致攻击发生。这种技术主要有两类:堆栈不可执行技术和堆不可执行技术。对于堆栈不可执行技术,OverflowGuard、Seeurestack等软件在Windows系统中实现了“不可执行的堆栈”。缓冲区溢出后,在数据页或堆栈页中执行代码时,由于该页被ITLB标记为系统页,CPU将产生一个异常。这种方法在Intel及其兼容的32位CPU上有效,它禁止在堆栈和数据页上执行代码,可以防范基于堆栈和堆的溢出攻击。在AMD的64位CpU的TLB中,引入了NX位(NonExecutebit),WindowsXP的ServieePaekZ版本则直接设置数据或堆栈页面的NX位为1,从而避免了上述方法所需要的大量开销,其局限性是需要WindowsXP及AMD的64位cPu,多数程序会在堆栈段里放置可执行代码,不可执行堆栈保护检查返回地址,如果在堆栈中,禁止执行在堆栈中的代码,报告错误并记录。为保持兼容,信号中断和955在线重用都要执行在堆栈段中的代码,此时只要允许堆栈段可执行即可。但是shellcode位于代码段或可执行的数据段就可绕过该方法的保护,这种保护是不彻底的。近来Unix和Windows操作系统为实现更好的性能和灵活性,在数据段中动态地植入可执行代码,使得攻击者可绕过不可执行的堆栈保护。而老版本的Unix操作系统数据段代码不可执行,可保护函数指针。研究结果表明,堆栈保护和非执行缓冲区技术能有效地防范多数的缓冲区溢出漏洞攻击。3)基于缓冲区溢出攻击代码特征的检测技术这类检测技术通过分析缓冲区溢出攻击代码的特征,在程序运行期间对它和外界的信息交互进行监控,以发现可能的缓冲区溢出攻击。缓冲区溢出攻击的目的是控制系统甚至获得管理员权限,同时为了提高攻击的成功率,需要采取一些措施,所有这些构成了缓冲区溢出攻击代码的结构特征:含有exeeo,setuido等系统调用;含有一段用于占位的无用指令,如NOP,AAA,CLC等,同时具有长达几百字节的连续可执行指令;含有一段位置上连续、数值相同的值来存储所要跳转的地址,且其值的范围很小:不能含有“0x00”等。利用这些特征可以在入侵检测系统中加入相应的规则或者开发专门的检测软件对网络中的数据包进行监控,从中发现可能的缓冲区溢出攻击,发出警告并实施一些应急措施。
本文标题:Win32平台堆栈溢出的检测保护
链接地址:https://www.777doc.com/doc-2867386 .html