Make mutable PendingIntent explicit

Starting from target SDK U, we will block creation of mutable
PendingIntents with implicit Intents because attackers can mutate the
Intent object within and launch altered behavior on behalf of victim
apps. For more details on the vulnerability, see go/pendingintent-rca.

From a quick analysis, we concluded that the PendingIntent here was only
destined to the test app/to the app, so it was made explicit. Reviewers,
please call out if this is not the case.

Bug: 236704164
Bug: 229362273
Test: atest OverlayManagerPerfTest
Test: atest CtsPackageInstallTestCases
Test: atest NotificationManagerServiceTest
Change-Id: I56cc8c1852caffadae424e08d7719f58779bab11
This commit is contained in:
Azhara Assanova
2023-01-11 15:38:31 +00:00
parent 397065c0f1
commit 1efd9a0405
3 changed files with 7 additions and 5 deletions

View File

@@ -133,9 +133,9 @@ public class TestPackageInstaller {
mContext.registerReceiver(this, filter,
Context.RECEIVER_EXPORTED_UNAUDITED);
Intent intent = new Intent(action);
Intent intent = new Intent(action).setPackage(mContext.getPackageName());
PendingIntent pending = PendingIntent.getBroadcast(mContext, sessionId, intent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE_UNAUDITED);
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
return pending.getIntentSender();
}

View File

@@ -268,7 +268,7 @@ public class PackageInstallerImpl {
Context.RECEIVER_EXPORTED);
// Create a matching PendingIntent and use it to generate the IntentSender
Intent broadcastIntent = new Intent(action);
Intent broadcastIntent = new Intent(action).setPackage(mContext.getPackageName());
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, packageName.hashCode(),
broadcastIntent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT
| PendingIntent.FLAG_MUTABLE);

View File

@@ -839,7 +839,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
.setName("bubblebot")
.build();
RemoteInput remoteInput = new RemoteInput.Builder("reply_key").setLabel("reply").build();
PendingIntent inputIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
PendingIntent inputIntent = PendingIntent.getActivity(mContext, 0,
new Intent().setPackage(mContext.getPackageName()),
PendingIntent.FLAG_MUTABLE);
Icon icon = Icon.createWithResource(mContext, android.R.drawable.sym_def_app_icon);
Notification.Action replyAction = new Notification.Action.Builder(icon, "Reply",
@@ -9227,7 +9228,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
ArrayList<Notification.Action> extraAction = new ArrayList<>();
RemoteInput remoteInput = new RemoteInput.Builder("reply_key").setLabel("reply").build();
PendingIntent inputIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
PendingIntent inputIntent = PendingIntent.getActivity(mContext, 0,
new Intent().setPackage(mContext.getPackageName()),
PendingIntent.FLAG_MUTABLE);
Icon icon = Icon.createWithResource(mContext, android.R.drawable.sym_def_app_icon);
Notification.Action replyAction = new Notification.Action.Builder(icon, "Reply",