Skip to content

Commit c687dcb

Browse files
committed
Java: Sync files and make language specific implementation.
1 parent 30249e4 commit c687dcb

File tree

8 files changed

+65
-45
lines changed

8 files changed

+65
-45
lines changed

java/ql/src/utils/modelgenerator/CaptureNeutralModels.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99
import internal.CaptureModels
1010
import internal.CaptureSummaryFlowQuery
1111

12-
from DataFlowTargetApi api, string noflow
12+
from DataFlowSummaryTargetApi api, string noflow
1313
where noflow = captureNoFlow(api)
1414
select noflow order by noflow

java/ql/src/utils/modelgenerator/CaptureSinkModels.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88

99
import internal.CaptureModels
1010

11-
from DataFlowTargetApi api, string sink
11+
from DataFlowSinkTargetApi api, string sink
1212
where sink = captureSink(api)
1313
select sink order by sink

java/ql/src/utils/modelgenerator/CaptureSourceModels.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88

99
import internal.CaptureModels
1010

11-
from DataFlowTargetApi api, string source
11+
from DataFlowSourceTargetApi api, string source
1212
where source = captureSource(api)
1313
select source order by source

java/ql/src/utils/modelgenerator/CaptureSummaryModels.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99
import internal.CaptureModels
1010
import internal.CaptureSummaryFlowQuery
1111

12-
from DataFlowTargetApi api, string flow
12+
from DataFlowSummaryTargetApi api, string flow
1313
where flow = captureFlow(api)
1414
select flow order by flow

java/ql/src/utils/modelgenerator/internal/CaptureModels.qll

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,16 @@ private class ReturnNodeExt extends DataFlow::Node {
2929
}
3030
}
3131

32-
class DataFlowTargetApi extends TargetApiSpecific {
33-
DataFlowTargetApi() { not isUninterestingForDataFlowModels(this) }
32+
class DataFlowSummaryTargetApi extends SummaryTargetApi {
33+
DataFlowSummaryTargetApi() { not isUninterestingForDataFlowModels(this) }
3434
}
3535

36+
class DataFlowSourceTargetApi = SourceTargetApi;
37+
38+
class DataFlowSinkTargetApi = SinkTargetApi;
39+
3640
private module ModelPrintingInput implements ModelPrintingSig {
37-
class Api = DataFlowTargetApi;
41+
class Api = TargetApiBase;
3842

3943
string getProvenance() { result = "df-generated" }
4044
}
@@ -89,7 +93,7 @@ string asInputArgument(DataFlow::Node source) { result = asInputArgumentSpecific
8993
/**
9094
* Gets the summary model of `api`, if it follows the `fluent` programming pattern (returns `this`).
9195
*/
92-
string captureQualifierFlow(TargetApiSpecific api) {
96+
string captureQualifierFlow(DataFlowSummaryTargetApi api) {
9397
exists(ReturnNodeExt ret |
9498
api = returnNodeEnclosingCallable(ret) and
9599
isOwnInstanceAccessNode(ret)
@@ -150,7 +154,7 @@ module PropagateFlowConfig implements DataFlow::StateConfigSig {
150154

151155
predicate isSource(DataFlow::Node source, FlowState state) {
152156
source instanceof DataFlow::ParameterNode and
153-
source.getEnclosingCallable() instanceof DataFlowTargetApi and
157+
source.getEnclosingCallable() instanceof DataFlowSummaryTargetApi and
154158
state.(TaintRead).getStep() = 0
155159
}
156160

@@ -195,7 +199,7 @@ private module PropagateFlow = TaintTracking::GlobalWithState<PropagateFlowConfi
195199
/**
196200
* Gets the summary model(s) of `api`, if there is flow from parameters to return value or parameter.
197201
*/
198-
string captureThroughFlow(DataFlowTargetApi api) {
202+
string captureThroughFlow(DataFlowSummaryTargetApi api) {
199203
exists(DataFlow::ParameterNode p, ReturnNodeExt returnNodeExt, string input, string output |
200204
PropagateFlow::flow(p, returnNodeExt) and
201205
returnNodeExt.(DataFlow::Node).getEnclosingCallable() = api and
@@ -222,10 +226,8 @@ module PropagateFromSourceConfig implements DataFlow::ConfigSig {
222226
}
223227

224228
predicate isSink(DataFlow::Node sink) {
225-
exists(DataFlowTargetApi c |
226-
sink instanceof ReturnNodeExt and
227-
sink.getEnclosingCallable() = c
228-
)
229+
sink instanceof ReturnNodeExt and
230+
sink.getEnclosingCallable() instanceof DataFlowSourceTargetApi
229231
}
230232

231233
DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSinkCallContext }
@@ -244,7 +246,7 @@ private module PropagateFromSource = TaintTracking::Global<PropagateFromSourceCo
244246
/**
245247
* Gets the source model(s) of `api`, if there is flow from an existing known source to the return of `api`.
246248
*/
247-
string captureSource(DataFlowTargetApi api) {
249+
string captureSource(DataFlowSourceTargetApi api) {
248250
exists(DataFlow::Node source, ReturnNodeExt sink, string kind |
249251
PropagateFromSource::flow(source, sink) and
250252
ExternalFlow::sourceNode(source, kind) and
@@ -262,7 +264,9 @@ string captureSource(DataFlowTargetApi api) {
262264
* into an existing known sink (then the API itself becomes a sink).
263265
*/
264266
module PropagateToSinkConfig implements DataFlow::ConfigSig {
265-
predicate isSource(DataFlow::Node source) { apiSource(source) }
267+
predicate isSource(DataFlow::Node source) {
268+
apiSource(source) and source.getEnclosingCallable() instanceof DataFlowSinkTargetApi
269+
}
266270

267271
predicate isSink(DataFlow::Node sink) {
268272
exists(string kind | isRelevantSinkKind(kind) and ExternalFlow::sinkNode(sink, kind))
@@ -286,7 +290,7 @@ private module PropagateToSink = TaintTracking::Global<PropagateToSinkConfig>;
286290
/**
287291
* Gets the sink model(s) of `api`, if there is flow from a parameter to an existing known sink.
288292
*/
289-
string captureSink(DataFlowTargetApi api) {
293+
string captureSink(DataFlowSinkTargetApi api) {
290294
exists(DataFlow::Node src, DataFlow::Node sink, string kind |
291295
PropagateToSink::flow(src, sink) and
292296
ExternalFlow::sinkNode(sink, kind) and

java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,21 @@ private J::Callable liftedImpl(J::Callable m) {
5858
not exists(getARelevantOverride(result))
5959
}
6060

61-
private predicate hasManualModel(Callable api) {
61+
private predicate hasManualSummaryModel(Callable api) {
6262
api = any(FlowSummaryImpl::Public::SummarizedCallable sc | sc.applyManualModel()).asCallable() or
6363
api = any(FlowSummaryImpl::Public::NeutralSummaryCallable sc | sc.hasManualModel()).asCallable()
6464
}
6565

66+
private predicate hasManualSourceModel(Callable api) {
67+
api = any(ExternalFlow::SourceCallable sc | sc.hasManualModel()) or
68+
api = any(FlowSummaryImpl::Public::NeutralSourceCallable sc | sc.hasManualModel()).asCallable()
69+
}
70+
71+
private predicate hasManualSinkModel(Callable api) {
72+
api = any(ExternalFlow::SinkCallable sc | sc.hasManualModel()) or
73+
api = any(FlowSummaryImpl::Public::NeutralSinkCallable sc | sc.hasManualModel()).asCallable()
74+
}
75+
6676
/**
6777
* Holds if it is irrelevant to generate models for `api` based on data flow analysis.
6878
*
@@ -72,6 +82,28 @@ predicate isUninterestingForDataFlowModels(Callable api) {
7282
api.getDeclaringType() instanceof J::Interface and not exists(api.getBody())
7383
}
7484

85+
/**
86+
* A class of callables that are potentially relevant for generating summary and
87+
* neutral models.
88+
*/
89+
class SummaryTargetApi extends TargetApiBase {
90+
SummaryTargetApi() { not hasManualSummaryModel(this.lift()) }
91+
}
92+
93+
/**
94+
* A class of callables that are potentially relevant for generating sink models.
95+
*/
96+
class SinkTargetApi extends TargetApiBase {
97+
SinkTargetApi() { not hasManualSinkModel(this.lift()) }
98+
}
99+
100+
/**
101+
* A class of callables that are potentially relevant for generating source models.
102+
*/
103+
class SourceTargetApi extends TargetApiBase {
104+
SourceTargetApi() { not hasManualSourceModel(this.lift()) }
105+
}
106+
75107
/**
76108
* Holds if it is irrelevant to generate models for `api` based on type-based analysis.
77109
*
@@ -86,13 +118,10 @@ predicate isUninterestingForTypeBasedFlowModels(Callable api) { none() }
86118
* In the Standard library and 3rd party libraries it is the callables (or callables that have a
87119
* super implementation) that can be called from outside the library itself.
88120
*/
89-
class TargetApiSpecific extends Callable {
121+
class TargetApiBase extends Callable {
90122
private Callable lift;
91123

92-
TargetApiSpecific() {
93-
lift = liftedImpl(this) and
94-
not hasManualModel(lift)
95-
}
124+
TargetApiBase() { lift = liftedImpl(this) }
96125

97126
/**
98127
* Gets the callable that a model will be lifted to.
@@ -222,15 +251,6 @@ predicate sinkModelSanitizer(DataFlow::Node node) {
222251
)
223252
}
224253

225-
private class ManualNeutralSinkCallable extends Callable {
226-
ManualNeutralSinkCallable() {
227-
this =
228-
any(FlowSummaryImpl::Public::NeutralCallable nc |
229-
nc.hasManualModel() and nc.getKind() = "sink"
230-
).asCallable()
231-
}
232-
}
233-
234254
/**
235255
* Holds if `source` is an api entrypoint relevant for creating sink models.
236256
*/
@@ -239,22 +259,18 @@ predicate apiSource(DataFlow::Node source) {
239259
source.asExpr().(J::FieldAccess).isOwnFieldAccess() or
240260
source instanceof DataFlow::ParameterNode
241261
) and
242-
exists(Callable enclosing | enclosing = source.getEnclosingCallable() |
243-
exists(liftedImpl(enclosing)) and
244-
not enclosing instanceof ManualNeutralSinkCallable and
245-
exists(J::RefType t |
246-
t = enclosing.getDeclaringType().getAnAncestor() and
247-
not t instanceof J::TypeObject and
248-
t.isPublic()
249-
)
262+
exists(J::RefType t |
263+
t = source.getEnclosingCallable().getDeclaringType().getAnAncestor() and
264+
not t instanceof J::TypeObject and
265+
t.isPublic()
250266
)
251267
}
252268

253269
/**
254270
* Holds if it is not relevant to generate a source model for `api`, even
255271
* if flow is detected from a node within `source` to a sink within `api`.
256272
*/
257-
predicate irrelevantSourceSinkApi(Callable source, TargetApiSpecific api) { none() }
273+
predicate irrelevantSourceSinkApi(Callable source, SourceTargetApi api) { none() }
258274

259275
/**
260276
* Gets the MaD input string representation of `source`.

java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlowQuery.qll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ private import CaptureModels
6767
* Captured Model:
6868
* ```p;Foo;true;addToList;;Argument[0];Argument[1];taint;df-generated```
6969
*/
70-
string captureFlow(DataFlowTargetApi api) {
70+
string captureFlow(DataFlowSummaryTargetApi api) {
7171
result = captureQualifierFlow(api) or
7272
result = captureThroughFlow(api)
7373
}
@@ -77,8 +77,8 @@ string captureFlow(DataFlowTargetApi api) {
7777
* A neutral summary model is generated, if we are not generating
7878
* a summary model that applies to `api`.
7979
*/
80-
string captureNoFlow(DataFlowTargetApi api) {
81-
not exists(DataFlowTargetApi api0 | exists(captureFlow(api0)) and api0.lift() = api.lift()) and
80+
string captureNoFlow(DataFlowSummaryTargetApi api) {
81+
not exists(DataFlowSummaryTargetApi api0 | exists(captureFlow(api0)) and api0.lift() = api.lift()) and
8282
api.isRelevant() and
8383
result = Printing::asNeutralSummaryModel(api)
8484
}

java/ql/src/utils/modelgenerator/internal/CaptureTypeBasedSummaryModels.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ private module Printing = ModelPrinting<ModelPrintingInput>;
295295
* A class of callables that are relevant generating summaries for based
296296
* on the Theorems for Free approach.
297297
*/
298-
class TypeBasedFlowTargetApi extends Specific::TargetApiSpecific {
298+
class TypeBasedFlowTargetApi extends Specific::SummaryTargetApi {
299299
TypeBasedFlowTargetApi() { not Specific::isUninterestingForTypeBasedFlowModels(this) }
300300

301301
/**

0 commit comments

Comments
 (0)