代码之家  ›  专栏  ›  技术社区  ›  Karussell

使用AllPermission启用Java SecurityManager

  •  10
  • Karussell  · 技术社区  · 7 年前

    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"));
    

    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

    2 回复  |  直到 7 年前
        1
  •  14
  •   buræquete Naveen Kocherla    7 年前

    我可以用一个额外的 Policy.getPolicy() Policy.setPolicy() 调用时,它影响行为的原因是,通过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;
        }
    };
    

        2
  •  1
  •   buræquete Naveen Kocherla    7 年前

    使用简单的JVM从命令行还是在运行在JavaEE容器上的webapp中?在哪个操作系统上?使用哪个JVM(Oracle、OpenJDK、IBM J9…)和哪个版本?

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

    推荐文章