Java惡意程式之監測與防治方法之研究





湯秉翰*、張正源**、蔡敦仁*

*中國文化大學資訊管理研究所
**中華電信研究所
台北市陽明山華崗路55號
TEL:(02)28610511 EXT:539
EMAIL: thomast@ms4.hinet.net




摘要

  本文主要在探討Java惡意程式所造成之現象與問題,並分析Java安全性與目前軟體業者所提供的解決方法,最後提出一套改進辦法。Java跨平台的優點,使其很有可能成為很有可能成為未來軟體發展的主要工具,惟Java仍然存有若干缺失,當使用者在網路上去瀏覽一段有敵意的Applet時,使用者的機器會造成耗用中央處理器(CPU)運算時程與記憶體而當機。對於目前趨勢科技的產品PC-cillin98防治Java惡意程式之方法,在我們實測之下並無法有效的解決。因此,我們根據這些惡意程式的特徵,進一步研究Java安全性與PC-cillin98的缺點,並提出適當的防治方法。未來將以實際製作程式的方式來驗證其可行性。


一、前言

  Java在網際網路(Internet)上的應用已經日漸普遍,使用在網頁上的Java程式稱之為Applet,利用Applet的嵌入能夠使原本靜態的HTML富有變化,並且能夠做到"聲"、"動"、活潑的頁面,由於Java語言的強大功能,以及其「跨平台」的特性,使得Java受到注目。雖然Java很有可能成為未來軟體發展的主要工具,惟Java仍然存有若干缺失,例如:當使用者在網路上去瀏覽一段有敵意的Applet時,使用者的機器會造成耗用中央處理器運算時程與記憶體而當機[1]。因此,本文將致力於研究Java Applet的破壞問題,並提出適當的防治辦法。

  在本篇文章中,首先我們將探討Java Applet的各種有敵意的Applet型態,並將分析其對電腦可能造成之影響。根據這些Applet的特徵,我們將進一步研究目前Java語言的缺點,尤其是有關安全性(Security)的問題。在防毒軟體中,目前使用最普遍的趨勢科技產品PC-cillin 98提供了Java惡意程式的解決方法;PC-cillin 98中的WebTrap 可阻擋 Java Applet 或ActiveX 由網際網路而感染的惡性程式,但是經過我們的測試,PC-cillin 98是利用類別檔的名稱來判定該Applet是否為惡性程式,此方法在更改了類別名稱後,其功能就無法發揮。針對現Java的安全性與PC-cillin 98的缺點,我們提出一套改進辦法。我們並以程式來驗証辦法的可行性,並觀察其能否有效解決現有Java安全性上的缺失。





二、Java惡意程式之分析

  根據從網路上所搜集之Applets,我們發現許多Applet是具有敵意,而且可能使我們的電腦當機[2],以下為一些Java惡意程式之例子,如表一,這些程式收集於以下網址:

http://super.imd.pccu.edu.tw/~snn/java/hostileapplet/index.html

檔案名稱

執行情形

NoisyBear.java

一隻熊的圖片與時鐘,執行後會一直發出打鼓的聲音,直到關掉瀏覽器。

Wasteful.java

霸佔住系統主控權,現在有mousedown method來停住。

Consume.java

針對Netscape 3.0,霸佔住系統主控權

HostileThreads.java

利用執行緒試著侵犯瀏覽器。

TripleThreat.java

顯示謊言,產生大量執行緒,進而佔據系統主控權。

Ungrateful.java

顯示一個掩飾的畫面,如果試著離開,它會發動攻擊;如果執行成功後,會讀取瀏覽器內部資料並寄出。

DoMyWork.java

類似Ungrateful.java。

AppletKiller.java

殺除其它正在執行的Applet,之後Applets也無法執行。

ScapeGoat.java

使瀏覽器一直連往某個站台,並開啟多個瀏覽器。

PenPal.java

將使用者的e-mail資料寄到特定的主機。

表一:Java惡意程式表


  我們依照所收集的惡意程式之特性,分為幾類型,如表二。

類型

說明

備註

耗費資源型

對系統要求過多資源,如CPU、記憶體等;因而造成使用者系統無法正常運作,造成當機現象。

較具有威脅性

竊取資料型

利用讀取原本瀏覽器內的使用者資料,來獲取一些資訊。

如:來獲取大量的e-mail名單

干擾型

執行並播放高頻或高音量的聲音,或開啟多餘的視窗。

較無威脅

特洛依木馬(Torjan)

掩飾本身真正目的,進入系統。

主要目的是竊取資料

表二:Java惡意程式型態分類表





三、Java安全性問題之研究

  在原始Java語言之設計中,Java在產生與執行程式的過程中,有著一連串的安全性檢查機制[3],例如:類別驗證者(Byte code verifier)、類別讀取者(Class loader)、安全管理者(Security manager),其過程說明如圖一[4]:

圖一:Java安全性流程圖

  1. 類別驗證者:對類別檔的格式做確認,對欲使用到的資料格式、陣列、堆疊的合法性做檢查;其目的是防止不合法的表面格式、資料進入Java虛擬機器中執行,而造成機器執行上的錯誤。

  2. 類別讀取者:主要有兩項工作,一是對程式中所使用到的類別(Class)做”劃分”的動作,主要是為了限制外來的類別,對其權限加以限制。第二是命名”,給予不同的類別各別的名稱,以供處理上的識別[5]。

  3. 安全管理者:程式執行時期之檢查,當類別檔通過驗證之後,進入虛擬機器執行時安全管理者即產生,目的是對執行的動作做檢查。


  在以上各個安全機制中,對於程式所要求的系統資源,如果是經由合法的語法要求,Java並無法對其加以限制,如執行緒的使用。執行緒(Thread)是一個在Java中重要的觀念,利用執行緒可以讓Applet同時在系統中擁有多個工作時程[6]。而在類別驗證者檢查過程中,主要是語法(syntax)使用的合法性檢查,不對語意(semantic)、過度使用執行緒做任何防治的處理。

  雖然Java在語法使用以及網路溝通的安全性相當完善,但是由程式設計者撰寫大量耗費資源的程式卻無法限制,因此Java在安全限制上無法有效的防止"惡意的程式"對讀取者的干擾;因而有心者便可設計出"惡意的程式"來使讀取該Applet的瀏覽者的電腦無法正常使用(Denial of Service)。





四、惡意Applet程式之特性分析

 1. Java Applet的執行

  Java Applet的原始程式是以純文字的檔案存在,經過編譯器產生類別檔(Byte code),類別檔再由Java虛擬機器來執行,類別檔是Java在網路上傳輸的檔案型態。Java Applet的執行流程如圖二。

圖二:Java Applet執行流程圖


 2.惡意Applet特性

  耗費系統資源型Applet大都是因為過度使用執行緒來佔據系統資源,影響到的資源包括處理器核心的時程、執行緒、記憶體。以下是一個耗費資源型惡意Applet例子的原始程式(TripleThreat.java)[2]。

TripleThreat.java
001	import java.awt.*;
002	import java.applet.AudioClip;
003	public class TripleThreat extends java.applet.Applet implements Runnable {
004		Font wordFont = new Font("TimesRoman", Font.BOLD, 36);
005		StringBuffer holdBigNumbers = new StringBuffer(0);
006		AudioClip annoy;
007		int delay;
008		Frame littleWindow;
009		public void init() {
010			setBackground(Color.white);
011			annoy = getAudioClip(getCodeBase(), "Sounds/whistle.au");
012			String str = getParameter("wait");
013			if (str == null)
014				delay = 0;
015			else delay = (1000)*(Integer.parseInt(str));
016		}
017		public void start() {
018			if (wasteResources == null) {
019				wasteResources = new Thread(this);
020				wasteResources.setPriority(Thread.MAX_PRIORITY);
021				wasteResources.start();
022			}
023		}
024		public void stop() {}
025		public void run() {
026			repaint();
027			try {Thread.sleep(delay);}
028			catch (InterruptedException e) {}
029			annoy.loop();
030			while (true) {
031				try {
032					holdBigNumbers.append(0x7fffffffffffffffL);
033					littleWindow = new TripleFrame("ACK!"); // create a window
034					littleWindow.resize(1000000, 1000000);  // make it big!
035					littleWindow.move(-1000, -1000);  // cover everything
036					littleWindow.show();  //  now open the big window 
037				}
038				catch (OutOfMemoryError o) {}
039				repaint();
040			}
041		}
042		public void update(Graphics g) {
043			paint(g);
044		}
045		public void paint(Graphics g) {
046			g.setColor(Color.blue);
047			g.setFont(wordFont);
048			g.drawString("I'm A Friendly Applet!", 10, 200);
049		}
050	}
051	class TripleFrame extends Frame {
052		Label l;
053		TripleFrame(String title) {
054			super(title);
055			setLayout(new GridLayout(1, 1));
056			Canvas blackCanvas = new Canvas();
057			blackCanvas.setBackground(Color.black);
058			add(blackCanvas);
060		}
061	}


此程式之特點舉例如下:

第27行:Applet.start()內的setPriority(Thread.MAX_PRIORITY),產生執行緒與設定執行緒的優先順序,通常其優先權較高。

第30行:Thread.run()內具有無盡迴圈,目的是產生無數的執行緒,讓系統資源耗用殆盡。

第32行:StringBuffer.append(),在執行過程中,增加字串暫存變數的容量到不適當的數值,如:長整數"0x7fffffffffffffffL",或過大的雙精確浮點數。

第34行:Thread.run()內迴圈有Frame產生,並將Frame的大小增加Frame.reize(),以浪費系統記憶體。

第38行:例外處理,Java虛擬機器在執行過程中會丟出"Out of Memory Error"的例外,因此會利用"try&catch"來處理此段發生的例外,如上例:不處理例外。


  以上所指部份特點是在平常設計Java Applet時,較不尋常的使用方法;其主要的目的是利用合法程序來惡意耗用系統資源,使得系統無法正常運作。

  原始程式經由編譯器(javac)產生類別檔,類別檔是Java虛擬機器與原始程式的溝通檔案格式;因此在類別檔中,存在虛擬機器在執行Applet時,所需的所有格式資料。

3. 類別檔格式

  在Java類別檔的格式中存在許多資訊,以下是類別檔的格式[5]:

  1. 魔術數字(Magic Number)
  2. 小版號
  3. 大版號
  4. 常數池個數
  5. 常數池表格(Constant Pool)
  6. 存取旗標(Access Flag)
  7. 本類別
  8. 父類別
  9. 介面個數
  10. 介面表格(Interface Table)
  11. 欄位個數
  12. 欄位表格(Field Table)
  13. 方法個數
  14. 方法表格(Method Table)
  15. 特性個數
  16. 特性資訊(Attribute Info)

  類別檔由Java虛擬機器來處理,再交由Java虛擬機器翻譯成各平台機器所執行的機器碼。類別檔格式中,存在著Applet執行的各項重要資訊,例如:在常數池中有程式使用的所有變數,方法表格中有著程式使用到的方法資訊。



五、Applet執行緒之防治監視方法

針對惡意Applet,我們提出了以下的防治方法。

模組監視(Pattern Monitoring)防治法:

1. 從類別檔案結構中分析出惡意Applet的特性,取得其方法的模組(Pattern)。

2. 預先從某預設主機上取得惡意模組資料庫,即時從網路讀取或更新模組。

3. 在讀取端監看Java Applet的讀取,分析Java的類別檔的結構。

4. 如符合惡意Applet特性度高暫,停該Applet在瀏覽的執行,並通知使用者。

  針對各種惡意程式的不同設計方法,我們分析出各個類別檔內特有的模組,建立Java惡意程式類別資料庫;當使用者去瀏覽具有Applet的網頁時,在類別檔讀入的同時,對該類別檔做分析並與模組資料庫對照,以達到防治的效果。本方法的流程如圖三。

圖三:模組監視法流程圖

  利用我們提出的方法,能對不同性質的Java惡意程式做分析,進一步的更新模組內資料來防止更多日新月異的惡意程式對使用者造成不便。更能對未發現的惡意程式做語意的檢查,以找出新型的惡意程式。

  我們對提出的模組監視方法與目前的防治病毒軟體對於Java惡意程式的防治處理方法做比較,如表三。

 

模組監視法

趨勢科技PC-Cillin98

防治方法

監視系統內Java執行緒,

類別模組比對

類別檔名稱比對

效果

對已知與未知惡意程式都能有效的防治,且能預防Applet過度使用執行緒。

對於原始的(Original)Applet有效,但在改變了類別名稱或如有同名的正常Applet時,則無效或誤判。

表三:防治方法比較表





六、結論

  在網際網路日漸興起的同時,Java的應用日漸廣泛,而在使用網際網路的同時,也會下載不明Java Applet;Java的惡意程式將干擾並影響到使用者。由於PC-Cillin 98在防治Java惡意程式所採用的方法不佳,因此我們提出模組監視防治法來增強目前對Java惡意程式的防治。利用惡意程式類別檔內特徵模組的比對,來防止Java惡意程式進入使用者機器內執行,目的是改進因為程式類別名稱更改而無法偵測的缺點。本方法能以更新模組資料庫的方式,加入新型惡意程式類別模組。日前由Symantec病毒防治中心所發現的Java 應用程式(Application)型病毒Strange Brew,是目前第一個可自我複製並感染的病毒。由於此病毒本身是以類別檔型態存在,因此將病毒類別檔的特徵加入模組資料庫後,亦能利用檢查使用者磁碟的方法偵測出此型病毒的存在。

  本研究目前正在進行中,本文僅提出目前正研究中摘要投搞,未來將以實際的程式製作的方式來證明其方法之可行。



參考文獻

[1] Dirk Balfanz and Edward W. Falten, "A Java Filter", Technical Report 567-97, Department of Computer Science, Princeton University, September 1997.

[2] Gary McGraw and Ed Felten, "Java Security: Hostile Applets, Holes and Antidotes.", Java Report 2(2), February 1997.

[3] Scott Oaks, Java Security. O'Reilly & Associates, Inc. May 1998.

[4] Sun Educational Services Student Guide, Java Courses Series Sample Chapters, November 1997.

[5] Tim Lindholm and Frank Yellin, The Java Virtual Machine Specification. O'Reilly & Associates, Inc. ISBN 0-201-63452-X, March 1997.

[6] Scott Oaks and Henry Wong, Java Threads. 1st Edition, O'Reilly & Associates, Inc. ISBN 1-56592-216-6. January 1997.