# HG changeset patch # User weijun # Date 1381975122 -28800 # Node ID 244a3e80cde3a969465580bb1f7036804c7e14fe # Parent 3de6d912bc22f8dcbecf843284e0e8da7ff72955 8025014: Enhance Security Policy 6727821: Enhance JAAS Configuration Reviewed-by: xuelei, hawtin diff -r 3de6d912bc22 -r 244a3e80cde3 src/share/classes/javax/security/auth/Policy.java --- a/src/share/classes/javax/security/auth/Policy.java Mon Oct 07 12:09:22 2013 +0200 +++ b/src/share/classes/javax/security/auth/Policy.java Thu Oct 17 09:58:42 2013 +0800 @@ -26,6 +26,10 @@ package javax.security.auth; import java.security.Security; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.PrivilegedExceptionAction; +import java.util.Objects; import sun.security.util.Debug; /** @@ -160,21 +164,14 @@ public abstract class Policy { private static Policy policy; - private static ClassLoader contextClassLoader; + + private final java.security.AccessControlContext acc = + java.security.AccessController.getContext(); // true if a custom (not com.sun.security.auth.PolicyFile) system-wide // policy object is set private static boolean isCustomPolicy; - static { - contextClassLoader = java.security.AccessController.doPrivileged - (new java.security.PrivilegedAction() { - public ClassLoader run() { - return Thread.currentThread().getContextClassLoader(); - } - }); - }; - /** * Sole constructor. (For invocation by subclass constructors, typically * implicit.) @@ -217,8 +214,8 @@ if (policy == null) { String policy_class = null; - policy_class = java.security.AccessController.doPrivileged - (new java.security.PrivilegedAction() { + policy_class = AccessController.doPrivileged + (new PrivilegedAction() { public String run() { return java.security.Security.getProperty ("auth.policy.provider"); @@ -230,19 +227,28 @@ try { final String finalClass = policy_class; - policy = java.security.AccessController.doPrivileged - (new java.security.PrivilegedExceptionAction() { - public Policy run() throws ClassNotFoundException, - InstantiationException, - IllegalAccessException { - return (Policy) Class.forName - (finalClass, - true, - contextClassLoader).newInstance(); - } - }); - isCustomPolicy = - !finalClass.equals("com.sun.security.auth.PolicyFile"); + final Policy untrustedImpl = AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public Policy run() throws ClassNotFoundException, + InstantiationException, + IllegalAccessException { + Class implClass = Class.forName( + finalClass, false, + Thread.currentThread().getContextClassLoader() + ).asSubclass(Policy.class); + return implClass.newInstance(); + } + }); + AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public Void run() { + setPolicy(untrustedImpl); + isCustomPolicy = + !finalClass.equals("com.sun.security.auth.PolicyFile"); + return null; + } + }, Objects.requireNonNull(untrustedImpl.acc) + ); } catch (Exception e) { throw new SecurityException (sun.security.util.ResourcesMgr.getString diff -r 3de6d912bc22 -r 244a3e80cde3 src/share/classes/javax/security/auth/login/Configuration.java --- a/src/share/classes/javax/security/auth/login/Configuration.java Mon Oct 07 12:09:22 2013 +0200 +++ b/src/share/classes/javax/security/auth/login/Configuration.java Thu Oct 17 09:58:42 2013 +0800 @@ -27,9 +27,6 @@ import javax.security.auth.AuthPermission; -import java.io.*; -import java.util.*; -import java.net.URI; import java.security.AccessController; import java.security.PrivilegedAction; import java.security.PrivilegedExceptionAction; @@ -38,7 +35,7 @@ import java.security.NoSuchProviderException; import java.security.Provider; import java.security.Security; -import java.security.SecurityPermission; +import java.util.Objects; import sun.security.jca.GetInstance; @@ -194,16 +191,9 @@ public abstract class Configuration { private static Configuration configuration; - private static ClassLoader contextClassLoader; - static { - contextClassLoader = AccessController.doPrivileged - (new PrivilegedAction() { - public ClassLoader run() { - return Thread.currentThread().getContextClassLoader(); - } - }); - }; + private final java.security.AccessControlContext acc = + java.security.AccessController.getContext(); private static void checkPermission(String type) { SecurityManager sm = System.getSecurityManager(); @@ -256,17 +246,26 @@ try { final String finalClass = config_class; - configuration = AccessController.doPrivileged - (new PrivilegedExceptionAction() { - public Configuration run() throws ClassNotFoundException, - InstantiationException, - IllegalAccessException { - return (Configuration)Class.forName - (finalClass, - true, - contextClassLoader).newInstance(); - } - }); + final Configuration untrustedImpl = AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public Configuration run() throws ClassNotFoundException, + InstantiationException, + IllegalAccessException { + Class implClass = Class.forName( + finalClass, false, + Thread.currentThread().getContextClassLoader() + ).asSubclass(Configuration.class); + return implClass.newInstance(); + } + }); + AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public Void run() { + setConfiguration(untrustedImpl); + return null; + } + }, Objects.requireNonNull(untrustedImpl.acc) + ); } catch (PrivilegedActionException e) { Exception ee = e.getException(); if (ee instanceof InstantiationException) {