2011-08-03 52 views
5

我想創建一個非常嚴格的安全管理器,所以我擴展了SecurityManager並覆蓋了所有自定義的checkXXX方法。SecurityManager意外

但後來我發現,我的安全管理是沒用的,因爲任何人都可以只是:

System.setSecurityManager(null); 

所以我要補充:

@Override public void checkPermission(Permission perm) { 
    if (perm.getName().equals("setSecurityManager")) { 
     throw new SecurityException("You shall have no other security manager but me!"); 
    } 
} 

是否有更多的驚喜?我需要做的其他事情才能讓我的SecurityManager保持密封狀態?

+0

我不知道爲什麼這是一個驚喜。它在Javadoc中指定。 – EJP

回答

8

至少有一對夫婦的事情,我能想到的:

  1. 有人可以使用反射到System.security字段設置爲訪問,然後將其設置到任何他們想要的。

  2. 有人可以使用sun.misc.Unsafe來直接覆蓋您的實例在內存中與他們想要的任何隨機的東西。

我覺得你可以SecurityManager防範這些東西,因爲它們都依賴於調用Field.setAccessible()。但更好地測試它來確保。

+0

謝謝,我會測試。 –

+0

1.我試過這個:systemSecurityField = java.lang.Class.forName(「java.lang.System」)。getDeclaredField(「security」);但得到java.lang.NoSuchFieldException:安全 –

+0

奇怪的是,它適用於我(使用Java 6,更新24)。使用:'System.class.getDeclaredField(「security」);' – aroth