Skip to content

Commit 940ad90

Browse files
rjernstldematteelasticsearchmachine
authored
Do not try to enable SecurityManager on JDK 24 (#117999) (#119975)
* Do not try to enable SecurityManager on JDK 24 (#117999) * cleanup * [CI] Auto commit changes from spotless * more * [CI] Auto commit changes from spotless --------- Co-authored-by: Lorenzo Dematté <[email protected]> Co-authored-by: elasticsearchmachine <[email protected]>
1 parent 3b012c0 commit 940ad90

File tree

13 files changed

+93
-19
lines changed

13 files changed

+93
-19
lines changed

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/ElasticsearchTestBasePlugin.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.elasticsearch.gradle.test.GradleTestPolicySetupPlugin;
2020
import org.elasticsearch.gradle.test.SystemPropertyCommandLineArgumentProvider;
2121
import org.gradle.api.Action;
22+
import org.gradle.api.JavaVersion;
2223
import org.gradle.api.Plugin;
2324
import org.gradle.api.Project;
2425
import org.gradle.api.Task;
@@ -109,7 +110,6 @@ public void execute(Task t) {
109110
test.jvmArgs(
110111
"-Xmx" + System.getProperty("tests.heap.size", "512m"),
111112
"-Xms" + System.getProperty("tests.heap.size", "512m"),
112-
"-Djava.security.manager=allow",
113113
"-Dtests.testfeatures.enabled=true",
114114
"--add-opens=java.base/java.util=ALL-UNNAMED",
115115
// TODO: only open these for mockito when it is modularized
@@ -124,6 +124,13 @@ public void execute(Task t) {
124124
);
125125

126126
test.getJvmArgumentProviders().add(new SimpleCommandLineArgumentProvider("-XX:HeapDumpPath=" + heapdumpDir));
127+
test.getJvmArgumentProviders().add(() -> {
128+
if (test.getJavaVersion().compareTo(JavaVersion.VERSION_23) <= 0) {
129+
return List.of("-Djava.security.manager=allow");
130+
} else {
131+
return List.of();
132+
}
133+
});
127134

128135
String argline = System.getProperty("tests.jvm.argline");
129136
if (argline != null) {

build-tools/src/main/java/org/elasticsearch/gradle/test/GradleTestPolicySetupPlugin.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@
99

1010
package org.elasticsearch.gradle.test;
1111

12+
import org.gradle.api.JavaVersion;
1213
import org.gradle.api.Plugin;
1314
import org.gradle.api.Project;
1415
import org.gradle.api.invocation.Gradle;
1516
import org.gradle.api.tasks.testing.Test;
1617

18+
import java.util.List;
19+
1720
public class GradleTestPolicySetupPlugin implements Plugin<Project> {
1821

1922
@Override
@@ -23,8 +26,13 @@ public void apply(Project project) {
2326
test.systemProperty("tests.gradle", true);
2427
test.systemProperty("tests.task", test.getPath());
2528

26-
// Flag is required for later Java versions since our tests use a custom security manager
27-
test.jvmArgs("-Djava.security.manager=allow");
29+
test.getJvmArgumentProviders().add(() -> {
30+
if (test.getJavaVersion().compareTo(JavaVersion.VERSION_23) <= 0) {
31+
return List.of("-Djava.security.manager=allow");
32+
} else {
33+
return List.of();
34+
}
35+
});
2836

2937
SystemPropertyCommandLineArgumentProvider nonInputProperties = new SystemPropertyCommandLineArgumentProvider();
3038
// don't track these as inputs since they contain absolute paths and break cache relocatability

distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SystemJvmOptions.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.elasticsearch.common.settings.Settings;
1313
import org.elasticsearch.common.util.concurrent.EsExecutors;
1414
import org.elasticsearch.core.UpdateForV9;
15+
import org.elasticsearch.jdk.RuntimeVersionFeature;
1516

1617
import java.io.IOException;
1718
import java.nio.file.Files;
@@ -149,8 +150,11 @@ private static Stream<String> maybeWorkaroundG1Bug() {
149150
}
150151

151152
private static Stream<String> maybeAllowSecurityManager() {
152-
// Will become conditional on useEntitlements once entitlements can run without SM
153-
return Stream.of("-Djava.security.manager=allow");
153+
if (RuntimeVersionFeature.isSecurityManagerAvailable()) {
154+
// Will become conditional on useEntitlements once entitlements can run without SM
155+
return Stream.of("-Djava.security.manager=allow");
156+
}
157+
return Stream.of();
154158
}
155159

156160
private static Stream<String> maybeAttachEntitlementAgent(boolean useEntitlements) {
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the "Elastic License
4+
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
package org.elasticsearch.jdk;
11+
12+
public class RuntimeVersionFeature {
13+
private RuntimeVersionFeature() {}
14+
15+
public static boolean isSecurityManagerAvailable() {
16+
return Runtime.version().feature() < 24;
17+
}
18+
}

libs/secure-sm/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,5 @@ tasks.named('forbiddenApisMain').configure {
2828
tasks.named("jarHell").configure { enabled = false }
2929
tasks.named("testTestingConventions").configure {
3030
baseClass 'junit.framework.TestCase'
31+
baseClass 'org.junit.Assert'
3132
}

libs/secure-sm/src/test/java/org/elasticsearch/secure_sm/SecureSMTests.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,43 @@
99

1010
package org.elasticsearch.secure_sm;
1111

12-
import junit.framework.TestCase;
12+
import com.carrotsearch.randomizedtesting.JUnit3MethodProvider;
13+
import com.carrotsearch.randomizedtesting.RandomizedRunner;
14+
import com.carrotsearch.randomizedtesting.RandomizedTest;
15+
import com.carrotsearch.randomizedtesting.annotations.TestMethodProviders;
16+
17+
import org.elasticsearch.jdk.RuntimeVersionFeature;
18+
import org.junit.BeforeClass;
19+
import org.junit.runner.RunWith;
1320

1421
import java.security.Permission;
1522
import java.security.Policy;
1623
import java.security.ProtectionDomain;
1724
import java.util.ArrayList;
1825
import java.util.List;
26+
import java.util.Set;
1927
import java.util.concurrent.atomic.AtomicBoolean;
2028
import java.util.stream.Collectors;
2129

2230
/** Simple tests for SecureSM */
23-
public class SecureSMTests extends TestCase {
24-
static {
31+
@TestMethodProviders({ JUnit3MethodProvider.class })
32+
@RunWith(RandomizedRunner.class)
33+
public class SecureSMTests extends org.junit.Assert {
34+
35+
@BeforeClass
36+
public static void initialize() {
37+
RandomizedTest.assumeFalse(
38+
"SecurityManager has been permanently removed in JDK 24",
39+
RuntimeVersionFeature.isSecurityManagerAvailable() == false
40+
);
2541
// install a mock security policy:
2642
// AllPermission to source code
2743
// ThreadPermission not granted anywhere else
28-
final ProtectionDomain sourceCode = SecureSM.class.getProtectionDomain();
44+
final var sourceCode = Set.of(SecureSM.class.getProtectionDomain(), RandomizedRunner.class.getProtectionDomain());
2945
Policy.setPolicy(new Policy() {
3046
@Override
3147
public boolean implies(ProtectionDomain domain, Permission permission) {
32-
if (domain == sourceCode) {
48+
if (sourceCode.contains(domain)) {
3349
return true;
3450
} else if (permission instanceof ThreadPermission) {
3551
return false;

server/src/main/java/org/elasticsearch/bootstrap/BootstrapChecks.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.elasticsearch.core.SuppressForbidden;
2222
import org.elasticsearch.discovery.DiscoveryModule;
2323
import org.elasticsearch.index.IndexModule;
24+
import org.elasticsearch.jdk.RuntimeVersionFeature;
2425
import org.elasticsearch.monitor.jvm.JvmInfo;
2526
import org.elasticsearch.monitor.process.ProcessProbe;
2627
import org.elasticsearch.nativeaccess.NativeAccess;
@@ -721,6 +722,9 @@ public final BootstrapCheckResult check(BootstrapContext context) {
721722
}
722723

723724
boolean isAllPermissionGranted() {
725+
if (RuntimeVersionFeature.isSecurityManagerAvailable() == false) {
726+
return false;
727+
}
724728
final SecurityManager sm = System.getSecurityManager();
725729
assert sm != null;
726730
try {

server/src/main/java/org/elasticsearch/bootstrap/Elasticsearch.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.elasticsearch.env.Environment;
3535
import org.elasticsearch.index.IndexVersion;
3636
import org.elasticsearch.jdk.JarHell;
37+
import org.elasticsearch.jdk.RuntimeVersionFeature;
3738
import org.elasticsearch.monitor.jvm.HotThreads;
3839
import org.elasticsearch.monitor.jvm.JvmInfo;
3940
import org.elasticsearch.monitor.os.OsProbe;
@@ -115,7 +116,7 @@ private static Bootstrap initPhase1() {
115116
* the presence of a security manager or lack thereof act as if there is a security manager present (e.g., DNS cache policy).
116117
* This forces such policies to take effect immediately.
117118
*/
118-
if (useEntitlements == false) {
119+
if (useEntitlements == false && RuntimeVersionFeature.isSecurityManagerAvailable()) {
119120
org.elasticsearch.bootstrap.Security.setSecurityManager(new SecurityManager() {
120121
@Override
121122
public void checkPermission(Permission perm) {
@@ -224,14 +225,16 @@ private static void initPhase2(Bootstrap bootstrap) throws IOException {
224225
var pluginsResolver = PluginsResolver.create(pluginsLoader);
225226

226227
EntitlementBootstrap.bootstrap(pluginData, pluginsResolver::resolveClassToPluginName);
227-
} else {
228+
} else if (RuntimeVersionFeature.isSecurityManagerAvailable()) {
228229
// install SM after natives, shutdown hooks, etc.
229230
LogManager.getLogger(Elasticsearch.class).info("Bootstrapping java SecurityManager");
230231
org.elasticsearch.bootstrap.Security.configure(
231232
nodeEnv,
232233
SECURITY_FILTER_BAD_DEFAULTS_SETTING.get(args.nodeSettings()),
233234
args.pidFile()
234235
);
236+
} else {
237+
LogManager.getLogger(Elasticsearch.class).warn("Bootstrapping without any protection");
235238
}
236239
}
237240

server/src/test/java/org/elasticsearch/bootstrap/ESPolicyTests.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
package org.elasticsearch.bootstrap;
1111

12+
import org.elasticsearch.jdk.RuntimeVersionFeature;
1213
import org.elasticsearch.test.ESTestCase;
1314

1415
import java.security.AccessControlContext;
@@ -27,7 +28,10 @@ public class ESPolicyTests extends ESTestCase {
2728
* test restricting privileges to no permissions actually works
2829
*/
2930
public void testRestrictPrivileges() {
30-
assumeTrue("test requires security manager", System.getSecurityManager() != null);
31+
assumeTrue(
32+
"test requires security manager",
33+
RuntimeVersionFeature.isSecurityManagerAvailable() && System.getSecurityManager() != null
34+
);
3135
try {
3236
System.getProperty("user.home");
3337
} catch (SecurityException e) {

server/src/test/java/org/elasticsearch/bootstrap/SecurityTests.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
package org.elasticsearch.bootstrap;
1111

12+
import org.elasticsearch.jdk.RuntimeVersionFeature;
1213
import org.elasticsearch.test.ESTestCase;
1314

1415
import java.io.IOException;
@@ -50,7 +51,10 @@ public void testEnsureRegularFile() throws IOException {
5051

5152
/** can't execute processes */
5253
public void testProcessExecution() throws Exception {
53-
assumeTrue("test requires security manager", System.getSecurityManager() != null);
54+
assumeTrue(
55+
"test requires security manager",
56+
RuntimeVersionFeature.isSecurityManagerAvailable() && System.getSecurityManager() != null
57+
);
5458
try {
5559
Runtime.getRuntime().exec("ls");
5660
fail("didn't get expected exception");

0 commit comments

Comments
 (0)