JAVAWEB應用的policy安全配置值得深思

Java應用程序環境的安全策略,詳細說明了對於不同的代碼所擁有的不同資源的許可,它由一個Policy對象來表達。
爲了讓applet(或者運行在SecurityManager下的一個應用程序)能夠執行受保護的行爲,例如讀寫文件,applet(或Java應用程序)必須獲得那項操作的許可,安全策略文件就是用來實現這些許可。
Policy對象可能有多個實體,雖然任何時候只能有一個起作用。
當前安裝的Policy對象,在程序中可以通過調用 getPolicy方法得到,也可以通過調用setPolicy方法改變。Policy對象評估整個策略,返回一個適當的Permissions對象,詳細說明那些代碼可以訪問那些資源。

可見 通過配置policy來達到控制SecurityManager,在Applet RMI上面已經見到很大的成效。
但很多現在WEB容器如TOMCAT RESIN等等都通過指導用戶配置policy來管理自己JAVA網站的安全。
對於初級hacker 可能會達到一定成效,但是我個人持保留意見。

首先簡單看看JAVA WEB容器webapps的管理策略。
每個app都是佔用該容器同一進程,而不同於各自的包管理,請求控制都是採用 MultiThread + ClassLoader 的.
所以寫serlvet/filter public的屬性需要注意併發,而各個webapp都有各自的lib等等。
至於這樣的對於安全來說會極其噁心...

問題1: A webapp 調用了 system.exit 導致WEB容器掛了。
問題2: A webapp 因爲代碼質量問題內存泄露,導致B webapp訪問不了。
問題3: webapp 調用 runtime.exec 執行系統命令***操作系統。

而針對以上這些問題,我估計sun應該比較尷尬的了,容器提供商們都只能採用了java自帶的操作方法。就是配置policy
如何配置呀?
TOMCAT可以看看 http://tomcat.apache.org/tomcat-5.5-doc/security-manager-howto.html
RESIN 可以搜索 <<Resin虛擬主機的java安全沙箱設置>>

基本上就是限制用戶操作 java.io java.net java.awt java.runtime java.util ...

但是很遺憾告訴你,這些都是可以bypass的!爲什麼?因爲JAVA裏面沙箱限制都是在java class層控制的
而 採用 reflect 可以繞過這些進而操作JNI等等...如何操作可以看這paper
http://blog.csdn.net/kj021320/archive/2007/10/10/1819205.aspx

那如果把reflect也同樣限制了呢?跟applet一樣嚴格! OK 現在我們來看看實際情況
首先webapp 常用的框架 spring  ibatis  hibernate 先拿這3個來說。

spring-2.5.6
org.springframework.beans.BeanUtils 的 copyProperties 等方法對一個method需要進行setAccessible

hibernate-3.1.3
org.hibernate.util.ReflectHelper 的 getDefaultConstructor 等方法對一個constructor需要進行setAccessible

ibatis-2.3.4
com.ibatis.common.beans.ClassInfo 的 addFields等方法需要對一個field 需要進行setAccessible

如果你限制了,就等於不支持這些opensource framework
看了以上的告示,鬱悶了吧?
說了這麼多,最後想告訴大家些什麼呢?在JAVAWEB容器中 設置policy是靠不住的,只能說是提高了門檻。
對java的運行權限安全配置纔是王道。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章