Skip to content

Commit ef7125e

Browse files
Simplify sink definitions using local flow
1 parent d7c7776 commit ef7125e

File tree

1 file changed

+38
-36
lines changed

1 file changed

+38
-36
lines changed

java/ql/src/semmle/code/java/security/AndroidSensitiveBroadcastQuery.qll

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -30,70 +30,72 @@ class SendBroadcastMethodAccess extends MethodAccess {
3030
}
3131
}
3232

33-
private class NullArgFlowConfig extends DataFlow2::Configuration {
34-
NullArgFlowConfig() { this = "Flow configuration with a null argument" }
35-
36-
override predicate isSource(DataFlow::Node src) { src.asExpr() instanceof NullLiteral }
37-
38-
override predicate isSink(DataFlow::Node sink) {
39-
exists(SendBroadcastMethodAccess ma | sink.asExpr() = ma.getAnArgument())
40-
}
33+
private predicate isNullArg(Expr ex) {
34+
exists(DataFlow::Node src, DataFlow::Node sink, SendBroadcastMethodAccess ma |
35+
ex = ma.getAnArgument() and
36+
sink.asExpr() = ex and
37+
src.asExpr() instanceof NullLiteral
38+
|
39+
DataFlow::localFlow(src, sink)
40+
)
4141
}
4242

43-
private class EmptyArrayArgFlowConfig extends DataFlow3::Configuration {
44-
EmptyArrayArgFlowConfig() { this = "Flow configuration with an empty array argument" }
45-
46-
override predicate isSource(DataFlow::Node src) {
43+
private predicate isEmptyArrayArg(Expr ex) {
44+
exists(DataFlow::Node src, DataFlow::Node sink, SendBroadcastMethodAccess ma |
45+
ex = ma.getAnArgument() and
46+
sink.asExpr() = ex and
4747
src.asExpr().(ArrayCreationExpr).getFirstDimensionSize() = 0
48-
}
49-
50-
override predicate isSink(DataFlow::Node sink) {
51-
exists(SendBroadcastMethodAccess ma | sink.asExpr() = ma.getAnArgument())
52-
}
48+
|
49+
DataFlow::localFlow(src, sink)
50+
)
5351
}
5452

5553
/**
5654
* Holds if a `sendBroadcast` call doesn't specify receiver permission.
5755
*/
5856
predicate isSensitiveBroadcastSink(DataFlow::Node sink) {
59-
exists(SendBroadcastMethodAccess ma |
57+
exists(SendBroadcastMethodAccess ma, string name | ma.getMethod().hasName(name) |
6058
sink.asExpr() = ma.getAnArgument() and
6159
(
62-
ma.getMethod().hasName("sendBroadcast") and
60+
name = "sendBroadcast" and
6361
(
64-
ma.getNumArgument() = 1 // sendBroadcast(Intent intent)
62+
// sendBroadcast(Intent intent)
63+
ma.getNumArgument() = 1
6564
or
6665
// sendBroadcast(Intent intent, String receiverPermission)
67-
exists(NullArgFlowConfig conf | conf.hasFlow(_, DataFlow::exprNode(ma.getArgument(1))))
66+
isNullArg(ma.getArgument(1))
6867
)
6968
or
70-
ma.getMethod().hasName("sendBroadcastAsUser") and
69+
name = "sendBroadcastAsUser" and
7170
(
72-
ma.getNumArgument() = 2 or // sendBroadcastAsUser(Intent intent, UserHandle user)
73-
exists(NullArgFlowConfig conf | conf.hasFlow(_, DataFlow::exprNode(ma.getArgument(2)))) // sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission)
71+
// sendBroadcastAsUser(Intent intent, UserHandle user)
72+
ma.getNumArgument() = 2
73+
or
74+
// sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission)
75+
isNullArg(ma.getArgument(2))
7476
)
7577
or
76-
ma.getMethod().hasName("sendBroadcastWithMultiplePermissions") and
77-
exists(EmptyArrayArgFlowConfig config |
78-
config.hasFlow(_, DataFlow::exprNode(ma.getArgument(1))) // sendBroadcastWithMultiplePermissions(Intent intent, String[] receiverPermissions)
79-
)
78+
// sendBroadcastWithMultiplePermissions(Intent intent, String[] receiverPermissions)
79+
name = "sendBroadcastWithMultiplePermissions" and
80+
isEmptyArrayArg(ma.getArgument(1))
8081
or
8182
// Method calls of `sendOrderedBroadcast` whose second argument is always `receiverPermission`
82-
ma.getMethod().hasName("sendOrderedBroadcast") and
83+
name = "sendOrderedBroadcast" and
8384
(
84-
// sendOrderedBroadcast(Intent intent, String receiverPermission) or sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
85-
exists(NullArgFlowConfig conf | conf.hasFlow(_, DataFlow::exprNode(ma.getArgument(1)))) and
85+
// sendOrderedBroadcast(Intent intent, String receiverPermission)
86+
// sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
87+
isNullArg(ma.getArgument(1)) and
8688
ma.getNumArgument() <= 7
8789
or
8890
// sendOrderedBroadcast(Intent intent, String receiverPermission, String receiverAppOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
89-
exists(NullArgFlowConfig conf | conf.hasFlow(_, DataFlow::exprNode(ma.getArgument(1)))) and
90-
exists(NullArgFlowConfig conf | conf.hasFlow(_, DataFlow::exprNode(ma.getArgument(2)))) and
91+
isNullArg(ma.getArgument(1)) and
92+
isNullArg(ma.getArgument(2)) and
9193
ma.getNumArgument() = 8
9294
)
9395
or
94-
// Method call of `sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)`
95-
ma.getMethod().hasName("sendOrderedBroadcastAsUser") and
96-
exists(NullArgFlowConfig conf | conf.hasFlow(_, DataFlow::exprNode(ma.getArgument(2))))
96+
// sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
97+
name = "sendOrderedBroadcastAsUser" and
98+
isNullArg(ma.getArgument(2))
9799
)
98100
)
99101
}

0 commit comments

Comments
 (0)