爱心技术专栏专题

病毒:众人关注的话题

摘录:linux 来源:linux 加入时间:2006年09月06日
摘要:
病毒:众人关注的话题

   通常有四种截然不同类型的威胁,不过用户经常混淆它们,这主要是因为一次攻击的发生往往是各种机制同时作用的结果:
   病毒 自我复制以感染宿主程序体;
   特洛伊木马 执行任务以将之自身隐藏在某个貌似无害的应用程序中;
   蠕虫 利用计算机网络来进行自我繁殖,例如通过电子邮件;
   后门程序 允许外部用户使用间接手段掌控某项应用程序。

病毒:众人关注的话题

站点:爱心种子小博士 关键字:病毒:众人关注的话题
病毒:众人关注的话题
   通常有四种截然不同类型的威胁,不过用户经常混淆它们,这主要是因为一次攻击的发生往往是各种机制同时作用的结果:
   病毒 自我复制以感染宿主程序体;
   特洛伊木马 执行任务以将之自身隐藏在某个貌似无害的应用程序中;
   蠕虫 利用计算机网络来进行自我繁殖,例如通过电子邮件;
   后门程序 允许外部用户使用间接手段掌控某项应用程序。

   对它们加以分类通常不那么容易;例如,有些程序在某些观测者看来是病毒,但其它人却认为它们是蠕虫,要做出最终的决策是十分棘手的。不过对于本文所涉及的范围来说,这倒并不很重要,本文意在阐明哪种威胁会危及Linux系统。

   与普遍看法正相反的是,这四种祸害其实已经都存在于Linux上了。当然,病毒的传播环境不像在如DOS下那么有利,但现有的威胁亦不容小视。就让我们分析一下有哪些风险。

潜在的威胁

   病毒

   病毒是一小段安置在某个宿主程序核心位置的代码,它能够通过感染新的执行文件来自我复制。病毒最早出现于70年代,当时的程序员在玩一个叫做"core war"的游戏。这个游戏来自于Bell AT&T laboratories[MARSDEN 00]。其目标是在有限的内存区域里并行运行,小程序能够互相破坏。操作系统没有提供程序内存区域之间的保护,这样就允许相互进攻以消灭对手。为此,有些人使用0来轰炸最大可能的内存区域,与此同时,其它一些人永远在地址空间中移动,希望覆盖掉对手的代码,有时,他们中的一些会联合起来消灭某个难对付的敌人。

   实现该游戏的算法被翻译成一门特别为其创建的汇编语言red code,它通过绝大多数现有机器上的仿真器来执行。游戏中的乐趣更多源于科学的好奇,就如对the Life of Conway Game,不规则碎片形和遗传算法等的狂热一样。

   不过,随着关于core war的文章发表在Scientific American[DEWDNEY 84]上,不可避免的事发生了,有些人开始编写小段的自我复制的代码,这些代码特别针对于软驱启动扇区或者可执行文件。起初是在Apple ][计算机上出现,接下来就到了MacIntosh和PC的计算机上。

   MS DOS操作系统成为了病毒繁殖环境的绝佳之选:静态可执行文件有着众所周知的格式,没有内存保护,没有基于文件存取权限的安全设置,广泛地在内存中堆叠使用TSR常驻程序,等等。我们必须还加上一条用户心理状态的因素,他们疯狂地用软盘交换可执行程序甚而毫不考虑文件的来源。

   在最简单的模式中,病毒就是一小段代码,它可以在启动一项应用程序时作为附件执行。它将利用这段时间来查找其它尚未感染的可执行文件,将其自身内嵌入这些文件中(要是考虑再周到一些,最好保持原程序不作修改)并退出。一旦启动新的可执行文件时,进程即会重新启动。

   得益于大量利器的协助,病毒可以自动复制自身。在[LUDWIG 91]和[LUDWIG 93]中,有关于for DOS病毒的详细描述,它们使用诡秘的隐身术以保持领先于当前的杀毒软件:随机加密,代码永久变化等等。你甚至可能遇到使用遗传算法来优化其生存期和繁殖能力的病毒。相关的信息你可以在以下这篇非常著名的文档中找到:[SPAFFORD 94].

   而我们必须牢记于心的是计算机病毒已经超越了虚拟生活中试验的主题范围,它可以造成大面积的损害。一小段代码的多重复制本质不过是空间的浪费(磁盘和内存),而病毒则可以此作为支撑——运输工具——来服务于其它更加令人不快的东西:逻辑炸弹,我们将在特洛伊木马中再次谈到它。

   特洛伊木马和逻辑炸弹

   Timeo Danaos et dona ferentes - 即便当希腊人送礼时,我也惧怕他们。 (Virgile, Aeneid,II, 49)。

   被围困的特洛伊人作了一个糟糕的决定,他们将大量被希腊攻击者作为宗教祭品而遗弃的木马雕像放进了城。真正的突击队就藏在特洛伊木马的侧部,待到他们一旦渗入城内,便利用夜幕掩护从里面攻击城池,这样使得希腊人最终赢得了特洛伊战争的胜利。

   著名的特洛伊木马常被用作计算机安全领域的专门术语,它表示一个看似无害的应用程序,就如上面提到的病毒一样,传播破坏性的代码逻辑炸弹。

   逻辑炸弹是一段恶意伤害的程序,它具备各种迥异的效力:

   系统资源的高消耗(内存,硬盘,CPU等等。);
   所有可能文件的快速破坏(覆盖它们以阻止用户找回其内容);
   不时地对一个文件进行秘密侵蚀,以尽可能隐藏得更久;
   对系统安全的攻击(执行十分松懈的存取权限,将密码文件发送给一个internet地址等等。);
   将该机器作为计算机恐怖行动之用,这些恐怖行动如DDoS(Distributed Denial of Service)之类的都在业已闻名的文章[GIBSON 01]中有提到;
   关于磁盘上应用程序注册码的详细清单,并将其发送给软件开发者。

   在某些情况下,逻辑炸弹会针对特定的目标系统来编写,以试图窃取其上的机密信息,破坏特殊文件或者盗用用户身份识别去毁损其名誉。同样的炸弹在任何其他类型的系统上则是无害的。

   逻辑炸弹也可以试图在物理上破坏其驻留的系统。这种可能性虽然不大,但是确实存在(删除CMOS存储器内容,修改modem闪存内容,打印机、绘图仪、扫描仪的头部毁灭性的移动,硬盘读磁头的加速运转...)

   倘若继续按照炸弹的比喻描述,我们可以说逻辑炸弹需要雷管来引爆。实际上,就效率而言,特洛伊木马或病毒在首次启动时就执行破坏性的操作是一个不好的策略。在安装了逻辑炸弹之后,最好是等待一会再爆炸。对于病毒传播来说,这可以增加其在其它系统中传播的机会;而就特洛伊木马来说,则可以不让用户太容易发现新的应用程序安装与他机器上的异常现象之间的联系。

   就像任何害人之举一样,发作机制也是各有不同:安装后延迟十天,删除特定用户帐号(临时删除),键盘和鼠标停止活动30分钟,打印机队列的高负载...无所不缺!最有名的特洛伊木马是屏幕保护程序,尽管今天看来这有点太老套。在诱人的外表下,这些程序能够不受干扰地实施破坏,特别是如果逻辑炸弹恰在一小时之后引爆,那么几乎可以肯定用户此时已经不在计算机前面了。

   另一个特洛伊木马的著名例子是下面这个脚本,它显示一个登录/密码(login/password)屏幕,并发送信息给启动程序的人然后退出。若它工作于未使用的终端,该脚本将会俘获下个尝试连接的用户的密码。


   #! /bin/sh

   clear
   cat /etc/issue
   echo -n "login: "
   read login
   echo -n "Password: "
   stty -echo
   read passwd
   stty sane
   mail $USER <<- fin
login: $login
passwd: $passwd
   fin
   echo "Login incorrect"
   sleep 1
   logout

   为使之在完成以后断开连接,它必须用shell命令exec启动。当受害者看到"Login incorrect"消息时,会以为自己输入错误,他们会以常规的方法尝试再次连接。更为高级的版本能够模拟X11连接对话框。为了避免落入这种圈套,最好是先在终端上使用一个错误的登录/密码(这种方法反其道而行之,十分容易而且很快就能学会)。

   蠕虫

   Paul发现自己在Worm之上,欢呼雀跃,就像一位君主主宰了整个宇宙。(F. Herbert "Dune") "Worms"出自于与病毒一样的原理。它们是一种尝试复制自身以尽可能传播得最广的程序。它们也可以携带一枚装备了延迟触发器的逻辑炸弹,尽管这并非其主要功能。蠕虫与病毒的差别在于蠕虫不使用宿主程序作为传播媒介,它们试图得益于由网络提供的功能,例如电子邮件来从一台机器传到另一台机器。

   蠕虫的技术等级相当高;它们利用提供网络服务的软件的漏洞来促使其在远程机器上自我复制。其原型是1988"Internet Worm"。

   Internet Worm是一个纯蠕虫的例子,没有包含逻辑炸弹,不过其不露声色的破坏效果十分可怕。你可以在[KEHOE 92]上找到对其简短而精到的描述,或者在[SPAFFORD 88]或[EICHIN 89]上找到详细的分析报告。

   简而言之,蠕虫程序的作者是Robert Morris Jr,他当时是Cornell大学的学生,并已经因为一篇关于网络协议中的安全问题的文章[MORRIS 85]而小有名气。他便是在NCSC(NSA的分支部门)因计算机安全而被指控的那个人。程序是在1988年11月2日傍晚发布的,并且导致连接到Internet上的绝大多数系统停止运行。它的工作步骤如下:

   1.一旦渗透进入计算机,蠕虫就尝试传入网络。为了获取地址,它读取系统文件并调用工具程序如netstat来提供关于网络接口的信息。

   2.接下来,它试图获得用户帐号。为此,它拿字典内容与密码文件作比较。同时,它尝试使用用户名字的组合(反向,重复等等)作为密码。这一步会要借助于系统的第一个漏洞:密码加密在一个可读的文件(/etc/passwd)中,这样便可以从某些用户对密码的糟糕选择中获益。第一个漏洞现在已经通过使用shadow passwords获得解决。

   3.如果成功地获得了用户的帐号,蠕虫会试图找出那些提供直接访问而无需身份鉴定的机器,也就是使用~/.rhost和/etc/hosts.equiv文件。在那种情况下,再使用rsh来在远程机器上执行指令。这样,就能将其自身复制到新的主机上并且循环再次开始。

   4.否则的话,就使用第二个系统漏洞来进入其它机器:fingerd缓存溢出漏洞。(检查我们关于安全编程的系列文章:Avoiding security holes when developing an application - Part 1, Avoiding security holes when developing an application - Part 2: memory, stack and functions, shellcode, Avoiding security holes when developing an application - Part 3: buffer overflows。)

   这个缺陷允许了远程代码执行。然后蠕虫能够复制自身到新的系统上并再次开始。实际上,这只在某些类型的处理器上有效。

   5.最后,使用第三个漏洞:一个调试选项,它默认地在sendmail守护进程中激活,允许邮件发送最终传输的内容到程序指定作为目标的标准输出上。该选项在运行机器上应该永远不被激活,但是,不幸地是,绝大多数系统管理员忽视了它的存在。

   我们应注意的是一旦蠕虫能够在远程机器上执行一些指令,那么复制自身的方法是相当复杂的。它需要传输一个小的C程序,在现场重新编译,然后启动。接着,它建立一条TCP/IP连接来启动计算机并取回所有蠕虫的二进制程序代码。那些最终的和预编译的蠕虫代码现存于各种体系结构(Vax和Sun),而且相继都作了测试。此外,蠕虫非常善于隐藏自身,这让你无迹可寻。

   不幸地是,阻止计算机感染蠕虫的机制并非总能如愿地起作用,而且不包含逻辑炸弹的Internet 88蠕虫的害处就在于导致所感染系统的极度过载(特别是对邮件的阻塞,这引起邮件提交的延迟)。

   蠕虫的作者曾经在监狱中呆过一段时间。

   由于其复杂性,蠕虫相对要稀少一些。一定不要将它们与别的类型的威胁,像作为电子邮件附件传输的病毒如著名的"ILoveYou"相混淆。那些都是十分简单的,它们不过是用宏编写的(在Basic中)可执行程序以在阅读邮件时自动启动。这只对某些操作系统有效,例如当邮件阅读器配置得太简单时。这些程序更像特洛伊木马,而非蠕虫,因为它们都要求用户的操作来启动程序。

   后门程序

   可以拿后门程序与特洛伊木马作比较,不过它们并不相同。一个后门程序允许(高级)用户操作软件来修改其行为。它可与游戏中用来获取更多资源,或达到更高级别等目标的欺骗代码相提并论。只是这也同样适用于关键的应用程序,如连接认证程序或电子邮件,因为它们可以对密码进行隐藏访问,该密码仅有软件的创建者知晓。

   程序员希望减轻调试阶段的工作,因此常常留有一个小的后门开放以使之能够无需经过认证机制而直接使用软件,即使当应用程序已经安装在客户端时也是如此。有时它们使用默认密码(system,admin, superuser等等)是正式的访问设置,不过这些密码并没有在文档中仔细记载,结果管理员仍旧让其开着。

   记得不同的隐藏的访问入口是在"Wargame"电影中才允许放在和系统内核一起讨论的,不过你也可以找到关于此类实践的更早报道。在一篇难以置信的文章[THOMPSON 84]中,Unix之父其中的一位Ken Thompson描述了他于数年前在Unix系统上实现的隐藏的访问入口:

   他修改了/bin/login应用程序以内嵌一小段代码,通过输入预先编译好的硬编码的密码(不须考虑/etc/passwd)可提供对系统的直接访问。这样,Thompson能够使用这个login版本访问每个系统。

   不过,该应用程序的源码只存于当时(像是为了今天的自由软件)。之后,login.c的源码在Unix系统上公布,这样每个人都能读取俘获的代码。因此,Thompson提供了干净的不带访问后门的login.c。

   问题在于每个管理员都能够重新编译login.c来删除俘获了的版本。于是,Thompson修改了标准C编译器以使之能够在注意到某人试图编译login.c时添加后门。

   但是接着编译器源代码cc.c又出现了,这样每个人都能读取或者重新编译编译器。为此,Thompson提供了干净的编译器源代码,但是已经处理过的二进制文件能够识别自己的源文件,那么还是包含了用来感染login.c的代码...

   怎样解决这个问题?咳,毫无办法!唯一的方法就是使用一个全新的系统重新启动。除非你在安装机器时从头创建所有的微代码,操作系统,编译器,实用工具,否则你无法确定每个应用程序都是干净的,即使是那些有源码的程序。

转载:转载请保留本信息,本文来自http://www.51dibs.com/lp07/la/a24/l_a_876e86df6d3ce078.html

客户服务中心信箱:[email protected] [email protected] 网站地图

声明

爱心赞助: