Skip to content

Commit 0778a5c

Browse files
committed
HV-1498 Fix privilege escalation when running under the security manager
1 parent ce6f082 commit 0778a5c

File tree

6 files changed

+48
-1
lines changed

6 files changed

+48
-1
lines changed

documentation/src/main/asciidoc/ch01.asciidoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ grant codeBase "file:path/to/hibernate-validator-{hvVersion}.jar" {
101101
permission java.lang.RuntimePermission "accessDeclaredMembers";
102102
permission java.lang.RuntimePermission "setContextClassLoader";
103103
104+
permission org.hibernate.validator.HibernateValidatorPermission "accessPrivateMembers";
105+
104106
// Only needed when working with XML descriptors (validation.xml or XML constraint mappings)
105107
permission java.util.PropertyPermission "mapAnyUriToUri", "read";
106108
};
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Hibernate Validator, declare and validate application constraints
3+
*
4+
* License: Apache License, Version 2.0
5+
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
6+
*/
7+
package org.hibernate.validator;
8+
9+
import java.security.BasicPermission;
10+
11+
/**
12+
* Our specific implementation of {@link BasicPermission} as we cannot define additional {@link RuntimePermission}.
13+
* <p>
14+
* {@code HibernateValidatorPermission} is thread-safe and immutable.
15+
*
16+
* @author Guillaume Smet
17+
*/
18+
public class HibernateValidatorPermission extends BasicPermission {
19+
20+
public static final HibernateValidatorPermission ACCESS_PRIVATE_MEMBERS = new HibernateValidatorPermission( "accessPrivateMembers" );
21+
22+
public HibernateValidatorPermission(String name) {
23+
super( name );
24+
}
25+
26+
public HibernateValidatorPermission(String name, String actions) {
27+
super( name, actions );
28+
}
29+
}

engine/src/main/java/org/hibernate/validator/internal/engine/ValidatorImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import javax.validation.groups.Default;
4141
import javax.validation.metadata.BeanDescriptor;
4242

43+
import org.hibernate.validator.HibernateValidatorPermission;
4344
import org.hibernate.validator.internal.engine.ValidationContext.ValidationContextBuilder;
4445
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager;
4546
import org.hibernate.validator.internal.engine.groups.Group;
@@ -1739,6 +1740,11 @@ private Member getAccessible(Member original) {
17391740
return member;
17401741
}
17411742

1743+
SecurityManager sm = System.getSecurityManager();
1744+
if ( sm != null ) {
1745+
sm.checkPermission( HibernateValidatorPermission.ACCESS_PRIVATE_MEMBERS );
1746+
}
1747+
17421748
Class<?> clazz = original.getDeclaringClass();
17431749

17441750
if ( original instanceof Field ) {

engine/src/main/java/org/hibernate/validator/internal/metadata/aggregated/PropertyMetaData.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import javax.validation.ElementKind;
2626
import javax.validation.metadata.GroupConversionDescriptor;
2727

28+
import org.hibernate.validator.HibernateValidatorPermission;
2829
import org.hibernate.validator.internal.engine.valuehandling.UnwrapMode;
2930
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
3031
import org.hibernate.validator.internal.metadata.core.MetaConstraint;
@@ -119,6 +120,11 @@ private static Member getAccessible(Member original) {
119120
return original;
120121
}
121122

123+
SecurityManager sm = System.getSecurityManager();
124+
if ( sm != null ) {
125+
sm.checkPermission( HibernateValidatorPermission.ACCESS_PRIVATE_MEMBERS );
126+
}
127+
122128
Class<?> clazz = original.getDeclaringClass();
123129
Member member;
124130

engine/src/main/java/org/hibernate/validator/internal/util/privilegedactions/GetDeclaredField.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ private GetDeclaredField(Class<?> clazz, String fieldName) {
3131
public Field run() {
3232
try {
3333
final Field field = clazz.getDeclaredField( fieldName );
34-
field.setAccessible( true );
3534
return field;
3635
}
3736
catch (NoSuchFieldException e) {

tck-runner/src/test/resources/test.policy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ grant codeBase "file:${localRepository}/org/hibernate/hibernate-validator/${proj
2828
permission java.lang.RuntimePermission "accessDeclaredMembers";
2929
permission java.lang.RuntimePermission "setContextClassLoader";
3030

31+
permission org.hibernate.validator.HibernateValidatorPermission "accessPrivateMembers";
32+
3133
// JAXB
3234
permission java.util.PropertyPermission "mapAnyUriToUri", "read";
3335
};
@@ -39,6 +41,8 @@ grant codeBase "file:${basedir}/../engine/target/hibernate-validator-${project.v
3941
permission java.lang.RuntimePermission "accessDeclaredMembers";
4042
permission java.lang.RuntimePermission "setContextClassLoader";
4143

44+
permission org.hibernate.validator.HibernateValidatorPermission "accessPrivateMembers";
45+
4246
// JAXB
4347
permission java.util.PropertyPermission "mapAnyUriToUri", "read";
4448
};
@@ -81,6 +85,7 @@ grant codeBase "file:${project.build.directory}/classes" {
8185
permission java.util.PropertyPermission "validation.provider", "read";
8286
permission java.io.FilePermission "${localRepository}/org/hibernate/beanvalidation/tck/beanvalidation-tck-tests/${tck.version}/beanvalidation-tck-tests-${tck.version}.jar", "read";
8387
permission java.util.PropertyPermission "user.language", "write";
88+
permission org.hibernate.validator.HibernateValidatorPermission "accessPrivateMembers";
8489
};
8590

8691
grant codeBase "file:${project.build.directory}/test-classes" {

0 commit comments

Comments
 (0)