2010-10-25 25 views
8

如何在接受和執行上載的不可信代碼時保護我的服務器免受惡意活動的侵害?Sandbox JVM從不受信任的來源保護服務器

用戶應該能夠實現我的接口和給定數據,執行一些計算並返回數據。不需要I/O操作,當然也不需要線程/進程操作或其他tomfoolery。

使用java.policy文件可以拒絕一切(通過不授予任何東西)。

$ cat test.policy 
grant { 
}; 

使用此策略文件,未授予的操作將導致安全異常。

$ cat Print.java 
public class Print { 
    public static void main(String a[]) throws Exception { 
     System.out.println(System.getProperty("os.name")); 
    } 
} 

$ javac Print.java 
$ java -Djava.security.manager -Djava.security.policy==test.policy Print 
Exception in thread "main" java.security.AccessControlException: 
    access denied (java.util.PropertyPermission os.name read) 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) 
    at java.security.AccessController.checkPermission(AccessController.java:546) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
    at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285) 
    at java.lang.System.getProperty(System.java:650) 
    at Print.main(Print.java:3) 

這是萬無一失?我需要做更多的事情來保護我的服務器環境不受信任的來源嗎?

回答

10

如果我是你,我不會簡單地依賴SecurityManager。是的,你的配置看起來是正確的,如果Java沙箱是完美的,那就足夠了。但請看一下Java的每個安全版本中正在修復多少Java漏洞。例如,latest Oracle Java CPU。很多這些Java漏洞都是從沙盒中逃逸出來的。這在客戶端非常糟糕(有些人主張關閉瀏覽器中的Java),但在服務器端會更糟糕,因爲攻擊者不必引誘您訪問他們的網站,他們只會攻擊您的服務器。

例如,目前我個人有幾個這樣的漏洞,我正在等待Oracle解決,或者我正在將它們傳達給Oracle。我不是唯一擁有它們的研究人員。而且一定有壞人擁有它們。所以,即使你虔誠地更新你的Java,第二個新版本出來,你也不會安全。

我認爲至少應該在操作系統級別上有一些東西,權限等來控制服務器進程。對不起,我沒有很好的建議,但我只是說,不,絕對不能依靠JVM沙箱來保護服務器的安全。

+0

聽起來不錯。如果我也是作爲linux VM中的非特權用戶執行的,那麼該怎麼辦? – Synesso 2010-10-26 02:02:25

+1

對我來說似乎很好,但我不能以很多權威來談論這件事。我只知道,當面對整個世界時,JVM安全本身就是脆弱的。 – 2010-10-27 01:27:27

相關問題