应用软件运行在操作系统用户层,通过系统调用向操作系统请求服务。在应用软件的安全漏洞中,缓冲区溢出漏洞是最具威胁的一种,一直以来是人们研究的热点问题。本书将现有的针对缓冲区溢出的解决方法分为六类:
1.基于源代码分析的方法
该类方法一般通过静态分析技术自动从源代码中寻找缓冲区溢出漏洞。Wagner等[13]提出了将缓冲区溢出问题规约成整数范围的约束问题进行静态分析,即通过检查C语言中字符串函数(如strlen()和strcpy()函数)对缓冲区的操作来判断是否发生缓冲区溢出。Evans等[14]开发了一种基于注释辅助的静态分析工具ITS4。该工具通过词法分析检查出代码和注释的不一致性,从而检测出是否存在缓冲区溢出。MOPS系统[15]将源代码中的安全相关操作描述为安全时序逻辑,然后利用模型检测技术找出程序中的缓冲区溢出漏洞。
2.基于编译器扩展的方法
StackGuard[16]采用了向程序栈中插入守卫值(canary)的方法,然后在运行时动态验证栈上守卫值的完整性,以判断是否发生栈上缓冲区溢出。守卫值通常为终止符号或随机数,以防止被伪造。ProPolice[15]增强了保护程序栈的范围,它不仅保护函数返回地址,还保护函数参数和相关寄存器中的内容。此外,ProPolice还增强了守卫值产生的随机性。DIRA[17]通过静态分析程序的语义直接在源代码中自动添加保护代码。该方法不仅能在程序运行时检测出控制流的异常,还能动态修复发生了缓冲区溢出的程序。
3.基于操作系统的保护方法
基于操作系统的保护方法需要修改操作系统的某些部分,以抵御应用程序的缓冲区溢出。LibSafe[18]通过重新封装那些未对缓冲区边界进行检查的库函数(如常见的字符串函数strcpy),有效检测并阻止针对程序栈上缓冲区溢出的攻击。Pax[16]通过修改操作系统内核代码,使程序中的任何数据段都无法被执行。e-NeXSh[19]通过在操作系统内核中增加安全模块,动态监控目标程序调用libc函数和系统函数的过程,以验证其操作是否符合程序源代码的行为。如果不符合,则说明发生了缓冲区溢出。(www.xing528.com)
4.基于硬件的保护方法
SmashGuard[20]利用特殊的硬件机制,在调用函数时先保存其返回地址,然后在函数返回时还原其返回地址,从而能有效阻止返回地址被攻击者篡改。Dalton等[21]利用特殊的硬件机制实现了动态数据流的跟踪技术,以检测缓冲区是否溢出。Zeldovich等[22]借助标签内存(Tagged Memory)机制来确保用户程序按照事先制定的策略执行。因此,即使发生缓冲区溢出,攻击者也无法改变目标程序的执行流程。
5.基于ASLR的保护方法
基于ASLR的保护方法有两种不同的实现方式:指令集随机化[23,24]和地址空间随机化[25]。RISE[26]系统基于开源二进制代码转换器Valgrind[27],为受保护的程序提供了私有的指令集,因此,即使有外部的恶意代码被注入程序中,该代码也无法被执行。Gaurav等[24]通过修改操作系统内核也实现了类似的指令集随机化技术。Bhatkar等[25]基于编译器技术打乱内存中代码和数据的位置,以防止黑客非法利用程序现有代码或者通过注入代码的方式破坏程序中重要数据的安全。
6.基于污点分析的方法
基于污点分析的方法是基于软件的方式实现了对程序动态数据流的跟踪。TaintCheck[28]使用基于模拟器的方法来跟踪源于网络和外部存储介质等非可信渠道的数据在内存中的传播过程,从而定位出可能被污染的用户数据。Argos[29]基于类似原理,分析污点数据在内存中更加复杂的传播过程。如果检测到被污染的数据作为跳转、调用及移动的目的地址,系统将产生相应的报警。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。