Skip to content

Commit 0747453

Browse files
committed
Refactor SensitiveAndroidFileLeak
1 parent 685a204 commit 0747453

File tree

2 files changed

+20
-22
lines changed

2 files changed

+20
-22
lines changed

java/ql/src/experimental/Security/CWE/CWE-200/AndroidFileIntentSource.qll

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import java
44
import semmle.code.java.dataflow.FlowSources
5-
import semmle.code.java.dataflow.TaintTracking2
5+
import semmle.code.java.dataflow.TaintTracking
66
import semmle.code.java.frameworks.android.Android
77

88
/** The `startActivityForResult` method of Android's `Activity` class. */
@@ -29,36 +29,34 @@ class GetContentIntent extends ClassInstanceExpr {
2929
}
3030

3131
/** Taint configuration that identifies `GET_CONTENT` `Intent` instances passed to `startActivityForResult`. */
32-
class GetContentIntentConfig extends TaintTracking2::Configuration {
33-
GetContentIntentConfig() { this = "GetContentIntentConfig" }
32+
module GetContentIntentConfig implements DataFlow::ConfigSig {
33+
predicate isSource(DataFlow::Node src) { src.asExpr() instanceof GetContentIntent }
3434

35-
override predicate isSource(DataFlow2::Node src) { src.asExpr() instanceof GetContentIntent }
36-
37-
override predicate isSink(DataFlow2::Node sink) {
35+
predicate isSink(DataFlow::Node sink) {
3836
exists(MethodAccess ma |
3937
ma.getMethod() instanceof StartActivityForResultMethod and sink.asExpr() = ma.getArgument(0)
4038
)
4139
}
4240

43-
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet content) {
44-
super.allowImplicitRead(node, content)
45-
or
41+
predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet content) {
4642
// Allow the wrapped intent created by Intent.getChooser to be consumed
4743
// by at the sink:
48-
this.isSink(node) and
44+
isSink(node) and
4945
allowIntentExtrasImplicitRead(node, content)
5046
}
5147
}
5248

49+
module GetContentsIntentFlow = TaintTracking::Global<GetContentIntentConfig>;
50+
5351
/** A `GET_CONTENT` `Intent` instances that is passed to `startActivityForResult`. */
5452
class AndroidFileIntentInput extends DataFlow::Node {
5553
MethodAccess ma;
5654

5755
AndroidFileIntentInput() {
5856
this.asExpr() = ma.getArgument(0) and
5957
ma.getMethod() instanceof StartActivityForResultMethod and
60-
exists(GetContentIntentConfig cc, GetContentIntent gi |
61-
cc.hasFlow(DataFlow::exprNode(gi), DataFlow::exprNode(ma.getArgument(0)))
58+
exists(GetContentIntent gi |
59+
GetContentsIntentFlow::flow(DataFlow::exprNode(gi), DataFlow::exprNode(ma.getArgument(0)))
6260
)
6361
}
6462

java/ql/src/experimental/Security/CWE/CWE-200/SensitiveAndroidFileLeak.ql

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import java
1414
import semmle.code.java.controlflow.Guards
1515
import AndroidFileIntentSink
1616
import AndroidFileIntentSource
17-
import DataFlow::PathGraph
17+
import AndroidFileLeakFlow::PathGraph
1818

1919
private predicate startsWithSanitizer(Guard g, Expr e, boolean branch) {
2020
exists(MethodAccess ma |
@@ -25,16 +25,14 @@ private predicate startsWithSanitizer(Guard g, Expr e, boolean branch) {
2525
)
2626
}
2727

28-
class AndroidFileLeakConfig extends TaintTracking::Configuration {
29-
AndroidFileLeakConfig() { this = "AndroidFileLeakConfig" }
30-
28+
module AndroidFileLeakConfig implements DataFlow::ConfigSig {
3129
/**
3230
* Holds if `src` is a read of some Intent-typed variable guarded by a check like
3331
* `requestCode == someCode`, where `requestCode` is the first
3432
* argument to `Activity.onActivityResult` and `someCode` is
3533
* any request code used in a call to `startActivityForResult(intent, someCode)`.
3634
*/
37-
override predicate isSource(DataFlow::Node src) {
35+
predicate isSource(DataFlow::Node src) {
3836
exists(
3937
OnActivityForResultMethod oafr, ConditionBlock cb, CompileTimeConstantExpr cc,
4038
VarAccess intentVar
@@ -50,9 +48,9 @@ class AndroidFileLeakConfig extends TaintTracking::Configuration {
5048
}
5149

5250
/** Holds if it is a sink of file access in Android. */
53-
override predicate isSink(DataFlow::Node sink) { sink instanceof AndroidFileSink }
51+
predicate isSink(DataFlow::Node sink) { sink instanceof AndroidFileSink }
5452

55-
override predicate isAdditionalTaintStep(DataFlow::Node prev, DataFlow::Node succ) {
53+
predicate isAdditionalFlowStep(DataFlow::Node prev, DataFlow::Node succ) {
5654
exists(MethodAccess aema, AsyncTaskRunInBackgroundMethod arm |
5755
// fileAsyncTask.execute(params) will invoke doInBackground(params) of FileAsyncTask
5856
aema.getQualifier().getType() = arm.getDeclaringType() and
@@ -72,12 +70,14 @@ class AndroidFileLeakConfig extends TaintTracking::Configuration {
7270
)
7371
}
7472

75-
override predicate isSanitizer(DataFlow::Node node) {
73+
predicate isBarrier(DataFlow::Node node) {
7674
node = DataFlow::BarrierGuard<startsWithSanitizer/3>::getABarrierNode()
7775
}
7876
}
7977

80-
from DataFlow::PathNode source, DataFlow::PathNode sink, AndroidFileLeakConfig conf
81-
where conf.hasFlowPath(source, sink)
78+
module AndroidFileLeakFlow = TaintTracking::Global<AndroidFileLeakConfig>;
79+
80+
from AndroidFileLeakFlow::PathNode source, AndroidFileLeakFlow::PathNode sink
81+
where AndroidFileLeakFlow::flowPath(source, sink)
8282
select sink.getNode(), source, sink, "Leaking arbitrary Android file from $@.", source.getNode(),
8383
"this user input"

0 commit comments

Comments
 (0)