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

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


The following commit(s) were added to refs/heads/trunk by this push:
     new a63cc20481 Improved: Harden the ProgramExport Groovy sandbox against 
indirectly-named method calls
a63cc20481 is described below

commit a63cc204819c19abcd6f4faa7cb980c9fe09620e
Author: Mridul Pathak <[email protected]>
AuthorDate: Thu Sep 24 13:48:39 2026 +0530

    Improved: Harden the ProgramExport Groovy sandbox against indirectly-named 
method calls
    
    The in-file SecureASTCustomizer restricts method calls by receiver type and 
by a
    source-text pattern list. Both checks rely on the receiver type and the 
method name
    being statically visible, so a method invoked through a computed or 
GString-valued
    name is covered by neither. Add a SecureASTCustomizer expression checker 
that rejects
    any method call whose name is not a compile-time constant. Export scripts 
call methods
    only by their literal name, so legitimate use is unaffected.
---
 .../org/apache/ofbiz/webtools/entity/ProgramExport.groovy   | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git 
a/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/ProgramExport.groovy
 
b/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/ProgramExport.groovy
index 204ac89c83..cac97e9d64 100644
--- 
a/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/ProgramExport.groovy
+++ 
b/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/ProgramExport.groovy
@@ -27,6 +27,8 @@ import org.apache.ofbiz.entity.condition.EntityOperator
 import org.apache.ofbiz.entity.model.ModelEntity
 import org.apache.ofbiz.entity.util.EntityFindOptions
 import org.apache.ofbiz.entity.util.EntityQuery
+import org.codehaus.groovy.ast.expr.ConstantExpression
+import org.codehaus.groovy.ast.expr.MethodCallExpression
 import org.codehaus.groovy.ast.expr.MethodPointerExpression
 import org.codehaus.groovy.ast.stmt.ForStatement
 import org.codehaus.groovy.ast.stmt.SwitchStatement
@@ -222,6 +224,17 @@ if (security.hasPermission('ENTITY_MAINT', session)) {
         setMethodDefinitionAllowed(false)
     }
 
+    // Reject method calls whose method name is not a compile-time constant, 
e.g. obj."$name"(),
+    // obj.("a" + "b")() or any other computed/GString-valued invocation. The 
receiver allow-list
+    // above and the dangerousPatterns regex both key off statically visible 
types and literal method
+    // names, so a dynamically resolved name slips past both layers: 
'x'."${'exec' + 'ute'}"() calls
+    // String.execute() (a GDK method on the allowed java.lang.String / 
java.lang.Object receivers)
+    // and runs an OS command. Legitimate export scripts only ever call 
methods by their literal name,
+    // so forbidding indirect method dispatch closes that bypass class without 
affecting real usage.
+    secureCustomizer.addExpressionCheckers({ expr ->
+        !(expr instanceof MethodCallExpression) || expr.method instanceof 
ConstantExpression
+    } as SecureASTCustomizer.ExpressionChecker)
+
     // Add imports for script.
     ImportCustomizer importCustomizer = new ImportCustomizer()
     importCustomizer.addImport('org.apache.ofbiz.entity.GenericValue')

Reply via email to