You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ma...@apache.org on 2021/10/08 12:26:00 UTC

[solr] branch main updated: SOLR-15657: Allow setting any and all standard SecureRandom / Security Provider usage to a non secure SecureRandom.

This is an automated email from the ASF dual-hosted git repository.

markrmiller pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new 26cf3f1  SOLR-15657: Allow setting any and all standard SecureRandom / Security Provider usage to a non secure SecureRandom.
26cf3f1 is described below

commit 26cf3f1fa0ddc226cad2a38a51f7e801ed93a543
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Tue Aug 10 12:01:08 2021 -0500

    SOLR-15657: Allow setting any and all standard SecureRandom / Security Provider usage to a non secure SecureRandom.
---
 .../randomization/policies/solr-tests.policy       |  2 +
 .../org/apache/solr/bench/MiniClusterState.java    |  9 +++
 .../apache/solr/util/NotSecurePseudoRandomSpi.java | 89 ++++++++++++++++++++++
 .../solr/util/SolrTestNonSecureRandomProvider.java | 79 +++++++++++++++++++
 4 files changed, 179 insertions(+)

diff --git a/gradle/testing/randomization/policies/solr-tests.policy b/gradle/testing/randomization/policies/solr-tests.policy
index ed8313f..297647a 100644
--- a/gradle/testing/randomization/policies/solr-tests.policy
+++ b/gradle/testing/randomization/policies/solr-tests.policy
@@ -40,6 +40,8 @@ grant {
 
   permission java.nio.file.LinkPermission "hard";
 
+  permission java.security.SecurityPermission "putProviderProperty.SolrTestNonSecure";
+
   // all possibilities of accepting/binding/connections on localhost with ports >=1024:
   permission java.net.SocketPermission "localhost:1024-", "accept,listen,connect,resolve";
   permission java.net.SocketPermission "127.0.0.1:1024-", "accept,listen,connect,resolve";
diff --git a/solr/benchmark/src/java/org/apache/solr/bench/MiniClusterState.java b/solr/benchmark/src/java/org/apache/solr/bench/MiniClusterState.java
index 18f3c2c..33c7a65 100755
--- a/solr/benchmark/src/java/org/apache/solr/bench/MiniClusterState.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/MiniClusterState.java
@@ -50,6 +50,7 @@ import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SolrNamedThreadFactory;
 import org.apache.solr.common.util.SuppressForbidden;
+import org.apache.solr.util.SolrTestNonSecureRandomProvider;
 import org.openjdk.jmh.annotations.Level;
 import org.openjdk.jmh.annotations.Scope;
 import org.openjdk.jmh.annotations.Setup;
@@ -97,6 +98,9 @@ public class MiniClusterState {
     /** The Delete mini cluster. */
     boolean deleteMiniCluster = true;
 
+    /** Unless overridden we ensure SecureRandoms do not block. */
+    boolean doNotWeakenSecureRandom = Boolean.getBoolean("doNotWeakenSecureRandom");
+
     /** The Mini cluster base dir. */
     Path miniClusterBaseDir;
 
@@ -175,6 +179,11 @@ public class MiniClusterState {
     public void doSetup(BenchmarkParams benchmarkParams, BaseBenchState baseBenchState)
         throws Exception {
 
+      if (!doNotWeakenSecureRandom) {
+        // remove all blocking from all secure randoms
+        SolrTestNonSecureRandomProvider.injectProvider();
+      }
+
       workDir = System.getProperty("workBaseDir", "build/work");
 
       log("");
diff --git a/solr/test-framework/src/java/org/apache/solr/util/NotSecurePseudoRandomSpi.java b/solr/test-framework/src/java/org/apache/solr/util/NotSecurePseudoRandomSpi.java
new file mode 100644
index 0000000..f77287e
--- /dev/null
+++ b/solr/test-framework/src/java/org/apache/solr/util/NotSecurePseudoRandomSpi.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.util;
+
+import java.security.SecureRandomParameters;
+import java.security.SecureRandomSpi;
+import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
+
+/**
+ * A mocked up instance of SecureRandom that just uses {@link Random} under the covers.
+ * This is to prevent blocking issues that arise in platform default
+ * SecureRandom instances due to too many instances / not enough random entropy.
+ * Tests do not need secure SSL.
+ */
+public class NotSecurePseudoRandomSpi extends SecureRandomSpi {
+
+  @Override
+  protected void engineSetSeed(byte[] seed) {
+
+  }
+
+  @Override
+  protected void engineNextBytes(byte[] bytes) {
+    fillData(bytes);
+  }
+
+  @Override
+  protected byte[] engineGenerateSeed(int numBytes) {
+    return new byte[numBytes];
+  }
+
+  /**
+   * Helper method that can be used to fill an array with non-zero data.
+   * (Attempted workarround of Solaris SSL Padding bug: SOLR-9068)
+   */
+  private static final byte[] fillData(byte[] data) {
+    ThreadLocalRandom.current().nextBytes(data);
+    return data;
+  }
+
+
+  public NotSecurePseudoRandomSpi() {
+    super();
+  }
+
+  /** returns a new byte[] filled with static data */
+  public byte[] generateSeed(int numBytes) {
+    return fillData(new byte[numBytes]);
+  }
+
+  /** fills the byte[] with static data */
+  public void nextBytes(byte[] bytes) {
+    fillData(bytes);
+  }
+
+  public void nextBytes(byte[] bytes, SecureRandomParameters params) {
+    fillData(bytes);
+  }
+
+  /** NOOP */
+  public void setSeed(byte[] seed) { /* NOOP */ }
+
+  /** NOOP */
+  public void setSeed(long seed) { /* NOOP */ }
+
+  public void reseed() {
+    /* NOOP */
+  }
+
+  public void reseed(SecureRandomParameters params) {
+    /* NOOP */
+  }
+
+}
diff --git a/solr/test-framework/src/java/org/apache/solr/util/SolrTestNonSecureRandomProvider.java b/solr/test-framework/src/java/org/apache/solr/util/SolrTestNonSecureRandomProvider.java
new file mode 100644
index 0000000..ee7ce7a
--- /dev/null
+++ b/solr/test-framework/src/java/org/apache/solr/util/SolrTestNonSecureRandomProvider.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.util;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.Provider;
+import java.security.SecureRandom;
+import java.security.Security;
+
+public class SolrTestNonSecureRandomProvider extends Provider {
+
+  public SolrTestNonSecureRandomProvider() {
+    super("SolrTestNonSecure",
+        "1.0",
+        "A Test only, non secure provider");
+    put("SecureRandom.SHA1PRNG", NotSecurePseudoRandomSpi.class.getName());
+    put("SecureRandom.NativePRNG", NotSecurePseudoRandomSpi.class.getName());
+    put("SecureRandom.DRBG", NotSecurePseudoRandomSpi.class.getName());
+
+    put("SecureRandom.SHA1PRNG ThreadSafe", "true");
+    put("SecureRandom.NativePRNG ThreadSafe", "true");
+    put("SecureRandom.DRBG ThreadSafe", "true");
+
+    put("SecureRandom.SHA1PRNG ImplementedIn", "Software");
+    put("SecureRandom.NativePRNG ImplementedIn", "Software");
+    put("SecureRandom.DRBG ImplementedIn", "Software");
+  }
+
+  public static void injectProvider() {
+      // Install our non secure solr test secure random provider
+      Provider[] secureRandomProviders =
+          Security.getProviders("SecureRandom.SHA1PRNG");
+      if ((secureRandomProviders == null)
+          || (secureRandomProviders.length < 1)
+          || (!SolrTestNonSecureRandomProvider.class.equals(
+          secureRandomProviders[0].getClass()))) {
+          Security.insertProviderAt(new SolrTestNonSecureRandomProvider(), 1);
+      }
+
+      // Assert that new SecureRandom() and
+      // SecureRandom.getInstance("SHA1PRNG") return a SecureRandom backed
+      // by our non secure test provider.
+      SecureRandom rng1 = new SecureRandom();
+      if (!SolrTestNonSecureRandomProvider.class.equals(
+          rng1.getProvider().getClass())) {
+          throw new SecurityException(
+              "new SecureRandom() backed by wrong Provider: "
+                  + rng1.getProvider().getClass());
+      }
+
+      boolean skipCheck = false;
+      SecureRandom rng2 = null;
+      try {
+          rng2 = SecureRandom.getInstance("SHA1PRNG");
+      } catch (NoSuchAlgorithmException e) {
+          skipCheck = true;
+      }
+      if (!skipCheck && !SolrTestNonSecureRandomProvider.class.equals(
+          rng2.getProvider().getClass())) {
+          throw new SecurityException(
+              "SecureRandom.getInstance(\"SHA1PRNG\") backed by wrong"
+                  + " Provider: " + rng2.getProvider().getClass());
+      }
+  }
+}
\ No newline at end of file