Skip to content

Commit 121780c

Browse files
Jami CogswellJami Cogswell
authored andcommitted
Java: add File.getName as a path injection sanitizer
1 parent ccfb32e commit 121780c

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

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

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

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

Lines changed: 15 additions & 0 deletions
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)