@@ -30,70 +30,72 @@ class SendBroadcastMethodAccess extends MethodAccess {
30
30
}
31
31
}
32
32
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
+ )
41
41
}
42
42
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
47
47
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
+ )
53
51
}
54
52
55
53
/**
56
54
* Holds if a `sendBroadcast` call doesn't specify receiver permission.
57
55
*/
58
56
predicate isSensitiveBroadcastSink ( DataFlow:: Node sink ) {
59
- exists ( SendBroadcastMethodAccess ma |
57
+ exists ( SendBroadcastMethodAccess ma , string name | ma . getMethod ( ) . hasName ( name ) |
60
58
sink .asExpr ( ) = ma .getAnArgument ( ) and
61
59
(
62
- ma . getMethod ( ) . hasName ( "sendBroadcast" ) and
60
+ name = "sendBroadcast" and
63
61
(
64
- ma .getNumArgument ( ) = 1 // sendBroadcast(Intent intent)
62
+ // sendBroadcast(Intent intent)
63
+ ma .getNumArgument ( ) = 1
65
64
or
66
65
// sendBroadcast(Intent intent, String receiverPermission)
67
- exists ( NullArgFlowConfig conf | conf . hasFlow ( _ , DataFlow :: exprNode ( ma .getArgument ( 1 ) ) ) )
66
+ isNullArg ( ma .getArgument ( 1 ) )
68
67
)
69
68
or
70
- ma . getMethod ( ) . hasName ( "sendBroadcastAsUser" ) and
69
+ name = "sendBroadcastAsUser" and
71
70
(
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 ) )
74
76
)
75
77
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 ) )
80
81
or
81
82
// Method calls of `sendOrderedBroadcast` whose second argument is always `receiverPermission`
82
- ma . getMethod ( ) . hasName ( "sendOrderedBroadcast" ) and
83
+ name = "sendOrderedBroadcast" and
83
84
(
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
86
88
ma .getNumArgument ( ) <= 7
87
89
or
88
90
// 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
91
93
ma .getNumArgument ( ) = 8
92
94
)
93
95
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 ) )
97
99
)
98
100
)
99
101
}
0 commit comments