使用 AllPermission 启用 Java SecurityManager

Enable the Java SecurityManager with AllPermission

我试图让自己熟悉 SecurityManager 但即使是这个简单的场景也失败了。当我从我的 IDE 或命令行中 运行 以下内容时,我得到以下内容 exception;

access denied ("java.util.PropertyPermission" "java.home" "read")

我以为我允许使用此代码进行所有操作:

Policy.setPolicy(new Policy() {

    @Override
    public PermissionCollection getPermissions(CodeSource codesource) {
        Permissions perm = new Permissions();
        perm.add(new AllPermission());
        return perm;
    }
});
System.setSecurityManager(new SecurityManager());
System.out.println(System.getProperty("java.home"));

这与 JVM 的派生策略有关吗?怎样才能干净setPolicy()?

同样的误解似乎发生在下面的代码中:

System.setSecurityManager(new SecurityManager());
final Permissions allPermission = new Permissions();
allPermission.add(new AllPermission());
AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
    System.out.println(System.getProperty("java.home"));
    return null;
}, new AccessControlContext(new ProtectionDomain[]{new ProtectionDomain(null, allPermission)}));

更新:第二种情况是可以理解的,因为提供的权限只是进一步的限制:(javadoc) 该操作是通过权限的交集执行的调用者保护域所拥有的,以及指定AccessControlContext

所代表的域所拥有的

你运行你上面的代码是在什么情况下?

从带有简单 JVM 的命令行或在某个 JavaEE 容器之上的 Web 应用程序中 运行?在哪个OS?使用哪个 JVM(Oracle、OpenJDK、IBM J9...)和哪个版本?

如果您 运行 从命令行,请查看位于 JVM 安装路径中的 java.policy 文件。它的内容可能会缩小您的授权范围,从而阻止您访问这个特定的系统变量?

我能够在 Policy.setPolicy() 调用之前使用额外的 Policy.getPolicy() 重新创建您的案例,它影响行为的原因是通过 get policy 调用,您触发了默认策略创建,并且设置了来自 java.policy 的权限,但没有 setSecurityManager() 它们不会被激活,这就是为什么当您执行自定义 AllPermission 策略集时,您仍然会得到 "java.util.PropertyPermission" "java.home" "read" 问题,因为许多这样的默认策略没有被设置的策略覆盖。确实非常混乱的结构。

Policy.getPolicy();
Policy.setPolicy(policyWithAllPermission);
System.setSecurityManager(new SecurityManager());
System.out.println(System.getProperty("java.home"));
// results in 'access denied ("java.util.PropertyPermission" "java.home" "read")'

但是如果你使用下面的自定义策略;

Policy allPermissionPolicy = new Policy() {

    @Override
    public boolean implies(ProtectionDomain domain, Permission permission) {
        return true;
    }
};

它覆盖了所有权限定义,并允许所有操作通过,可能解决了这种混淆。