Skip to content

Commit 30f29e0

Browse files
authored
Merge pull request #4320 from aibaars/multipart-request
Java: add Spring::MultipartRequest as taint source
2 parents e660ac5 + 252f8aa commit 30f29e0

File tree

4 files changed

+45
-7
lines changed

4 files changed

+45
-7
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
lgtm,codescanning
2+
* The methods of the [Spring Web MultipartRequest](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/multipart/MultipartRequest.html)
3+
class have been added as sources of remote user input, which may lead to more results from the security queries.

java/ql/src/semmle/code/java/dataflow/FlowSources.qll

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,31 @@ private class MessageBodyReaderParameterSource extends RemoteFlowSource {
106106
override string getSourceType() { result = "MessageBodyReader parameter" }
107107
}
108108

109+
private class SpringMultipartRequestSource extends RemoteFlowSource {
110+
SpringMultipartRequestSource() {
111+
exists(MethodAccess ma, Method m |
112+
ma = this.asExpr() and
113+
m = ma.getMethod() and
114+
m
115+
.getDeclaringType()
116+
.getASourceSupertype*()
117+
.hasQualifiedName("org.springframework.web.multipart", "MultipartRequest") and
118+
m.getName().matches("get%")
119+
)
120+
}
121+
122+
override string getSourceType() { result = "Spring MultipartRequest getter" }
123+
}
124+
109125
private class SpringMultipartFileSource extends RemoteFlowSource {
110126
SpringMultipartFileSource() {
111127
exists(MethodAccess ma, Method m |
112128
ma = this.asExpr() and
113129
m = ma.getMethod() and
114-
m.getDeclaringType().hasQualifiedName("org.springframework.web.multipart", "MultipartFile") and
130+
m
131+
.getDeclaringType()
132+
.getASourceSupertype*()
133+
.hasQualifiedName("org.springframework.web.multipart", "MultipartFile") and
115134
m.getName().matches("get%")
116135
)
117136
}

java/ql/test/library-tests/dataflow/taintsources/SpringMultiPart.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import org.springframework.web.multipart.MultipartFile;
2+
import org.springframework.web.multipart.MultipartRequest;
23

34
public class SpringMultiPart {
45
MultipartFile file;
@@ -12,4 +13,13 @@ public void test() throws Exception {
1213
file.getContentType();
1314
file.getOriginalFilename();
1415
}
16+
17+
public void test(MultipartRequest request) {
18+
request.getFile("name");
19+
request.getFileMap();
20+
request.getFileNames();
21+
request.getFiles("name");
22+
request.getMultiFileMap();
23+
request.getMultipartContentType("name");
24+
}
1525
}

java/ql/test/library-tests/dataflow/taintsources/remote.expected

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,15 @@
99
| RmiFlowImpl.java:4:30:4:40 | path | RmiFlowImpl.java:5:20:5:31 | ... + ... |
1010
| RmiFlowImpl.java:4:30:4:40 | path | RmiFlowImpl.java:5:28:5:31 | path |
1111
| RmiFlowImpl.java:4:30:4:40 | path | RmiFlowImpl.java:6:29:6:35 | command |
12-
| SpringMultiPart.java:7:3:7:17 | getBytes(...) | SpringMultiPart.java:7:3:7:17 | getBytes(...) |
13-
| SpringMultiPart.java:9:3:9:23 | getInputStream(...) | SpringMultiPart.java:9:3:9:23 | getInputStream(...) |
14-
| SpringMultiPart.java:10:3:10:20 | getResource(...) | SpringMultiPart.java:10:3:10:20 | getResource(...) |
15-
| SpringMultiPart.java:11:3:11:16 | getName(...) | SpringMultiPart.java:11:3:11:16 | getName(...) |
16-
| SpringMultiPart.java:12:3:12:23 | getContentType(...) | SpringMultiPart.java:12:3:12:23 | getContentType(...) |
17-
| SpringMultiPart.java:13:3:13:28 | getOriginalFilename(...) | SpringMultiPart.java:13:3:13:28 | getOriginalFilename(...) |
12+
| SpringMultiPart.java:8:3:8:17 | getBytes(...) | SpringMultiPart.java:8:3:8:17 | getBytes(...) |
13+
| SpringMultiPart.java:10:3:10:23 | getInputStream(...) | SpringMultiPart.java:10:3:10:23 | getInputStream(...) |
14+
| SpringMultiPart.java:11:3:11:20 | getResource(...) | SpringMultiPart.java:11:3:11:20 | getResource(...) |
15+
| SpringMultiPart.java:12:3:12:16 | getName(...) | SpringMultiPart.java:12:3:12:16 | getName(...) |
16+
| SpringMultiPart.java:13:3:13:23 | getContentType(...) | SpringMultiPart.java:13:3:13:23 | getContentType(...) |
17+
| SpringMultiPart.java:14:3:14:28 | getOriginalFilename(...) | SpringMultiPart.java:14:3:14:28 | getOriginalFilename(...) |
18+
| SpringMultiPart.java:18:3:18:25 | getFile(...) | SpringMultiPart.java:18:3:18:25 | getFile(...) |
19+
| SpringMultiPart.java:19:3:19:22 | getFileMap(...) | SpringMultiPart.java:19:3:19:22 | getFileMap(...) |
20+
| SpringMultiPart.java:20:3:20:24 | getFileNames(...) | SpringMultiPart.java:20:3:20:24 | getFileNames(...) |
21+
| SpringMultiPart.java:21:3:21:26 | getFiles(...) | SpringMultiPart.java:21:3:21:26 | getFiles(...) |
22+
| SpringMultiPart.java:22:3:22:27 | getMultiFileMap(...) | SpringMultiPart.java:22:3:22:27 | getMultiFileMap(...) |
23+
| SpringMultiPart.java:23:3:23:41 | getMultipartContentType(...) | SpringMultiPart.java:23:3:23:41 | getMultipartContentType(...) |

0 commit comments

Comments
 (0)