SecurityManager令人惊讶

Ere*_*evi 5 java securitymanager

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

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

System.setSecurityManager(null);
Run Code Online (Sandbox Code Playgroud)

所以我必须补充:

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

还有什么惊喜吗?我需要做的其他事情才能使我的SecurityManager密封?

aro*_*oth 8

至少有几件我能想到的事情:

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

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

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