歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> Unix教程

淺談關於Unix操作系統下的病毒特點


  ELK CLONER:第一個計算機病毒,它將會得到你磁盤上所有的東東,它甚至將滲透到芯片內部,這就是Cloner!它會象膠水一樣粘住你,它還會修改內存!
  
  計算機病毒是大量的電子破壞技術手段中最著名的成員。它們實際上就是一些非常危險的惡意程序,它們是丑陋的,不過在我看來它們很可愛,源於我對Internet的駕馭和對計算機程序的探索。它們會復制自己並且可以傳染其它文件,這些被傳染的文件甚至包括了那些很清白的文檔文件。而且它們很容易獲得,他們可以隨處傳播,任何時間、任何地點。實際上,沒有一個OS可以完全抵御病毒,一個病毒可以完全依靠系統本身進行復制,比如利用Windows系列操作系統的pe格式的可執行文件和利用類unix操作系統的elf格式。所以,任何計算機病毒都依附於OS的體系結構,各種OS的病毒的寫法都不一樣,但任何OS也逃避不了病毒,包括Linux。
  
  正如以上所說,Linux也可以被感染,就像Windows NT或者Mac OS這樣的操作系統一樣。不論是PC機上的DOS或Windows,或者是Amiga,都可以創造出病毒代碼。那麼,我們為什麼不來看看在Windos NT或Linux系統上的一些病毒呢?
  
  你也許會奇怪,事實上第一個計算機病毒是Unix病毒(有可能第一個就是ElkCloner,好象是編寫於1980到1982年之間)。FredCohen在4BSD的VAX系統上編寫了一些非常早的Unix病毒,一年以後ElkCloner就誕生了。由於Unix系統具有內存保護機制,所以人們不太相信Unix系統上的病毒的危害性會超過Windows和DOS系統,但他們錯了。
  
  一些公共的誤區
  
  一個最大的誤區就是很多高性能的安全系統對病毒蔓延的預防。因為我們是利用DOS系統和它本身並不存在任何內存保護機制和數據保護機制,我們認為病毒可以完全控制計算機的所有資源。是的,它們會很輕易地成為DOS和簡單Windows操作系統的完全控制用戶。沒有內存保護機制和數據保護機制,計算機病毒可以奪取所有的計算機控制權。相對來說,Windows NT和Unix系統是非常高級的保護機制的系統。這可以預防大多數的病毒的傳染,但不是所有的。當一個用戶以root或administrator的身份來操作的時候,這些系統的保護機制實際上是停止了的。一個設計的很巧妙的病毒可以利用自己的方法來找到文件系統上的每個文件,NT ownership或者ACL機制都沒有很好的重視這個問題。
  
  另一個誤區就是認為Linux系統尤其可以防止病毒的感染,因為Linux的程序都來自於源代碼,不是二進制格式,這才應該值得重視,因為畢竟只有極少數的人(甚至管理員)才有足夠的能力來從源代碼中發現病毒代碼,而且這是一個相當耗費時間和精力的工作。一般的用戶習慣於用二進制格式的文件來交流,因為他們不想在使用這些程序的時候還要很繁瑣的執行諸如make config、make之類的命令,他們喜歡很簡單的運行程序。所有的這些原因就給了Unix系統上的病毒有足夠的空間來訪問和操控系統。
  
  第三個誤區就是認為Unix系統是絕對安全的,因為它具有很多不同的平台,而且每個版本的Unix系統有很大的不一樣。但是現在不能這樣看了,現在的病毒都用標准C來編寫以適應任何類Unix操作系統,並且他們可以用make程序來跨平台編譯。想想那個Morris寫的internet的蠕蟲病毒利用的就是這項技術,並且擁有標准的ELF二進制格式和庫文件。
  
  Shell腳本
  
  我們面臨的第一個問題就是如何傳播的問題,這是天生具有的問題,至少在Unix系統上是如此,我們需要想辦法使各個平台兼容,所以我們首先想到的是:shell腳本語言。shell在不同的Unix系統上面的差別很小,所以FredCohen在他的書《入侵者、蠕蟲和病毒》(發表於1990年)中寫道:“在unix的命令解釋語言中,病毒代碼可以被寫到200個字節之內。”也許我們可以根據他的話來寫一個man page的病毒腳本,可以用來操作文件和可執行程序,這和宏病毒非常相像。man page的病毒不會蔓延到別的系統上,除非你有為別的用戶改變man page的格式的習慣。無論如何,這種病毒都是一個公共的跨系統的病毒。同樣,也可以寫另個一個腳本病毒來控制mail的閱讀者。
  
  書寫shell腳本病毒是一個很簡單的制造Unix病毒的方法。我知道肯定會有很多同行會說,腳本病毒怎麼會是真正的病毒呢?它只是用腳本語言來書寫的而不是用匯編。但是實際上,我們評定一個病毒是病毒本身可以在系統上任意感染傳播,而不是這個病毒的大小或者用什麼語言來寫的。在USENIX1989 卷2上你可以看到Tom Duff和M. Douglas McIlroy的腳本病毒代碼。shell腳本病毒的危害性不會很大並且它本身極易被破壞,因為它是以明文方式編寫並執行的,任何用戶和管理員都可以發覺它的代碼。但是,我想大多數的用戶都不會理解一下代碼的吧:
  
  for %%f in (*.bat) do copy %%f + bfv.bat
  
  通常一個用戶會深信不疑地去執行任何腳本,而且不會過問該腳本的由來。這樣,這些用戶都成為病毒的目標了;這些都是用戶的意識問題,這樣是沒辦法避免病毒的入侵的,所以我們的用戶需要大大加強對這些病毒的防范意識。
  
  蠕蟲
  
  另外的一個影響廣泛的技術就是蠕蟲,想象一下Morris蠕蟲:利用攻擊程序——一般這些攻擊程序都是已經存在的技術。這個蠕蟲利用一個sendmail程序已存在的漏洞來獲取其它機器的控制權。病毒一般會利用rexec、fingerd或者口令猜解來嘗試連接。在成功入侵之後,它會編譯在目標機器上編譯源代碼並且執行它,而且會有一個程序來專門負責隱藏自己的腳印。Internet的蠕蟲病毒一般都是利用已知的攻擊程序去獲得目標機的管理員權限,但是蠕蟲的生命也是很短暫的,當該病毒所利用的漏洞被修補的話,那麼該蠕蟲也就失去它的作用了,因為他們需要利用exploit這個媒介來進行自身的復制。而exploit又是只針對特定版本的特定程序才會有效的,所以蠕蟲的跨平台能力很差,時效性也很弱。
  
  欺騙庫函數
  
  我們可以愚弄那些比較傻的用戶。如果你利用LD_PRELOAD環境變量來捉弄他,你可以讓他執行你自己的代碼,你已經利用LD_PRELOAD環境變量把標准的庫函數替換成了你自己的程序,挺有意思吧?LD_PRELOAD並不是linux系統特有的,並且它一般用在一些應用程序(比如老版本的StarOffice需要運行在較新版本的Redhat系統上)必須用他們自己的(或者比較老的版本,或者修改過的)庫函數,因為在安裝的時候沒有滿足他們的需求。Quantum(Staog病毒的作者)在Unix病毒的郵件列表裡面提供了這些代碼,我做了修改,也是為了便於大家理解:
  
  ------------------------tryld.c------------------------------
  extern int __open(char *, int, int);
  extern int execv(char *, char *[], char *envp[]);
  
  int open(char *path, int flags,
  int mode){
  printf("open: %s\n", path);
  return __open(path, flags, mode);
  }
  
  /* 注意這裡,原來它放棄了envp參數,這樣會...:(?!
  呵呵,所以我修改了一下,影響不大:)*/
  int execve(char *path, char *args[],
  char *envp[]){
  printf("execve: %s\n", path);
  return execv(path, args, envp);
  }
  --------------------------------------------------------------
  ------------------------main.c--------------------------------
  /*test only,by e4gle*/
  #include
  #include
  #include
  #include
  
  main()
  {
  int fd;
  execve("/bin/date","",NULL);
  if(fd=open("/etc/inittab",O_RDONLY)!=-1)
  {
  fprintf(stdout,"open file succeed!\n");
  }
  else
  fprintf(stderr,"open error!\n");
  close(fd);
  return 0;
  }
  ----------------------------------------------------------------
  
  這段代碼獲取open和execv並且改變了它們的輸出,好,我們測試一下:
  
  [e4gle@redhat62 elf]$ gcc -o main main.c
  [e4gle@redhat62 elf]$ ./main
  open file succeed! <--證明我們打開文件成功了,open調用正常工作
  [e4gle@redhat62 elf]$ ldd -v -r ./main
  libc.so.6 => /lib/libc.so.6 (0x4001c000)
  /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
  
  Version information:
  ./main:
  libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
  /lib/libc.so.6:
  ld-linux.so.2 (GLIBC_2.1.1) => /lib/ld-linux.so.2
  ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
  ld-linux.so.2 (GLIBC_2.0) => /lib/ld-linux.so.2
  /*跟蹤一下庫函數的利用,都是glibc的標准庫函數,solaris裡面是sotruss,我個人認為sotruss
  比較好用:)*/
  [e4gle@redhat62 elf]$ gcc -shared -o tryld tryld.c
  [e4gle@redhat62 elf]$ export LD_PRELOAD=./tryld <--用我們自己的lib
  [e4gle@redhat62 elf]$ ./main
  execve: /bin/date
  open: /etc/inittab
  open file succeed!
  /*注意!不一樣了吧?已經在用我們自己的open和execve了,呵呵:)*/
  
  以上僅僅是個測試代碼並且沒有任何危害性,但是它足以說明我們利用欺騙函數庫來攻擊程序的原理。
  
  內核級的傳播
  
  這裡我們稱作“內核級別的病毒”,病毒可以傳染內核映像,這樣病毒可以控制系統的方方面面。但是這種病毒技術目前尚處於理論階段,並沒有真正實現,但並不代表以後都不會出現。
  
  與平台兼容的病毒
  
  如果我們用標准C來書寫病毒代碼的話,各種不
Copyright © Linux教程網 All Rights Reserved