5

我想创建一个非常严格的安全管理器,所以我扩展了 SecurityManager 并覆盖了所有自定义 checkXXX 方法。

但后来我发现我的安全管理器没用,因为任何人都可以:

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 密封,我还需要做其他任何事情吗?

4

1 回答 1

8

我至少能想到几件事:

  1. 有人可以使用反射将System.security字段设置为可访问,然后将其设置为他们想要的任何内容。

  2. 有人可以使用sun.misc.Unsafe直接用他们想要的任何随机内容覆盖内存中的实例。

我认为您SecurityManager可以防范这些事情,因为它们都依赖于对Field.setAccessible(). 但最好测试一下以确保。

于 2011-08-03T05:30:26.777 回答