@@ -31,6 +31,18 @@ abstract class IntentUriPermissionManipulationSanitizer extends DataFlow::Node {
31
31
*/
32
32
abstract class IntentUriPermissionManipulationGuard extends DataFlow:: BarrierGuard { }
33
33
34
+ /**
35
+ * An additional taint step for flows related to Intent URI permission manipulation
36
+ * vulnerabilities.
37
+ */
38
+ class IntentUriPermissionManipulationAdditionalTaintStep extends Unit {
39
+ /**
40
+ * Holds if the step from `node1` to `node2` should be considered a taint
41
+ * step for flows related to Intent URI permission manipulation vulnerabilities.
42
+ */
43
+ abstract predicate step ( DataFlow:: Node node1 , DataFlow:: Node node2 ) ;
44
+ }
45
+
34
46
private class DefaultIntentUriPermissionManipulationSink extends IntentUriPermissionManipulationSink {
35
47
DefaultIntentUriPermissionManipulationSink ( ) {
36
48
exists ( MethodAccess ma | ma .getMethod ( ) instanceof ActivitySetResultMethod |
@@ -55,14 +67,11 @@ private class IntentFlagsOrDataChangedSanitizer extends IntentUriPermissionManip
55
67
this .asExpr ( ) = ma .getQualifier ( )
56
68
|
57
69
m .hasName ( "removeFlags" ) and
58
- TaintTracking:: localExprTaint ( any ( GrantReadUriPermissionFlag f ) .getAnAccess ( ) ,
59
- ma .getArgument ( 0 ) ) and
60
- TaintTracking:: localExprTaint ( any ( GrantWriteUriPermissionFlag f ) .getAnAccess ( ) ,
61
- ma .getArgument ( 0 ) )
70
+ bitwiseLocalTaintStep * ( any ( GrantReadUriPermissionFlag f ) .getAnAccess ( ) , ma .getArgument ( 0 ) ) and
71
+ bitwiseLocalTaintStep * ( any ( GrantWriteUriPermissionFlag f ) .getAnAccess ( ) , ma .getArgument ( 0 ) )
62
72
or
63
73
m .hasName ( "setFlags" ) and
64
- not TaintTracking:: localExprTaint ( any ( GrantUriPermissionFlag f ) .getAnAccess ( ) ,
65
- ma .getArgument ( 0 ) )
74
+ not bitwiseLocalTaintStep * ( any ( GrantUriPermissionFlag f ) .getAnAccess ( ) , ma .getArgument ( 0 ) )
66
75
or
67
76
m .hasName ( "setData" )
68
77
)
@@ -101,7 +110,7 @@ private predicate intentFlagsOrDataChecked(Guard g, Expr intent, boolean branch)
101
110
ma .getMethod ( ) = m and
102
111
m .getDeclaringType ( ) instanceof TypeIntent and
103
112
m .hasName ( [ "getFlags" , "getData" ] ) and
104
- TaintTracking :: localExprTaint ( ma , checkedValue )
113
+ bitwiseLocalTaintStep * ( ma , checkedValue )
105
114
|
106
115
bitwiseCheck ( g , branch ) and
107
116
checkedValue = g .( EqualityTest ) .getAnOperand ( ) .( AndBitwiseExpr )
@@ -123,3 +132,12 @@ private predicate bitwiseCheck(Guard g, boolean branch) {
123
132
else g .( EqualityTest ) .polarity ( ) .booleanNot ( ) = branch
124
133
)
125
134
}
135
+
136
+ /**
137
+ * Holds if taint can flow from `source` to `sink` in one local step,
138
+ * including bitwise operations.
139
+ */
140
+ private predicate bitwiseLocalTaintStep ( Expr source , Expr sink ) {
141
+ TaintTracking:: localTaintStep ( DataFlow:: exprNode ( source ) , DataFlow:: exprNode ( sink ) ) or
142
+ source = sink .( BinaryExpr ) .getAnOperand ( )
143
+ }
0 commit comments