栈溢出漏洞攻击原理及防护技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
栈溢出漏洞攻击原理及防护技术
发布时间:2011年06月29日
∙
o分享
∙推荐
∙打印
∙收藏
文/H3C攻防研究团队
现阶段的安全漏洞种类很多,包括大家熟悉的SQL注入漏洞、缓存溢出漏洞、XSS跨站脚本漏洞等。而栈溢出漏洞作为缓冲区溢出漏洞的一种特定的表现形式,在现实网络环境中比较普遍。本文将从栈溢出漏洞的原理、攻击形式及防护方法等方面进行介绍
一、栈溢出漏洞的原理
栈溢出(Stack Overflow)是在网络与分布式系统中被广泛利用的一种漏洞类型。在汇编中,以线程为线索的指令执行对函数的调用及局部变量的存取是依靠栈来实现的,黑客可以使用特定的脚本语言,通过网络远程向对外提供业务的服务器进行攻击,利用对栈中数据的填充越界,实现有效的漏洞攻击。下面的例子对该过程进行了详细的描述:
下面这段C代码的vulnerable_func函数用于完成对input字符串的临时存储及对变量isSafe的判断,同时主程序main中,分别对该函数进行正确及错误的参数输入,两相对比可以看出正常调用的栈处理赋值及不正常时的栈溢出情形。函数关键代码如下所示:int vulnerable_func(char * input)
{
int isSafe = 0;
char vulnerable_var[16];
strcpy(vulnerable_var, input);
if (isSafe == 0)
{
printf("Check error!\n");
return 1;
}
printf("Check Pass!\n");
return 0;
}
int main(int argc, char* argv[])
{
vulnerable_func("Hello World!\n");
vulnerable_func("Hello World!AAAAAAAAAAAAAAA");
return 0;
}
通过特定的技术手段,调用查看两种情况下函数调用的栈处理过程,得到的栈参数赋值如图1所示:
地址0013FEFC开始的16个字节为vulnerable_var变量在栈中的存储空间;地址0013FF0C为isSafe 变量在栈中的地址;地址0013FF10为m ain函数EBP在栈中的地址;地址0013FF14为函数返回地址在栈中的存储地址
图1正常栈与溢出栈对比图
进一步分析可知,图1右图中超计划输入的数据覆盖了栈中isSafe变量、EBP和函数返回地址所在内存空间的内容,一般会引发数据混乱或程序崩溃。对于软件开发人员来说,这只是软件开发过程中诸多错误中常见的一种内存越界错误,而对于安全人员来说这可能就意味着一个非常危险的安全漏洞。因为黑客会利用这种漏洞巧妙的构造出攻击输入以跳出原程序的设计逻辑,甚至执行任何攻击者想要执行的代码。
二、栈溢出漏洞的典型攻击方式
栈溢出漏洞在客户端和服务器上均有可能存在,攻击者主要通过网络以远程方式进行攻击。对于客户端的攻击一般受NAT及防火墙阻隔的影响,需要搭建伪装的服务器通过社会工程学引诱用户访问,在回应用户访问时构造数据进行攻击。传送伪造的数据文件引诱用户打开,以攻击处理软件中的漏洞也很常见,当然在局域网中的直接攻击也广泛存在。对于服务器的攻击则只需直接伪造对服务器访问,在连接或登录后构造报文或数据进行攻击。
黑客在远程利用网络实施栈溢出漏洞攻击时,其攻击报文将通过网络找到特定的服务器主机,并在主机进行函数调用时实施破坏性行为。典型的攻击行为主要有以下三种:
1)修改相邻数据
仍以前面的演示代码为例,假设此代码为服务器上的安全检查模块的一部分,input为远程用户的登录信息,isSafe为系统中的判断用户关键数据。如果第二次函数调用只修改栈中isSafe变量,就可模拟出一次远程用户的攻击,并绕过对isSafe变量的检查,造成一次非法用户绕过安全检查的成功入侵。由于这种方式受限于系统设计时的诸多因素,实际出现的机会相对较少。
2)修改函数返回地址
栈溢出更常见的一种利用方式是覆盖漏洞函数的返回地址。若演示代码中input输入足够长时,就会覆盖修改函数vulnerable_fun的返回地址(即图1中地址0012FF14的内容),如果此时输入为精心构造的shellcode(即实现攻击行为的一段机器指令码),准确地修改该返回地址,就可能跳转到shellcode中去执行,攻击者也就可能获取进程对应的权限执行远程植入的指令序列。
3)修改SEH(Structured Exception Handling)
windows异常处理是windows程序出错后自己处理错误并进行补救的一种机制, 包括SEH、VEH (Vector Exception Hander)、UEF(Unhandled Exception Filter)等技术简单来说,可以想像SEH
为栈中的一个单链表,如果函数中使用了__try、__except等异常处理宏,就会在该函数栈帧中压入SEH 结点并链接到单链表的头部。发生异常时就会从栈中自顶向底调用SEH链表结点中的异常处理函数。当栈溢出覆盖了后续需要处理的数据或破坏了栈的平衡,均会造成程序运行异常,引发SEH机制调用栈中的异常处理函数。这种情况下,如果SEH链表结点的异常处理函数地址也被覆盖成了shellcode地址或者可以跳转到shellcode的指令地址,一次修改SEH的栈溢出执行任意代码攻击就发生了。由于SEH覆盖的攻击方法比较高效,成为windows上栈溢出的经典攻击方式。
三、栈溢出漏洞的防护技术
在栈溢出的检查与防范方面,软件开发工具厂商及团体已经做了不少努力,如微软在Visual Studio系列中增加了栈溢出检查的编译选项。合理利用这些带安全特性的开发工具,可以提升系统的安全性,在遭受攻击时检查出程序中的数据溢出中止攻击行为。在操作系统方面,Windows系列操作系统中增加了SEHOP (SEH Overwrite Protection) ,以阻止攻击者通过修改SEH来利用漏洞,增强了系统的安全性,其它操作系统也有类似的机制来提升安全性。硬件方面,64位CPU中引入了NX(No-eXecute)硬件机制。其保护方法的本质,就是在内存中区分数据区与代码区,堆内存与栈内存都是数据区,程序代码部分则为代码区,当攻击使CPU跳转到数据区去执行时,就会异常终止。
对于大量用户已投资的现有软硬件资产,不可能都升级到最新的软硬系统上。即使经济允许,可以绕过防御机制的新漏洞会不断被挖掘与捕获,攻击方法也会推陈出新,成熟的节点软硬件防御机制总是在总结了攻击规律后经过相当长时间推出,因而不能及时对一些新漏洞与新攻击方法生效。所以网络防御措施相当必要,IPS设备就是比较典型的网络防御设备,可以采用各种技术进行针对性更强的防御。
1. 基于漏洞特征的检测
漏洞都有一定的触发条件,对漏洞的攻击过程就是构造外部输入使之既能满足触发条件又能使系统跳出原先逻辑执行攻击者设定动作的过程。显然针对栈溢出漏洞的攻击,也必须达到漏洞的触发条件——注入超过系统逻辑计划存储的数据长度。如前面代码所演示的,对于input输入超过16个字节就能触发演示漏洞。漏洞特征库就是基于已知漏洞的触发条件建立起来的特征信息库,当发现最新的漏洞触发特征,同步动态更新防御设备上的漏洞特征库,基于这个信息库进行网络流量的检测可以有效的发现与阻止针对已知漏洞的攻击,如图2为H3C IPS设备上漏洞库中缓冲区溢出漏洞的部分信息。
图2 H3C IPS T1000A设备上部分缓冲区溢出类漏洞信息
2. 基于攻击特征的检测