我想创建一个非常严格的安全管理器,所以我扩展了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密封?
答案 0 :(得分:8)
我至少可以想到几件事:
有人可以使用反射将System.security
字段设置为可访问,然后将其设置为他们想要的任何内容。
有人可以使用sun.misc.Unsafe直接用内存中的实例覆盖他们想要的随机内容。
我认为您的SecurityManager
可以防范这些事情,因为它们都依赖于对Field.setAccessible()
的调用。但最好还是测试一下以确保它。