Skip to content

Commit 43f4dd8

Browse files
committed
Consider taint through bitwise operations on PendingIntent flags
1 parent ef27023 commit 43f4dd8

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

java/ql/lib/semmle/code/java/security/ImplicitPendingIntents.qll

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,11 @@ private class MutablePendingIntentFlowStep extends ImplicitPendingIntentAddition
8585
// unless it is at least sometimes explicitly marked immutable and never marked mutable.
8686
// Note: for API level < 31, PendingIntents were mutable by default, whereas since then
8787
// they are immutable by default.
88-
not TaintTracking::localExprTaint(any(ImmutablePendingIntentFlag flag).getAnAccess(), flagArg)
88+
not bitwiseLocalTaintStep*(DataFlow::exprNode(any(ImmutablePendingIntentFlag flag)
89+
.getAnAccess()), DataFlow::exprNode(flagArg))
8990
or
90-
TaintTracking::localExprTaint(any(MutablePendingIntentFlag flag).getAnAccess(), flagArg)
91+
bitwiseLocalTaintStep*(DataFlow::exprNode(any(MutablePendingIntentFlag flag).getAnAccess()),
92+
DataFlow::exprNode(flagArg))
9193
)
9294
}
9395
}
@@ -124,3 +126,12 @@ private class PendingIntentSentSinkModels extends SinkModelCsv {
124126
]
125127
}
126128
}
129+
130+
/**
131+
* Holds if taint can flow from `source` to `sink` in one local step,
132+
* including bitwise operations.
133+
*/
134+
private predicate bitwiseLocalTaintStep(DataFlow::Node source, DataFlow::Node sink) {
135+
TaintTracking::localTaintStep(source, sink) or
136+
source.asExpr() = sink.asExpr().(BitwiseExpr).(BinaryExpr).getAnOperand()
137+
}

java/ql/test/query-tests/security/CWE-927/ImplicitPendingIntentsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ public static void testPendingIntentAsAnExtra(Context ctx)
156156
PendingIntent pi = PendingIntent.getActivity(ctx, 0, baseIntent, flag); // Sanitizer
157157
Intent fwdIntent = new Intent();
158158
fwdIntent.putExtra("fwdIntent", pi);
159-
ctx.startActivity(fwdIntent); // $ SPURIOUS: $ hasImplicitPendingIntent
159+
ctx.startActivity(fwdIntent); // Safe
160160
}
161161
}
162162

0 commit comments

Comments
 (0)