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

jleroux pushed a commit to branch release24.09
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/release24.09 by this push:
     new 505c88cf45 Improved: Check parameters passed in URLs (OFBIZ-13295)
505c88cf45 is described below

commit 505c88cf45958a67e4b1bada32963455c406b8fe
Author: Jacques Le Roux <[email protected]>
AuthorDate: Fri Oct 10 20:35:44 2025 +0200

    Improved: Check parameters passed in URLs (OFBIZ-13295)
    
    Thanks to Nicolas, improves previous commits that did not handle multipart
    element
    
    Also while at it, adds a space after "process" in deniedWebShellTokens of
    security.properties. I stumbled upon it after trying to upload a file 
created
    by a Canon camera. Anyway the deniedWebShellTokens comment suggest that when
    it's necessary.
    
    Conflicts handled by hand
---
 .../org/apache/ofbiz/common/UrlServletHelper.java  |  3 ++
 framework/security/config/security.properties      |  2 +-
 .../apache/ofbiz/webapp/control/ControlFilter.java | 36 +++++++++++-----------
 3 files changed, 22 insertions(+), 19 deletions(-)

diff --git 
a/framework/common/src/main/java/org/apache/ofbiz/common/UrlServletHelper.java 
b/framework/common/src/main/java/org/apache/ofbiz/common/UrlServletHelper.java
index 63c6856aa8..98fdbd7888 100644
--- 
a/framework/common/src/main/java/org/apache/ofbiz/common/UrlServletHelper.java
+++ 
b/framework/common/src/main/java/org/apache/ofbiz/common/UrlServletHelper.java
@@ -50,6 +50,9 @@ public final class UrlServletHelper {
     public static void setRequestAttributes(ServletRequest request, Delegator 
delegator, ServletContext servletContext) {
         HttpServletRequest httpRequest = (HttpServletRequest) request;
         // check if multi tenant is enabled
+        if (delegator == null) {
+            delegator = WebAppUtil.getDelegator(servletContext);
+        }
         boolean useMultitenant = EntityUtil.isMultiTenantEnabled();
         if (useMultitenant) {
             // get tenant delegator by domain name
diff --git a/framework/security/config/security.properties 
b/framework/security/config/security.properties
index 6dcb56a9cd..ed9a412f29 100644
--- a/framework/security/config/security.properties
+++ b/framework/security/config/security.properties
@@ -280,7 +280,7 @@ csvformat=CSVFormat.DEFAULT
 deniedWebShellTokens=java.,beans,freemarker,<script,javascript,<body,body 
,<form,<jsp:,<c:out,taglib,<prefix,<%@ page,<?php,exec(,alert(,\
                     
%eval,@eval,eval(,runtime,import,passthru,shell_exec,assert,str_rot13,system,decode,include,page
 ,\
                     chmod,mkdir,fopen,fclose,new 
file,upload,getfilename,download,getoutputstring,readfile,iframe,object,embed,onload,build,\
-                    python,perl ,/perl,ruby 
,/ruby,process,function,class,InputStream,to_server,wget 
,static,assign,webappPath,\
+                    python,perl ,/perl,ruby ,/ruby,process 
,function,class,InputStream,to_server,wget ,static,assign,webappPath,\
                     ifconfig,route,crontab,netstat,uname 
,hostname,iptables,whoami,"cmd",*cmd|,+cmd|,=cmd|,localhost,thread,require(,gzdeflate,\
                     execute,println,calc,touch,curl,base64, tcp ,4444,base32, 
tr , xxd ,bash, od ,|od ,printf,echo
 
diff --git 
a/framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/ControlFilter.java
 
b/framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/ControlFilter.java
index 0cd5e94899..5aba5dd967 100644
--- 
a/framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/ControlFilter.java
+++ 
b/framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/ControlFilter.java
@@ -24,8 +24,8 @@ import java.net.URISyntaxException;
 import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -45,9 +45,11 @@ import org.apache.commons.validator.routines.UrlValidator;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.ofbiz.base.util.Debug;
 import org.apache.ofbiz.base.util.StringUtil;
+import org.apache.ofbiz.base.util.UtilGenerics;
 import org.apache.ofbiz.base.util.UtilHttp;
 import org.apache.ofbiz.base.util.UtilProperties;
 import org.apache.ofbiz.base.util.UtilValidate;
+import org.apache.ofbiz.common.UrlServletHelper;
 import org.apache.ofbiz.entity.GenericValue;
 import org.apache.ofbiz.security.SecuredFreemarker;
 import org.apache.ofbiz.security.SecuredUpload;
@@ -169,35 +171,33 @@ public class ControlFilter extends HttpFilter {
 
         // Prevents stream exploitation
         if (!isSolrTest()) {
+            UrlServletHelper.setRequestAttributes(req, null, 
req.getServletContext());
             Map<String, Object> parameters = UtilHttp.getParameterMap(req);
             boolean reject = false;
             if (!parameters.isEmpty()) {
                 for (String key : parameters.keySet()) {
                     Object object = parameters.get(key);
-                    if (object.getClass().equals(String.class)) {
-                        String val = (String) object;
-                        if (val.contains("<")) {
+                    if (object.getClass().equals(String.class)
+                            || object instanceof Collection) {
+                        try {
+                            List<String> toCheck = 
object.getClass().equals(String.class)
+                                    ? List.of((String) object)
+                                            : 
UtilGenerics.checkCollection(object, String.class);
+                            reject = toCheck.stream()
+                                    .anyMatch(val -> val.contains("<"));
+                        } catch (IllegalArgumentException e) {
+                            Debug.logWarning(e, MODULE);
                             reject = true;
                         }
-                    } else {
-                        @SuppressWarnings("unchecked")
-                        LinkedList<String> vals = (LinkedList<String>) 
parameters.get(key);
-                        for (String aVal : vals) {
-                            if (aVal.contains("<")) {
-                                reject = true;
-                            }
-                        }
                     }
-                }
-                if (reject) {
-                    Debug.logError("For security reason this URL is not 
accepted", MODULE);
-                    throw new RuntimeException("For security reason this URL 
is not accepted");
+                    if (reject) {
+                        Debug.logError("For security reason this URL is not 
accepted", MODULE);
+                        throw new RuntimeException("For security reason this 
URL is not accepted");
+                    }
                 }
             }
         }
 
-
-
         // Check if we are told to redirect everything.
         if (redirectAll) {
             // little trick here so we don't loop on ourselves

Reply via email to