Skip to content

Commit 538dee8

Browse files
authored
Merge pull request #18214 from jcogs33/jcogs33/java/file-getname-path-sanitizer
Java: add File.getName as a path injection sanitizer
2 parents 066cfa3 + 214da9e commit 538dee8

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Added `java.io.File.getName()` as a path injection sanitizer.

java/ql/lib/semmle/code/java/security/PathSanitizer.qll

+15
Original file line numberDiff line numberDiff line change
@@ -337,3 +337,18 @@ private Method getSourceMethod(Method m) {
337337
not exists(Method src | m = src.getKotlinParameterDefaultsProxy()) and
338338
result = m
339339
}
340+
341+
/**
342+
* A sanitizer that protects against path injection vulnerabilities
343+
* by extracting the final component of the user provided path.
344+
*
345+
* TODO: convert this class to models-as-data if sanitizer support is added
346+
*/
347+
private class FileGetNameSanitizer extends PathInjectionSanitizer {
348+
FileGetNameSanitizer() {
349+
exists(MethodCall mc |
350+
mc.getMethod().hasQualifiedName("java.io", "File", "getName") and
351+
this.asExpr() = mc
352+
)
353+
}
354+
}

java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java

+15
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,19 @@ public void sendUserFileGood3(Socket sock, String user) throws Exception {
7171
fileLine = fileReader.readLine();
7272
}
7373
}
74+
75+
public void sendUserFileGood4(Socket sock, String user) throws IOException {
76+
BufferedReader filenameReader =
77+
new BufferedReader(new InputStreamReader(sock.getInputStream(), "UTF-8"));
78+
String filename = filenameReader.readLine();
79+
File file = new File(filename);
80+
String baseName = file.getName();
81+
// GOOD: only use the final component of the user provided path
82+
BufferedReader fileReader = new BufferedReader(new FileReader(baseName));
83+
String fileLine = fileReader.readLine();
84+
while (fileLine != null) {
85+
sock.getOutputStream().write(fileLine.getBytes());
86+
fileLine = fileReader.readLine();
87+
}
88+
}
7489
}

0 commit comments

Comments
 (0)