Skip to content

Commit 5a9d1d7

Browse files
committed
Add failing test for @pattern validation
1 parent 6a8204d commit 5a9d1d7

File tree

7 files changed

+317
-1
lines changed

7 files changed

+317
-1
lines changed

java/ql/test/query-tests/security/CWE-918/RequestForgery.expected

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,8 @@
252252
| SanitizationTests.java:119:25:119:32 | unsafer9 | SanitizationTests.java:117:33:117:63 | getParameter(...) : String | SanitizationTests.java:119:25:119:32 | unsafer9 | Potential server-side request forgery due to a $@. | SanitizationTests.java:117:33:117:63 | getParameter(...) | user-provided value |
253253
| SanitizationTests.java:122:60:122:79 | new URI(...) | SanitizationTests.java:121:94:121:125 | getParameter(...) : String | SanitizationTests.java:122:60:122:79 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:121:94:121:125 | getParameter(...) | user-provided value |
254254
| SanitizationTests.java:123:25:123:33 | unsafer10 | SanitizationTests.java:121:94:121:125 | getParameter(...) : String | SanitizationTests.java:123:25:123:33 | unsafer10 | Potential server-side request forgery due to a $@. | SanitizationTests.java:121:94:121:125 | getParameter(...) | user-provided value |
255+
| SanitizationTests.java:153:54:153:69 | new URI(...) | SanitizationTests.java:152:55:152:83 | getParameter(...) : String | SanitizationTests.java:153:54:153:69 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:152:55:152:83 | getParameter(...) | user-provided value |
256+
| SanitizationTests.java:154:25:154:27 | r14 | SanitizationTests.java:152:55:152:83 | getParameter(...) : String | SanitizationTests.java:154:25:154:27 | r14 | Potential server-side request forgery due to a $@. | SanitizationTests.java:152:55:152:83 | getParameter(...) | user-provided value |
255257
| SpringSSRF.java:32:39:32:59 | ... + ... | SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:32:39:32:59 | ... + ... | Potential server-side request forgery due to a $@. | SpringSSRF.java:28:33:28:60 | getParameter(...) | user-provided value |
256258
| SpringSSRF.java:33:69:33:82 | fooResourceUrl | SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:33:69:33:82 | fooResourceUrl | Potential server-side request forgery due to a $@. | SpringSSRF.java:28:33:28:60 | getParameter(...) | user-provided value |
257259
| SpringSSRF.java:34:73:34:86 | fooResourceUrl | SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:34:73:34:86 | fooResourceUrl | Potential server-side request forgery due to a $@. | SpringSSRF.java:28:33:28:60 | getParameter(...) | user-provided value |
@@ -833,6 +835,20 @@ edges
833835
| SanitizationTests.java:122:68:122:78 | unsafeUri10 : String | SanitizationTests.java:122:60:122:79 | new URI(...) | provenance | MaD:285 Sink:MaD:6 |
834836
| SanitizationTests.java:122:68:122:78 | unsafeUri10 : String | SanitizationTests.java:122:60:122:79 | new URI(...) : URI | provenance | Config |
835837
| SanitizationTests.java:122:68:122:78 | unsafeUri10 : String | SanitizationTests.java:122:60:122:79 | new URI(...) : URI | provenance | MaD:285 |
838+
| SanitizationTests.java:152:35:152:84 | new AnnotatedObject(...) : AnnotatedObject [uri] : String | SanitizationTests.java:153:62:153:64 | obj : AnnotatedObject [uri] : String | provenance | |
839+
| SanitizationTests.java:152:55:152:83 | getParameter(...) : String | SanitizationTests.java:152:35:152:84 | new AnnotatedObject(...) : AnnotatedObject [uri] : String | provenance | Src:MaD:277 |
840+
| SanitizationTests.java:152:55:152:83 | getParameter(...) : String | SanitizationTests.java:170:32:170:41 | uri : String | provenance | Src:MaD:277 |
841+
| SanitizationTests.java:153:31:153:70 | newBuilder(...) : Builder | SanitizationTests.java:153:31:153:78 | build(...) : HttpRequest | provenance | MaD:283 |
842+
| SanitizationTests.java:153:31:153:78 | build(...) : HttpRequest | SanitizationTests.java:154:25:154:27 | r14 | provenance | Sink:MaD:4 |
843+
| SanitizationTests.java:153:54:153:69 | new URI(...) : URI | SanitizationTests.java:153:31:153:70 | newBuilder(...) : Builder | provenance | MaD:284 |
844+
| SanitizationTests.java:153:62:153:64 | obj : AnnotatedObject [uri] : String | SanitizationTests.java:153:62:153:68 | obj.uri : String | provenance | |
845+
| SanitizationTests.java:153:62:153:68 | obj.uri : String | SanitizationTests.java:153:54:153:69 | new URI(...) | provenance | Config Sink:MaD:6 |
846+
| SanitizationTests.java:153:62:153:68 | obj.uri : String | SanitizationTests.java:153:54:153:69 | new URI(...) | provenance | MaD:285 Sink:MaD:6 |
847+
| SanitizationTests.java:153:62:153:68 | obj.uri : String | SanitizationTests.java:153:54:153:69 | new URI(...) : URI | provenance | Config |
848+
| SanitizationTests.java:153:62:153:68 | obj.uri : String | SanitizationTests.java:153:54:153:69 | new URI(...) : URI | provenance | MaD:285 |
849+
| SanitizationTests.java:170:32:170:41 | uri : String | SanitizationTests.java:171:24:171:26 | uri : String | provenance | |
850+
| SanitizationTests.java:171:13:171:16 | this [post update] : AnnotatedObject [uri] : String | SanitizationTests.java:170:16:170:30 | parameter this [Return] : AnnotatedObject [uri] : String | provenance | |
851+
| SanitizationTests.java:171:24:171:26 | uri : String | SanitizationTests.java:171:13:171:16 | this [post update] : AnnotatedObject [uri] : String | provenance | |
836852
| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:32:39:32:59 | ... + ... | provenance | Src:MaD:277 Sink:MaD:264 |
837853
| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:33:69:33:82 | fooResourceUrl | provenance | Src:MaD:277 |
838854
| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:34:73:34:86 | fooResourceUrl | provenance | Src:MaD:277 |
@@ -1815,6 +1831,19 @@ nodes
18151831
| SanitizationTests.java:122:60:122:79 | new URI(...) : URI | semmle.label | new URI(...) : URI |
18161832
| SanitizationTests.java:122:68:122:78 | unsafeUri10 : String | semmle.label | unsafeUri10 : String |
18171833
| SanitizationTests.java:123:25:123:33 | unsafer10 | semmle.label | unsafer10 |
1834+
| SanitizationTests.java:152:35:152:84 | new AnnotatedObject(...) : AnnotatedObject [uri] : String | semmle.label | new AnnotatedObject(...) : AnnotatedObject [uri] : String |
1835+
| SanitizationTests.java:152:55:152:83 | getParameter(...) : String | semmle.label | getParameter(...) : String |
1836+
| SanitizationTests.java:153:31:153:70 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder |
1837+
| SanitizationTests.java:153:31:153:78 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest |
1838+
| SanitizationTests.java:153:54:153:69 | new URI(...) | semmle.label | new URI(...) |
1839+
| SanitizationTests.java:153:54:153:69 | new URI(...) : URI | semmle.label | new URI(...) : URI |
1840+
| SanitizationTests.java:153:62:153:64 | obj : AnnotatedObject [uri] : String | semmle.label | obj : AnnotatedObject [uri] : String |
1841+
| SanitizationTests.java:153:62:153:68 | obj.uri : String | semmle.label | obj.uri : String |
1842+
| SanitizationTests.java:154:25:154:27 | r14 | semmle.label | r14 |
1843+
| SanitizationTests.java:170:16:170:30 | parameter this [Return] : AnnotatedObject [uri] : String | semmle.label | parameter this [Return] : AnnotatedObject [uri] : String |
1844+
| SanitizationTests.java:170:32:170:41 | uri : String | semmle.label | uri : String |
1845+
| SanitizationTests.java:171:13:171:16 | this [post update] : AnnotatedObject [uri] : String | semmle.label | this [post update] : AnnotatedObject [uri] : String |
1846+
| SanitizationTests.java:171:24:171:26 | uri : String | semmle.label | uri : String |
18181847
| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | semmle.label | getParameter(...) : String |
18191848
| SpringSSRF.java:32:39:32:59 | ... + ... | semmle.label | ... + ... |
18201849
| SpringSSRF.java:33:69:33:82 | fooResourceUrl | semmle.label | fooResourceUrl |
@@ -2035,3 +2064,4 @@ nodes
20352064
| mad/Test.java:112:15:112:31 | (...)... | semmle.label | (...)... |
20362065
| mad/Test.java:112:24:112:31 | source(...) : String | semmle.label | source(...) : String |
20372066
subpaths
2067+
| SanitizationTests.java:152:55:152:83 | getParameter(...) : String | SanitizationTests.java:170:32:170:41 | uri : String | SanitizationTests.java:170:16:170:30 | parameter this [Return] : AnnotatedObject [uri] : String | SanitizationTests.java:152:35:152:84 | new AnnotatedObject(...) : AnnotatedObject [uri] : String |

java/ql/test/query-tests/security/CWE-918/SanitizationTests.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,11 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)
147147
HttpRequest r13 = HttpRequest.newBuilder(new URI(param13)).build();
148148
client.send(r13, null);
149149
}
150+
151+
// GOOD: sanitisation by @Pattern annotation
152+
AnnotatedObject obj = new AnnotatedObject(request.getParameter("uri14")); // $ SPURIOUS: Source
153+
HttpRequest r14 = HttpRequest.newBuilder(new URI(obj.uri)).build(); // $ SPURIOUS: Alert
154+
client.send(r14, null); // $ SPURIOUS: Alert
150155
} catch (Exception e) {
151156
// TODO: handle exception
152157
}
@@ -157,4 +162,13 @@ private void validate(String s) {
157162
throw new IllegalArgumentException("Invalid ID");
158163
}
159164
}
165+
166+
private static class AnnotatedObject {
167+
@javax.validation.constraints.Pattern(regexp = "[a-zA-Z0-9_-]+")
168+
String uri;
169+
170+
public AnnotatedObject(String uri) {
171+
this.uri = uri;
172+
}
173+
}
160174
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
//semmle-extractor-options: --javac-args -source 11 -target 11 -cp ${testdir}/../../../stubs/springframework-5.8.x:${testdir}/../../../stubs/javax-ws-rs-api-2.1.1:${testdir}/../../../stubs/javax-ws-rs-api-3.0.0:${testdir}/../../../stubs/apache-http-4.4.13/:${testdir}/../../../stubs/projectreactor-3.4.3/:${testdir}/../../../stubs/postgresql-42.3.3/:${testdir}/../../../stubs/HikariCP-3.4.5/:${testdir}/../../../stubs/spring-jdbc-5.3.8/:${testdir}/../../../stubs/jdbi3-core-3.27.2/:${testdir}/../../../stubs/cargo:${testdir}/../../../stubs/javafx-web:${testdir}/../../../stubs/apache-commons-jelly-1.0.1:${testdir}/../../../stubs/dom4j-2.1.1:${testdir}/../../../stubs/jaxen-1.2.0:${testdir}/../../../stubs/stapler-1.263:${testdir}/../../../stubs/javax-servlet-2.5:${testdir}/../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../stubs/saxon-xqj-9.x:${testdir}/../../../stubs/apache-commons-beanutils:${testdir}/../../../stubs/apache-commons-lang:${testdir}/../../../stubs/apache-http-5:${testdir}/../../../stubs/playframework-2.6.x:${testdir}/../../../stubs/jaxws-api-2.0:${testdir}/../../../stubs/apache-cxf
1+
//semmle-extractor-options: --javac-args -source 11 -target 11 -cp ${testdir}/../../../stubs/javax-validation-constraints:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/springframework-5.8.x:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/javax-ws-rs-api-2.1.1:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/javax-ws-rs-api-3.0.0:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/apache-http-4.4.13/:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/projectreactor-3.4.3/:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/postgresql-42.3.3/:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/HikariCP-3.4.5/:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/spring-jdbc-5.3.8/:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/jdbi3-core-3.27.2/:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/cargo:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/javafx-web:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/apache-commons-jelly-1.0.1:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/dom4j-2.1.1:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/jaxen-1.2.0:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/stapler-1.263:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/javax-servlet-2.5:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/apache-commons-fileupload-1.4:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/saxon-xqj-9.x:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/apache-commons-beanutils:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/apache-commons-lang:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/apache-http-5:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/playframework-2.6.x:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/jaxws-api-2.0:/Users/owen-mc/workspace/code/ql/java/ql/test/stubs/apache-cxf
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<project>
2+
<modelVersion>4.0.0</modelVersion>
3+
<groupId>com.example</groupId>
4+
<artifactId>stub-generation</artifactId>
5+
<version>1.0-SNAPSHOT</version>
6+
<dependencies>
7+
<dependency>
8+
<groupId>javax.validation</groupId>
9+
<artifactId>validation-api</artifactId>
10+
<version>2.0.1.Final</version>
11+
</dependency>
12+
</dependencies>
13+
</project>

java/ql/test/stubs/javax-validation-constraints/javax/validation/Constraint.java

Lines changed: 88 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java/ql/test/stubs/javax-validation-constraints/javax/validation/Payload.java

Lines changed: 23 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)