|
1 | 1 | import java
|
2 | 2 | private import semmle.code.java.dataflow.FlowSteps
|
3 | 3 | private import semmle.code.java.dataflow.ExternalFlow
|
| 4 | +private import semmle.code.java.dataflow.FlowSummary |
| 5 | +private import semmle.code.java.dataflow.DataFlow |
| 6 | +private import semmle.code.java.dataflow.TaintTracking |
| 7 | +private import semmle.code.java.dataflow.FlowSources |
4 | 8 |
|
5 | 9 | string supportKind(Callable api) {
|
6 | 10 | if api instanceof TaintPreservingCallable
|
7 | 11 | then result = "taint-preserving"
|
8 | 12 | else
|
9 |
| - if summaryModel(packageName(api), typeName(api), _, api.getName(), _, _, _, _, _) |
| 13 | + if summaryCall(api) |
10 | 14 | then result = "summary"
|
11 | 15 | else
|
12 |
| - if sinkModel(packageName(api), typeName(api), _, api.getName(), _, _, _, _) |
| 16 | + if sink(api) |
13 | 17 | then result = "sink"
|
14 | 18 | else
|
15 |
| - if sourceModel(packageName(api), typeName(api), _, api.getName(), _, _, _, _) |
| 19 | + if source(api) |
16 | 20 | then result = "source"
|
17 | 21 | else result = "?"
|
18 | 22 | }
|
19 | 23 |
|
20 |
| -private string packageName(Callable api) { |
21 |
| - result = api.getCompilationUnit().getPackage().toString() |
| 24 | +predicate summaryCall(Callable api) { |
| 25 | + api instanceof SummarizedCallable |
| 26 | + or |
| 27 | + exists(Call call, DataFlow::Node arg | |
| 28 | + call.getCallee() = api and |
| 29 | + [call.getAnArgument(), call.getQualifier()] = arg.asExpr() and |
| 30 | + TaintTracking::localAdditionalTaintStep(arg, _) |
| 31 | + ) |
22 | 32 | }
|
23 | 33 |
|
24 |
| -private string typeName(Callable api) { |
25 |
| - result = api.getDeclaringType().getAnAncestor().getSourceDeclaration().toString() |
| 34 | +predicate sink(Callable api) { |
| 35 | + exists(Call call, DataFlow::Node arg | |
| 36 | + call.getCallee() = api and |
| 37 | + [call.getAnArgument(), call.getQualifier()] = arg.asExpr() and |
| 38 | + sinkNode(arg, _) |
| 39 | + ) |
| 40 | +} |
| 41 | + |
| 42 | +predicate source(Callable api) { |
| 43 | + exists(Call call, DataFlow::Node arg | |
| 44 | + call.getCallee() = api and |
| 45 | + [call.getAnArgument(), call.getQualifier()] = arg.asExpr() and |
| 46 | + arg instanceof RemoteFlowSource |
| 47 | + ) |
26 | 48 | }
|
0 commit comments