Skip to content

Commit 0886e89

Browse files
committed
HV-1498 Fix privilege escalation when running under the security manager
1 parent 2b89528 commit 0886e89

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
@@ -106,6 +106,8 @@ grant codeBase "file:path/to/hibernate-validator-{hvVersion}.jar" {
106106
permission java.lang.RuntimePermission "accessDeclaredMembers";
107107
permission java.lang.RuntimePermission "setContextClassLoader";
108108
109+
permission org.hibernate.validator.HibernateValidatorPermission "accessPrivateMembers";
110+
109111
// Only needed when working with XML descriptors (validation.xml or XML constraint mappings)
110112
permission java.util.PropertyPermission "mapAnyUriToUri", "read";
111113
};
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;
@@ -1771,6 +1772,11 @@ private Member getAccessible(Member original) {
17711772
return member;
17721773
}
17731774

1775+
SecurityManager sm = System.getSecurityManager();
1776+
if ( sm != null ) {
1777+
sm.checkPermission( HibernateValidatorPermission.ACCESS_PRIVATE_MEMBERS );
1778+
}
1779+
17741780
Class<?> clazz = original.getDeclaringClass();
17751781

17761782
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)