Skip to content

Commit 3645cfe

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 Provide dummy setters for substituted contexts as their values are constant.
1 parent 86651e3 commit 3645cfe

File tree

6 files changed

+403
-70
lines changed

6 files changed

+403
-70
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -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/jdk/RecomputedFields.java

Lines changed: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -33,8 +33,10 @@
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;
3840
import java.util.Map;
3941
import java.util.concurrent.ConcurrentHashMap;
4042
import java.util.concurrent.ConcurrentMap;
@@ -46,6 +48,7 @@
4648
import java.util.concurrent.locks.ReentrantLock;
4749
import java.util.function.Consumer;
4850

51+
import org.graalvm.compiler.phases.common.LazyValue;
4952
import org.graalvm.compiler.serviceprovider.GraalUnsafeAccess;
5053
import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
5154
import org.graalvm.nativeimage.ImageSingletons;
@@ -360,6 +363,118 @@ public static int getCommonPoolParallelism() {
360363
}
361364
}
362365

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

0 commit comments

Comments
 (0)