杨鑫
摘要:利用缓冲区溢出漏洞对计算机系统实施攻击,是黑客常用、并且最有效的攻擊手法之一。为了应对不断涌现的缓冲区溢出攻击,研究了在Linux系统下防范缓冲区溢出的方法,通过研究,总结了在Linux平台下防范缓冲区溢出攻击的安全策略,这些安全策略可以应用于一般企业内部服务器,包括web服务器、mail服务器、samba服务器、ftp服务器以及proxy服务器等。在实际使用中,发现通过这些安全策略的配置能够对缓冲区溢出攻击起到很好的防范措施。
Abstract: Using computer system overflow vulnerability to carry out attacks is one of the common and the most effective attack techniques for hackers. In order to deal with the emerging buffer overflow attack, we come up with some solutions against this problem under Linux system. Through the study, we summarize the security strategy against the overflow buffer attack, which can be applied to general enterprise internal server, including web server, mail server, samba server, FTP server and proxy server, etc. In actual use, we can see it is very good to prevent the attack through these security setup.
关键字:Linux 缓冲区溢出 攻击
Key Word: Linux, buffer overflow, attack
第一次大规模的缓冲区溢出攻击发生在1988年的Morris蠕虫,它造成了6000多台机器瘫痪,损失在$100000至$10000000之间。缓冲区溢出攻击已经占了网络攻击的绝大多数。据统计,大约80%的安全事件与缓冲区溢出攻击有关。
缓冲区溢出漏洞已成为一个困扰了安全专家的难题。简单来说,它是由于编程机制而导致的、在软件中出现的内存错误。这样的内存错误使得黑客可以运行一段恶意代码来破坏系统正常地运行,甚至获得整个系统的控制权。
在对计算机系统安全的研究中,有一种系统安全漏洞引起了我们的关注。一方面是由于这种安全漏洞的广泛性--几乎使所有的操作系统平台都受到影响。另一方面,我们为黑客基于此类安全漏洞所编写的攻击程序的隐蔽性和强大威力所吸引。这就是缓冲区溢出技术。它可以使看似安全的,正在运行常规服务(如 DNS、ftpd等)的主机在几秒钟内失去控制权。在当前CERT和CIAC等发布的Internet安全事件报告中, 缓冲区溢出已成为常见的用语。缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能。这样可以让攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。
为了应对不断涌现的缓冲区溢出攻击,我们研究了在Linux系统下防范缓冲区溢出的方法,之所以选择Linux平台,主要有两方面的原因:(1)Linux是一个开放源码的平台,有利于我们在研究的过程中深入技术细节,由于Linux及其上面的大量应用都是基于开放源码,有很多黑客在其上进行了大量的工作,可以说Linux上的网络攻击水平代表了整个网络攻击的最高水平。(2)Linux是一个类Unix系统,同时也是在Internet中大量使用的操作系统平台,选择Linux作为研究缓冲区溢出技术的平台是非常具有代表性的,在Linux平台上取得的经验可以非常容易地移植到其他Unix或者类Unix平台上。
在Linux出现之初,由于其最初的优秀设计,似乎具有先天病毒免疫能力,所以当时有许多人相信不会有针对Linux的病毒出现,但是 Linux终于也不能例外。1996年秋,澳大利亚一个叫VLAD的组织用汇编语言编写了据称是Linux系统下的第一个病毒的Staog,它专门感染二进制文件,并通过三种方式去尝试得到root权限。当然,设计Staog病毒只是为了演示和证明Linux有被病毒感染的潜在危险,它并没有对感染的系统进行任何损坏行动。
2001年,一个名为Ramen的Linux蠕虫病毒出现了。Ramen病毒可以自动传播,无需人工干预,虽然它没有对服务器进行任何破坏,但是它在传播时的扫描行为会消耗大量的网络带宽。Ramen病毒是利用了Linux某些版本(Redhat6.2和 7.0)的rpc.statd和wu-ftp这两个安全漏洞进行传播的。同年的另一个针对Linux的蠕虫病毒Lion则造成了实际的危害。其它Linux平台下病毒还有OSF.8759、Slapper、Scalper、Unux.Svat和BoxPoison等,当然,大多数普通的Linux用户几乎没有遇到过它们。这是因为直到目前,Linux上的病毒还非常少,影响的范围也很小。但随着Linux用户的增加,越来越多的Linux系统连接到局域网和广域网上,自然增加了受攻击的可能,可以预见到会有越来越多的Linux病毒出现,因此如何防范Linux病毒就成为每个Linux用户现在就应该开始注意的事情了。
随着现代网络技术的发展和网络应用的深入,计算机网络所提供的远程登录机制、远程调用及执行机制是必须的。这使得一个匿名的Internet用户有机会利用缓冲区溢出漏洞来获得某个系统的部分或全部控制权。实际上,以缓冲区溢出漏洞为攻击手段的攻击占了远程网络攻击中的绝大多数,这给Linux系统带来了极其严重的安全威胁。
攻击途径
通常情况下攻击者会先攻击root程序,然后利用缓冲区溢出时发生的内存错误来执行类似“exec(sh)”的代码,从而获得root的一个Shell。为了获得root权限的Shell,攻击者需要完成如下的工作:在程序的地址空间内安排适当的特定代码。一般使用如下两种方法在被攻击的程序地址空间内安排攻击代码;通过适当地初始化寄存器和存储器,使程序在发生缓冲区溢出时不能回到原来的执行处,而是跳转到被安排的地址空间执行。
当攻击者找到一种途径可以变原程序的执行代码和流程时,攻击的危险就产生了。
防范措施
Linux下的缓冲区溢出攻击威胁既来自于软件的编写机制,也来自于Linux(和Unix)系统本身的特性。实际上,缓冲区溢出攻击及各种计算机病毒猖獗的根本原因在于现代计算机系统都是采用冯.诺依曼“存储程序”的工作原理。这一基本原理使得程序和数据都可以在内存中被繁殖、拷贝和执行。因此,要想有效地防范缓冲区溢出攻击就应该从这两个方面双管其下。
确保代码正确安全
缓冲区溢出攻击的根源在于编写程序的机制。因此,防范缓冲区溢出漏洞首先应该确保在Linux系统上运行的程序(包括系统软件和应用软件)代码的正确性,避免程序中有不检查变量、缓冲区大小及边界等情况存在。