Skip to content

Commit fce53df

Browse files
Proper getStackAccessControlContext implementation
Fixed imports and warnings in SecuritySubstitutions Implemented PrivilegedStack and use FastThreadLocal Added missing getProtectionDomain method Recompute contexts from static initializers in runtime Disallow NO_CONTEXT_SINGLETON in executePrivileged Work around crash when ProcessPropertiesSupport is missing getExecutable impementation
1 parent 9129183 commit fce53df

File tree

8 files changed

+392
-68
lines changed

8 files changed

+392
-68
lines changed

sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ProcessPropertiesSupport.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@
4545
import org.graalvm.nativeimage.c.function.CEntryPointLiteral;
4646

4747
public interface ProcessPropertiesSupport {
48-
String getExecutableName();
48+
default String getExecutableName() {
49+
return "java";
50+
}
4951

5052
long getProcessID();
5153

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/DynamicHub.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454
import java.util.Set;
5555
import java.util.StringJoiner;
5656

57+
import com.oracle.svm.core.SubstrateOptions;
58+
import com.oracle.svm.core.jdk.JNIPlatformNativeLibrarySupport;
5759
import org.graalvm.compiler.core.common.NumUtil;
5860
import org.graalvm.compiler.core.common.SuppressFBWarnings;
5961
import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
@@ -333,6 +335,10 @@ public void setModule(Object module) {
333335
perms.add(SecurityConstants.ALL_PERMISSION);
334336
CodeSource cs;
335337
try {
338+
if (SubstrateOptions.UseDedicatedVMOperationThread.getValue()) {
339+
// We need to initialize encodings before we can invoke toURI()
340+
JNIPlatformNativeLibrarySupport.singleton().initializeBuiltinLibraries();
341+
}
336342
// Try to use executable image's name as code source for the class.
337343
// The file location can be used by Java code to determine its location on disk, similar
338344
// to argv[0].

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/RecomputedFields.java

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,11 @@
3333
import java.lang.ref.WeakReference;
3434
import java.lang.reflect.Field;
3535
import java.lang.reflect.Modifier;
36+
import java.net.SocketPermission;
3637
import java.nio.charset.CharsetDecoder;
3738
import java.nio.charset.CoderResult;
39+
import java.security.AccessControlContext;
40+
import java.security.Permission;
3841
import java.util.Map;
3942
import java.util.concurrent.ConcurrentHashMap;
4043
import java.util.concurrent.ConcurrentMap;
@@ -46,6 +49,7 @@
4649
import java.util.concurrent.locks.ReentrantLock;
4750
import java.util.function.Consumer;
4851

52+
import org.graalvm.compiler.phases.common.LazyValue;
4953
import org.graalvm.compiler.serviceprovider.GraalUnsafeAccess;
5054
import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
5155
import org.graalvm.nativeimage.ImageSingletons;
@@ -354,12 +358,128 @@ public static int getCommonPoolParallelism() {
354358
@TargetElement(onlyWith = JDK8OrEarlier.class)
355359
static native ForkJoinPool makeCommonPool();
356360

361+
@Alias //
362+
@TargetElement(onlyWith = JDK11OrLater.class) //
363+
public static native AccessControlContext contextWithPermissions(Permission... perms);
364+
357365
@Alias //
358366
@TargetElement(onlyWith = JDK11OrLater.class) //
359367
Target_java_util_concurrent_ForkJoinPool(byte forCommonPoolOnly) {
360368
}
361369
}
362370

371+
/**
372+
* Since AccessControlContextFeature replaces all AccessControlContext objects with
373+
* NO_CONTEXT_SINGLETON, we need to reinitialize them in runtime.
374+
*/
375+
376+
@TargetClass(className = "java.security.AccessController$AccHolder", onlyWith = JDK11OrLater.class)
377+
@SuppressWarnings("unused") //
378+
final class Target_java_security_AccessController_AccHolder {
379+
@Alias @InjectAccessors(AccessControllerUtil.INNOCUOUS_ACC.class) static AccessControlContext innocuousAcc;
380+
}
381+
382+
@TargetClass(className = "java.util.Calendar$CalendarAccessControlContext")
383+
@SuppressWarnings("unused") //
384+
final class Target_java_util_Calendar_CalendarAccessControlContext {
385+
@Alias @InjectAccessors(CalendarAccessControlContextAcc.class) static AccessControlContext INSTANCE;
386+
}
387+
388+
class CalendarAccessControlContextAcc {
389+
static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions(
390+
new RuntimePermission("accessClassInPackage.sun.util.calendar")));
391+
392+
static AccessControlContext get() {
393+
return acc.get();
394+
}
395+
}
396+
397+
@TargetClass(className = "java.util.concurrent.ForkJoinPool$DefaultForkJoinWorkerThreadFactory", onlyWith = JDK11OrLater.class)
398+
@SuppressWarnings("unused") //
399+
final class Target_java_util_concurrent_ForkJoinPool_DefaultForkJoinWorkerThreadFactory {
400+
@Alias @InjectAccessors(DefaultForkJoinWorkerThreadFactoryAcc.class) static AccessControlContext ACC;
401+
}
402+
403+
class DefaultForkJoinWorkerThreadFactoryAcc {
404+
static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions(
405+
new RuntimePermission("getClassLoader"),
406+
new RuntimePermission("setContextClassLoader")));
407+
408+
static AccessControlContext get() {
409+
return acc.get();
410+
}
411+
}
412+
413+
@TargetClass(className = "java.util.concurrent.ForkJoinPool$InnocuousForkJoinWorkerThreadFactory", onlyWith = JDK11OrLater.class)
414+
@SuppressWarnings("unused") //
415+
final class Target_java_util_concurrent_ForkJoinPool_InnocuousForkJoinWorkerThreadFactory {
416+
@Alias @InjectAccessors(InnocuousForkJoinWorkerThreadFactoryAcc.class) static AccessControlContext ACC;
417+
}
418+
419+
class InnocuousForkJoinWorkerThreadFactoryAcc {
420+
static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions(
421+
new RuntimePermission("modifyThread"),
422+
new RuntimePermission("enableContextClassLoaderOverride"),
423+
new RuntimePermission("modifyThreadGroup"),
424+
new RuntimePermission("getClassLoader"),
425+
new RuntimePermission("setContextClassLoader")));
426+
427+
static AccessControlContext get() {
428+
return acc.get();
429+
}
430+
}
431+
432+
@TargetClass(className = "java.util.concurrent.ForkJoinWorkerThread")
433+
@SuppressWarnings("unused") //
434+
final class Target_java_util_concurrent_ForkJoinWorkerThread {
435+
@Alias @InjectAccessors(AccessControllerUtil.INNOCUOUS_ACC.class) static AccessControlContext INNOCUOUS_ACC;
436+
}
437+
438+
@TargetClass(className = "sun.misc.InnocuousThread", onlyWith = JDK8OrEarlier.class)
439+
@SuppressWarnings("unused") //
440+
final class Target_sun_misc_InnocuousThread {
441+
@Alias @InjectAccessors(AccessControllerUtil.INNOCUOUS_ACC.class) static AccessControlContext ACC;
442+
}
443+
444+
@TargetClass(className = "jdk.internal.misc.InnocuousThread", onlyWith = JDK11OrLater.class)
445+
@SuppressWarnings("unused") //
446+
final class Target_jdk_internal_misc_InnocuousThread {
447+
@Alias @InjectAccessors(AccessControllerUtil.INNOCUOUS_ACC.class) static AccessControlContext ACC;
448+
}
449+
450+
@TargetClass(className = "javax.management.Monitor", onlyWith = PlatformHasClass.class)
451+
@SuppressWarnings("unused") //
452+
final class Target_javax_management_Monitor {
453+
@Alias @InjectAccessors(AccessControllerUtil.NO_PERMISSIONS_CONTEXT.class) static AccessControlContext noPermissionsACC;
454+
}
455+
456+
@TargetClass(className = "java.rmi.activation.ActivationID")
457+
@SuppressWarnings("unused") //
458+
final class Target_java_rmi_activation_ActivationID {
459+
@Alias @InjectAccessors(AccessControllerUtil.NO_PERMISSIONS_CONTEXT.class) static AccessControlContext NOPERMS_ACC;
460+
}
461+
462+
@TargetClass(className = "sun.rmi.transport.DGCCClient", onlyWith = PlatformHasClass.class)
463+
@SuppressWarnings("unused") //
464+
final class Target_sun_rmi_transport_DGCCClient {
465+
@Alias @InjectAccessors(SocketAcc.class) static AccessControlContext SOCKET_ACC;
466+
}
467+
468+
class SocketAcc {
469+
static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions(
470+
new SocketPermission("*", "connect,resolve")));
471+
472+
static AccessControlContext get() {
473+
return acc.get();
474+
}
475+
}
476+
477+
@TargetClass(className = "sun.rmi.transport.tcp.TCPTransport")
478+
@SuppressWarnings("unused") //
479+
final class Target_sun_rmi_transport_tcp_TCPTransport {
480+
@Alias @InjectAccessors(AccessControllerUtil.NO_PERMISSIONS_CONTEXT.class) static AccessControlContext NOPERMS_ACC;
481+
}
482+
363483
/**
364484
* An injected field to replace ForkJoinPool.common.
365485
*

0 commit comments

Comments
 (0)