虽然Linux病毒屈指可数,但是基于缓冲区溢出(Buffer Overflow)

漏洞的攻击还是让众多Linux用户大吃一惊。所谓“世界上第一个Linux病

毒”——reman,严格地说并不是真正的病毒,他实质上是个古老的、

在Linux/Unix(也包括Windows等系统)世界中早已存在的“缓冲区溢出

”攻击程式。reman只是个很普通的、自动化了的缓冲区溢出程式,

但即便如此,也已在Linux界引起很大的恐慌。

缓冲区溢出漏洞是个困扰了安全专家30多年的难题。简单来说,他

是由于编程机制而导致的、在软件中出现的内存错误。这样的内存错误使

得黑客能够运行一段恶意代码来破坏系统正常地运行,甚至获得整个系统

的控制权。

Linux系统特性

利用缓冲区溢出改写相关内存的内容及函数的返回地址,从而改变代

码的执行流程,仅能在一定权限范围内有效。因为进程的运行和当前用户

的登录权限和身份有关,仅仅能够制造缓冲区溢出是无法突破系统对当前

用户的权限配置的。因此尽管能够利用缓冲区溢出使某一程式去执行其他

被指定的代码,但被执行的代码只具备特定的权限,还是无法完成超越权

限的任务。

但是,Linux(包括Unix)系统本身的一些特性却能够被利用来冲破

这种权限的局限性,使得能够利用缓冲区溢出获得更高的、甚至是完全的

权限。主要体现在如下两方面:

1.Linux(包括Unix)系统通过配置某可执行文档的属性为SUID或

SGID,允许其他用户以该可执行文档拥有者的用户ID或用户组ID来执行他

。假如该可执行文档的属性是root,同时文档属性被配置为SUID,则该可

执行文档就存在可利用的缓冲区溢出漏洞,能够利用他以root的身份执行

特定的、被另外安排的代码。既然能够使得一个具备root权限的代码得以

执行,就能够产生一个具备终极用户root权限的Shell,那么掌控整个系

统的控制权的危险就产生了。

2.Linux(包括Unix)中的许多守护进程都是以root权限运行。假如

这些程式存在可利用的缓冲区溢出,即可直接使他以root身份去执行另外

安排的代码,而无须修改该程式的SUID或SGID属性。这样获得系统的控制

权将更加容易。

随着现代网络技术的发展和网络应用的深入,电脑网络所提供的远

程登录机制、远程调用及执行机制是必须的。这使得一个匿名的Internet

用户有机会利用缓冲区溢出漏洞来获得某个系统的部分或全部控制权。实

际上,以缓冲区溢出漏洞为攻击手段的攻击占了远程网络攻击中的绝大多

数,这给Linux系统带来了极其严重的安全威胁。

途径分析

通常情况下攻击者会先攻击root程式,然后利用缓冲区溢出时发生的

内存错误来执行类似“exec(sh)”的代码,从而获得root的一个Shell

。为了获得root权限的Shell,攻击者需要完成如下的工作:

1.在程式的地址空间内安排适当的特定代码。一般使用如下两种方

法在被攻击的程式地址空间内安排攻击代码。

2.通过适当地初始化寄存器和存储器,使程式在发生缓冲区溢出时

不能回到原来的执行处,而是跳转到被安排的地址空间执行。

当攻击者找到一种途径能够改变原程式的执行代码和流程时,攻击的

危险就产生了。

防范措施

Linux下的缓冲区溢出攻击威胁既来自于软件的编写机制,也来自于

Linux(和Unix)系统本身的特性。实际上,缓冲区溢出攻击及各种计算

机病毒猖獗的根本原因在于现代电脑系统都是采用冯·诺依曼“存储程

序”的工作原理。这一基本原理使得程式和数据都能够在内存中被繁殖、

拷贝和执行。因此,要想有效地防范缓冲区溢出攻击就应该从这两个方面

双管其下。

确保代码正确安全

缓冲区溢出攻击的根源在于编写程式的机制。因此,防范缓冲区溢出

漏洞首先应该确保在Linux系统上运行的程式(包括系统软件和应用软件

)代码的正确性,避免程式中有不检查变量、缓冲区大小及边界等情况存

在。比如,使用grep工具搜索源代码中容易产生漏洞的库调用,检测变量

的大小、数组的边界、对指针变量进行保护,连同使用具备边界、大小检

测功能的C编译器等。

基于一定的安全策略配置系统

攻击者攻击某一个Linux系统,必须事先通过某些途径对要攻击的系

统做必要的了解,如版本信息等,然后再利用系统的某些配置直接或间接

地获取控制权。因此,防范缓冲区溢出攻击的第二个方面就是对系统配置

实施有效的安全策略。这些策略种类很多,由于篇幅有限只列举几个典型

措施:

(1)在装有Telnet服务的情况下,通过手工改写“/etc/inetd.conf

”文档中的Telnet配置,使得远程登录的用户无法看到系统的提示信息。

具体方法是将Telnet配置改写为:

telnet stream tcp nowait root /usr/sbin/tcpd/in.telnetd -h


末尾加上“-h”参数能够让守护进程不显示任何系统信息,只显示登

录提示。

(2)改写“rc.local”文档。默认情况下,当登录Linux系统时系统运行

rc.local文档,显示该Linux发行版本的名字、版本号、内核版本和服务

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!