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

coheigea pushed a commit to branch coheigea/jndi-protocol
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit c4a59cf30019f0f9e81ae2a5ea6fad98aafb74b5
Author: Colm O hEigeartaigh <[email protected]>
AuthorDate: Tue May 20 10:52:22 2025 +0100

    Forbid LDAP/RMI from JndiHelper
---
 .../apache/cxf/transport/jms/util/JndiHelper.java  |  7 +++++++
 .../cxf/transport/jms/JMSConfigFactoryTest.java    | 24 ++++++++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git 
a/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/util/JndiHelper.java
 
b/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/util/JndiHelper.java
index 009443db36..1f07ac0ffc 100644
--- 
a/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/util/JndiHelper.java
+++ 
b/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/util/JndiHelper.java
@@ -34,6 +34,13 @@ public class JndiHelper {
      */
     public JndiHelper(Properties environment) {
         this.environment = environment;
+
+        // Avoid unsafe protocols if they are somehow misconfigured
+        String providerUrl = environment.getProperty(Context.PROVIDER_URL);
+        if (providerUrl != null && (providerUrl.startsWith("ldap://";)
+                || providerUrl.startsWith("rmi://"))) {
+            throw new IllegalArgumentException("Unsafe protocol in JNDI URL: " 
+ providerUrl);
+        }
     }
 
     @SuppressWarnings("unchecked")
diff --git 
a/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/JMSConfigFactoryTest.java
 
b/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/JMSConfigFactoryTest.java
index 8d55453203..b52b7b6952 100644
--- 
a/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/JMSConfigFactoryTest.java
+++ 
b/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/JMSConfigFactoryTest.java
@@ -19,9 +19,13 @@
 
 package org.apache.cxf.transport.jms;
 
+import java.util.Properties;
+
 import javax.naming.NamingException;
 import javax.transaction.xa.XAException;
 
+import javax.naming.Context;
+
 import jakarta.transaction.TransactionManager;
 import org.apache.cxf.Bus;
 import org.apache.cxf.BusFactory;
@@ -35,6 +39,26 @@ import org.junit.Test;
 
 public class JMSConfigFactoryTest extends AbstractJMSTester {
 
+    @Test
+    public void testJndiForbiddenProtocol() throws Exception {
+        Properties env = new Properties();
+        env.put(Context.INITIAL_CONTEXT_FACTORY, 
"com.sun.jndi.ldap.LdapCtxFactory");
+        env.put(Context.PROVIDER_URL, "ldap://127.0.0.1:12345";);
+        // Allow following referrals (important for LDAP injection)
+        env.put(Context.REFERRAL, "follow");
+        
+        JMSConfiguration jmsConfig = new JMSConfiguration();
+        jmsConfig.setJndiEnvironment(env);
+        jmsConfig.setConnectionFactoryName("objectName");
+        
+        try {
+            jmsConfig.getConnectionFactory();
+            Assert.fail("JNDI lookup should have failed");
+        } catch (Exception e) {
+            Assert.assertTrue(e.getMessage().contains("Unsafe protocol in JNDI 
URL"));
+        }
+    }
+
     @Test
     public void testUsernameAndPassword() throws Exception {
         EndpointInfo ei = setupServiceInfo("HelloWorldService", 
"HelloWorldPort");

Reply via email to