@@ -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 */
5856predicate 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