Skip to content

Commit e0b0f91

Browse files
committed
Add TempDir taint tracking for Files.write
1 parent d53d77c commit e0b0f91

File tree

2 files changed

+48
-10
lines changed

2 files changed

+48
-10
lines changed

java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure2.ql

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import TempDirUtils
1313
import DataFlow::PathGraph
1414

15-
private class MethodFileSystemCreation extends Method {
16-
MethodFileSystemCreation() {
15+
private class MethodFileSystemFileCreation extends Method {
16+
MethodFileSystemFileCreation() {
1717
getDeclaringType() instanceof TypeFile and
1818
(
1919
hasName("mkdir") or
@@ -22,6 +22,33 @@ private class MethodFileSystemCreation extends Method {
2222
}
2323
}
2424

25+
private class MethodFilesSystemFileCreation extends Method {
26+
MethodFilesSystemFileCreation() {
27+
getDeclaringType().hasQualifiedName("java.nio.file", "Files") and
28+
hasName("write")
29+
}
30+
}
31+
32+
private abstract class FileCreationSink extends DataFlow::Node {}
33+
34+
private class FileFileCreationSink extends FileCreationSink {
35+
FileFileCreationSink() {
36+
exists(MethodAccess ma |
37+
ma.getMethod() instanceof MethodFileSystemFileCreation and
38+
ma.getQualifier() = this.asExpr()
39+
)
40+
}
41+
}
42+
43+
private class FilesFileCreationSink extends FileCreationSink {
44+
FilesFileCreationSink() {
45+
exists(MethodAccess ma |
46+
ma.getMethod() instanceof MethodFilesSystemFileCreation and
47+
ma.getArgument(0) = this.asExpr()
48+
)
49+
}
50+
}
51+
2552
private class TempDirSystemGetPropertyToCreateConfig extends TaintTracking::Configuration {
2653
TempDirSystemGetPropertyToCreateConfig() { this = "TempDirSystemGetPropertyToCreateConfig" }
2754

@@ -34,15 +61,12 @@ private class TempDirSystemGetPropertyToCreateConfig extends TaintTracking::Conf
3461
}
3562

3663
override predicate isSink(DataFlow::Node sink) {
37-
exists (MethodAccess ma |
38-
ma.getMethod() instanceof MethodFileSystemCreation and
39-
ma.getQualifier() = sink.asExpr()
40-
)
64+
sink instanceof FileCreationSink
4165
}
4266
}
4367

4468
from DataFlow::PathNode source, DataFlow::PathNode sink, TempDirSystemGetPropertyToCreateConfig conf
4569
where conf.hasFlowPath(source, sink)
4670
select source.getNode(), source, sink,
47-
"Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users.", source.getNode(),
48-
"system temp directory"
71+
"Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users.",
72+
source.getNode(), "system temp directory"

java/ql/test/query-tests/security/CWE-200/semmle/tests/Test.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11

2+
import java.util.Arrays;
23
import java.io.File;
3-
import com.google.common.io.Files;
4+
import java.nio.file.Files;
5+
import java.nio.charset.StandardCharsets;
6+
import java.nio.file.StandardOpenOption;
47

58
public class Test {
69

@@ -39,12 +42,23 @@ void safeFileCreateTempFileTainted() {
3942
}
4043

4144
void vulnerableGuavaFilesCreateTempDir() {
42-
File tempDir = Files.createTempDir();
45+
File tempDir = com.google.common.io.Files.createTempDir();
4346
}
4447

4548
void vulnerableFileCreateTempFileMkdirTainted() {
4649
File tempDirChild = new File(System.getProperty("java.io.tmpdir"), "/child");
4750
tempDirChild.mkdir();
4851
}
52+
53+
void vulnerableFileCreateTempFilesWrite1() {
54+
File tempDirChild = new File(System.getProperty("java.io.tmpdir"), "/child");
55+
Files.write(tempDirChild.toPath(), Arrays.asList("secret"), StandardCharsets.UTF_8, StandardOpenOption.CREATE);
56+
}
4957

58+
void vulnerableFileCreateTempFilesWrite2() {
59+
File tempDirChild = new File(System.getProperty("java.io.tmpdir"), "/child");
60+
String secret = "secret";
61+
byte[] byteArrray = secret.getBytes();
62+
Files.write(tempDirChild.toPath(), byteArrray, StandardOpenOption.CREATE);
63+
}
5064
}

0 commit comments

Comments
 (0)