星期五, 12月 03, 2004

Java Plugin 出現了重大的安全性漏洞

Java Plugin 是允許瀏覽器透過此項技術來執行 Java 程式的一項工具,前各大作
業系統上 (e.g. Windows, Linux...etc.) 著名的瀏覽器 (e.g. IE, Mozilla,
Opera...etc.) 都有支援這項技術。不過這項工具最近被發現會造成安全性上的漏
洞[1-3]。


■ 前言:
==============================
我們都知道 Java 在執行 Applet 程式的安全性考量上下了相當大的工夫,也就是
眾所皆知的「sandbox」設計。sandbox 技術可以用在限制對系統資源的存取,如
對檔案的讀取、寫入、或執行,或限制對網路連線的使用,以避免惡意程式盜取資
料或建立後門。當瀏覽器瀏覽到一個內含 Applet 程式網頁的時候,Applet 程式會
從伺服器端下載到本機電腦後開始執行。倘若我們對於 Applet 完全沒有規範限制
的話,那麼若是這個 Applet 程式對於記憶體空間做出無限的要求,這樣肯定會對
作業系統造成傷害。因此,sandbox 建造一個虛擬的環境出來,讓 Applet 程式在
經過位元碼的驗證《byte code verifier》、類別載入器《applet class loader》
和安全性管理《security manager》這幾個步驟的確認之後,可以在有限的系統資
源當中執行程式。如此一來,對於網路上那些 Applet 程式,就多了一份保護。




■ 問題描述:
==============================
這個漏洞最早是在今年六月被 Jouko Pynnonen 所發現的[4],Sun 也提出了修正,
不過似乎大家都不大知道就是了(我想應該是沒有大力宣傳的關係)。這個漏洞所
造成的影響是我們可以透過 JavaScript 程式碼來跳開 sandbox 當中 security manager
的限制,獲得一個原本不應該允許被取得的物件。舉個例子來說好了,很多的
Java 套件,其實都只允許 Java Virtual Machine (VM) 本身自己內部來使用,並
沒有允許廣為被大家拿來用在自己撰寫的程式碼當中。最明顯的例子就是那些
sun.* 的套件。因此當我們試圖想要使用這些套件的時候,往往就會丟出
AccessControlException 的例外(如下所示)。


  java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.sun.text)
   at java.security.AccessControlContext.checkPermission(Unknown Source)
   at java.security.AccessController.checkPermission(Unknown Source)
   at java.lang.SecurityManager.checkPermission(Unknown Source)
   at java.lang.SecurityManager.checkPackageAccess(Unknown Source)
   at sun.applet.AppletSecurity.checkPackageAccess(Unknown Source)
   at sun.plugin.javascript.JSClassLoader.loadClass(Unknown Source)
   at java.lang.ClassLoader.loadClass(Unknown Source)
   at java.lang.ClassLoader.loadClassInternal(Unknown Source)
   at java.lang.Class.forName0(Native Method)
   at java.lang.Class.forName(Unknown Source)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at sun.plugin.javascript.invoke.JSInvoke.invoke(Unknown Source)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
   at sun.plugin.com.MethodDispatcher.invoke(Unknown Source)
   at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source)
   at sun.plugin.com.DispatchImpl$1.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at sun.plugin.com.DispatchImpl.invoke(Unknown Source)
  java.lang.Exception: java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.sun.text)
   at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source)
   at sun.plugin.com.DispatchImpl$1.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at sun.plugin.com.DispatchImpl.invoke(Unknown Source)


不過當我們在 J2SE SDK/JRE 1.4.2_05 之前的版本上,搭配一些 JavaScript
程式碼來使用的話,居然可以讓我們獲得這些套件的物件實體出來。舉個簡單
例子,若是大家的版本是在 1.4.2_05 之前的話,可以拿 $JAVA_HOME$/demo/applets
裡面隨便一個例子來試試看(在這邊我是採用 Blink 這個目錄下的例子)。
我們用文字編輯器開啟範例網頁,在 [/applet] 之後加入下面這段程式碼
(請大家自行把 [] 替換成 html tag):


  [script language=javascript]
  var c=document.applets[0].getClass().forName('sun.text.Utility');
  alert('got Class object: '+c)
  [/script]


這時候開啟這個網頁的話,你會發現看到類似下列這張圖片的畫面:


  圖一:Java Plugin 安全性漏洞


理論上不應該被允許使用的物件,現在居然被我們拿到了,如此一來,再透過
JavaScript 與 Java 溝通的技術[5],就可以把這個物件傳到其他 Applet
當中,自由來運用了。由於 Java 跨平台的特性,因此這個安全性漏洞的話,
會影響很多作業系統與瀏覽器。


■ 影響範圍:
==============================
此項安全性漏洞影響的範圍包括 Solaris, Windows 與 Linux 上 J2SE SDK/JRE 1.4.2_05
之前的所有系列版本,J2SE 1.3.1_13, 1.4.2_06 之後和目前最新的 J2SE 5.0
版本則不受影響。至於蘋果電腦上的 J2SE 版本的話,目前還不確定是否會對以
BSD 為核心的 Mac OSX 作業系統造成影響,這需要靜待蘋果公司出面表態說明
一下。


■ 解決方法:
==============================
下載更新到 J2SE 1.3.1_13, 1.4.2_06 之後和目前最新的 J2SE 5.0 版本。


■ 相關網站:
==============================
1.Windows and Linux exposed by Java flaw,
 http://software.silicon.com/security/0,39024655,39126099,00.htm
2.Sun Fixes Security Vulnerability with Java Plug-in in JRE/SDK,
 http://www.sys-con.com/story/?storyid=47188&rss=1
3.Sun Java Plug-in Sandbox Security Bypass Vulnerability,
 http://secunia.com/advisories/13271/
4.Sun Java Plugin arbitrary package access vulnerability,
 http://jouko.iki.fi/adv/javaplugin.html
5.JavaScript to Java Communication (Scripting),
 http://java.sun.com/j2se/1.5.0/docs/guide/plugin/developer_guide/js_java.html

http://neural.ee.ncku.edu.tw/~ccy0927/plog/index.php?op=ViewArticle&articleId=35&blogId=1

0 Comments:

發佈留言

<< Home