Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f9fea15

Browse files
author
Benjamin Muskalla
committed
Initial support for capturing sink models
1 parent 364de55 commit f9fea15

5 files changed

Lines changed: 81 additions & 3 deletions

File tree

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import java
2+
import Telemetry.ExternalAPI
3+
import semmle.code.java.dataflow.DataFlow
4+
import semmle.code.java.dataflow.TaintTracking
5+
import semmle.code.java.dataflow.ExternalFlow
6+
import ModelGeneratorUtils
7+
8+
class Configuration extends TaintTracking::Configuration {
9+
Configuration() { this = "public methods calling sinks" }
10+
11+
override predicate isSource(DataFlow::Node source) {
12+
exists(MethodAccess ma |
13+
ma = source.asExpr() and
14+
ma.getAnEnclosingStmt().getEnclosingCallable().isPublic() and
15+
ma.getAnEnclosingStmt().getEnclosingCallable().fromSource()
16+
)
17+
}
18+
19+
override predicate isSink(DataFlow::Node sink) { sinkNode(sink, _) }
20+
}
21+
22+
string asInputArgument(Expr source) { result = "Argument[" + source.(Argument).getPosition() + "]" }
23+
24+
string captureSink(Callable api) {
25+
exists(DataFlow::Node src, DataFlow::Node sink, Configuration config, string kind |
26+
config.hasFlow(src, sink) and
27+
sinkNode(sink, kind) and
28+
api = src.asExpr().getEnclosingCallable() and
29+
result = asSinkModel(api, asInputArgument(src.asExpr()), kind)
30+
)
31+
}
32+
33+
from Callable api, string sink
34+
where
35+
sink = captureSink(api) and
36+
not api.getCompilationUnit().getFile().getAbsolutePath().matches("%src/test/%")
37+
select sink order by sink

java/ql/src/utils/model-generator/ModelGeneratorUtils.qll

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,30 @@ string asValueModel(Callable api, string input, string output) {
1616

1717
bindingset[input, output, kind]
1818
string asSummaryModel(Callable api, string input, string output, string kind) {
19+
result =
20+
asPartialModel(api) + input + ";" //
21+
+ output + ";" //
22+
+ kind + ";" //
23+
}
24+
25+
bindingset[input, kind]
26+
string asSinkModel(Callable api, string input, string kind) {
27+
result =
28+
asPartialModel(api) + input + ";" //
29+
+ kind + ";" //
30+
}
31+
32+
/**
33+
* Computes the first 6 columns for CSV rows.
34+
*/
35+
private string asPartialModel(Callable api) {
1936
result =
2037
api.getCompilationUnit().getPackage().getName() + ";" //
2138
+ api.getDeclaringType().nestedName() + ";" //
2239
+ isExtensible(api.getDeclaringType()).toString() + ";" //
2340
+ api.getName() + ";" //
2441
+ paramsString(api) + ";" //
2542
+ /* ext + */ ";" //
26-
+ input + ";" //
27-
+ output + ";" //
28-
+ kind + ";" //
2943
}
3044

3145
string parameterAccess(Parameter p) {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| p;Sinks;true;copyFileToDirectory;(Path,Path,CopyOption[]);;Argument[1];create-file; |
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
utils/model-generator/CaptureSinkModels.ql
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package p;
2+
3+
import java.io.IOException;
4+
import java.io.InputStream;
5+
import java.net.URL;
6+
import java.nio.file.CopyOption;
7+
import java.nio.charset.Charset;
8+
import java.nio.file.Files;
9+
import java.nio.file.Path;
10+
11+
public class Sinks {
12+
13+
public Path copyFileToDirectory(final Path sourceFile, final Path targetDirectory, final CopyOption... copyOptions) throws IOException {
14+
return Files.copy(sourceFile, targetDirectory.resolve(sourceFile.getFileName()), copyOptions);
15+
}
16+
17+
// TODO: not detected
18+
public String readUrl(final URL url, Charset encoding) throws IOException {
19+
try (InputStream in = url.openStream()) {
20+
byte[] bytes = in.readAllBytes();
21+
return new String(bytes, encoding);
22+
}
23+
}
24+
25+
}

0 commit comments

Comments
 (0)