This is an automated email from the ASF dual-hosted git repository. kusal pushed a commit to branch WW-5418-struts-sec in repository https://gitbox.apache.org/repos/asf/struts.git
commit 100f5052d40a4bfbc128661ea489b0c8568a78a0 Author: Kusal Kithul-Godage <g...@kusal.io> AuthorDate: Thu Apr 18 11:13:56 2024 +1000 WW-5418 Forbid enums --- .../opensymphony/xwork2/ognl/SecurityMemberAccess.java | 16 ---------------- .../com/opensymphony/xwork2/ognl/OgnlValueStackTest.java | 8 ++++---- .../xwork2/ognl/SecurityMemberAccessTest.java | 2 +- 3 files changed, 5 insertions(+), 21 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java b/core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java index b0ee1f21c..43ae99240 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java @@ -31,7 +31,6 @@ import org.apache.struts2.ognl.ThreadAllowlist; import java.lang.reflect.AccessibleObject; import java.lang.reflect.Field; import java.lang.reflect.Member; -import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.HashSet; @@ -313,10 +312,6 @@ public class SecurityMemberAccess implements MemberAccess { * @return {@code true} if member access is allowed */ protected boolean checkStaticMethodAccess(Member member) { - if (checkEnumAccess(member)) { - LOG.trace("Exempting Enum#values from static method check: class [{}]", member.getDeclaringClass()); - return true; - } return member instanceof Field || !isStatic(member); } @@ -347,17 +342,6 @@ public class SecurityMemberAccess implements MemberAccess { return Modifier.isPublic(member.getModifiers()); } - /** - * @return {@code true} if member access is allowed - */ - protected boolean checkEnumAccess(Member member) { - return member.getDeclaringClass().isEnum() - && isStatic(member) - && member instanceof Method - && member.getName().equals("values") - && ((Method) member).getParameterCount() == 0; - } - protected boolean isPackageExcluded(Class<?> clazz) { return !excludedPackageExemptClasses.contains(clazz.getName()) && (isExcludedPackageNames(clazz) || isExcludedPackageNamePatterns(clazz)); } diff --git a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java index 3bdfd67fc..7fb560c5b 100644 --- a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java @@ -437,12 +437,12 @@ public class OgnlValueStackTest extends XWorkTestCase { } /** - * Allow access Enums without enabling access to static methods + * Enum methods should also be banned alongside static methods */ public void testEnum() throws Exception { - assertEquals("ONE", vs.findValue("@com.opensymphony.xwork2.ognl.MyNumbers@values()[0]", String.class)); - assertEquals("TWO", vs.findValue("@com.opensymphony.xwork2.ognl.MyNumbers@values()[1]", String.class)); - assertEquals("THREE", vs.findValue("@com.opensymphony.xwork2.ognl.MyNumbers@values()[2]", String.class)); + assertNull("ONE", vs.findValue("@com.opensymphony.xwork2.ognl.MyNumbers@values()[0]", String.class)); + assertNull("TWO", vs.findValue("@com.opensymphony.xwork2.ognl.MyNumbers@values()[1]", String.class)); + assertNull("THREE", vs.findValue("@com.opensymphony.xwork2.ognl.MyNumbers@values()[2]", String.class)); } public void testStaticMethodDisallow() { diff --git a/core/src/test/java/com/opensymphony/xwork2/ognl/SecurityMemberAccessTest.java b/core/src/test/java/com/opensymphony/xwork2/ognl/SecurityMemberAccessTest.java index 03bad82e4..381b7d0ad 100644 --- a/core/src/test/java/com/opensymphony/xwork2/ognl/SecurityMemberAccessTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/ognl/SecurityMemberAccessTest.java @@ -413,7 +413,7 @@ public class SecurityMemberAccessTest { boolean actual = sma.isAccessible(context, MyValues.class, values, null); // then - assertTrue("Access to enums is blocked!", actual); + assertFalse("Access to enums is allowed!", actual); } @Test