Skip to content

Commit e6ca103

Browse files
authored
Signed-off-by: Marvin Froeder <[email protected]>
1 parent 49d975a commit e6ca103

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

querydsl-libraries/querydsl-core/src/main/java/com/querydsl/core/types/dsl/PathBuilderValidator.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.io.Serializable;
2020
import java.util.Collection;
2121
import java.util.Map;
22+
import java.util.regex.Pattern;
2223

2324
/** {@code PathBuilderValidator} validates {@link PathBuilder} properties at creation time */
2425
public interface PathBuilderValidator extends Serializable {
@@ -35,8 +36,14 @@ public interface PathBuilderValidator extends Serializable {
3536

3637
PathBuilderValidator DEFAULT =
3738
new PathBuilderValidator() {
39+
40+
private Pattern SPACES = Pattern.compile("\\s");
41+
3842
@Override
3943
public Class<?> validate(Class<?> parent, String property, Class<?> propertyType) {
44+
if (SPACES.matcher(property).find()) {
45+
throw new IllegalStateException("Unsafe due to CVE-2024-49203");
46+
}
4047
return propertyType;
4148
}
4249
};

querydsl-libraries/querydsl-core/src/test/java/com/querydsl/core/types/dsl/PathBuilderTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,13 @@
1414
package com.querydsl.core.types.dsl;
1515

1616
import static org.assertj.core.api.Assertions.assertThat;
17+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
18+
import static org.junit.jupiter.api.Assertions.assertThrows;
1719

1820
import com.querydsl.core.BooleanBuilder;
21+
import com.querydsl.core.domain.Cat;
22+
import com.querydsl.core.types.Order;
23+
import com.querydsl.core.types.OrderSpecifier;
1924
import com.querydsl.core.util.BeanMap;
2025
import java.sql.Time;
2126
import java.util.Date;
@@ -128,4 +133,25 @@ public void calling_get_with_the_same_name_and_different_types_returns_correct_t
128133
assertThat(entity.get(pathName, Comparable.class).getType()).isEqualTo(String.class);
129134
assertThat(entity.get(pathName, Object.class).getType()).isEqualTo(String.class);
130135
}
136+
137+
@Test
138+
public void order_HQL_injection() {
139+
var orderBy = "breed";
140+
var pathBuilder = new PathBuilder<Cat>(Cat.class, "entity");
141+
assertDoesNotThrow(() -> new OrderSpecifier(Order.ASC, pathBuilder.get(orderBy)));
142+
}
143+
144+
@Test
145+
// CVE-2024-49203
146+
// https://github.com/OpenFeign/querydsl/security/advisories/GHSA-6q3q-6v5j-h6vg
147+
public void unsafe_order_HQL_injection() {
148+
var orderBy =
149+
"test.name INTERSECT SELECT t FROM Test t WHERE (SELECT cast(pg_sleep(10) AS text))='2' ORDER BY t.id";
150+
var pathBuilder = new PathBuilder<Cat>(Cat.class, "entity");
151+
var error =
152+
assertThrows(
153+
IllegalStateException.class,
154+
() -> new OrderSpecifier(Order.ASC, pathBuilder.get(orderBy)));
155+
assertThat(error).hasMessageContaining("CVE-2024-49203");
156+
}
131157
}

0 commit comments

Comments
 (0)