From 2f16f84ee02049780ce5def3cca736f70f6d38d6 Mon Sep 17 00:00:00 2001 From: Michael Groover Date: Mon, 14 Nov 2022 16:38:24 -0600 Subject: [PATCH] Add receiver flag enforcement workaround for apps targeting U Android T allows apps to declare a runtime receiver as not exported by invoking registerReceiver with a new RECEIVER_NOT_EXPORTED flag; receivers registered with this flag will only receive broadcasts from the platform and the app itself. However to ensure developers can properly protect their receivers, all apps targeting U or later registering a receiver for non-system broadcasts must specify either the exported or not exported flag when invoking #registerReceiver; if one of these flags is not provided, the platform will throw a SecurityException. Some apps have already begun targeting U but have not yet flagged their exposed receivers; this commit adds an exemption for these apps to prevent them from crashing due to this new enforcement while their receivers are updated. Bug: 258849947 Test: Manually verified affected packages did not crash with enforcement Change-Id: Iaa5b48f874e3aa9657b2dfd9fd2e34fe782a5a23 --- .../android/server/am/ActivityManagerService.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index af6eaf4e94bd2..811ccdaeee4b3 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -13506,9 +13506,19 @@ public class ActivityManagerService extends IActivityManager.Stub // Don't enforce the flag check if we're EITHER registering for only protected // broadcasts, or the receiver is null (a sticky broadcast). Sticky broadcasts should // not be used generally, so we will be marking them as exported by default - final boolean requireExplicitFlagForDynamicReceivers = CompatChanges.isChangeEnabled( + boolean requireExplicitFlagForDynamicReceivers = CompatChanges.isChangeEnabled( DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED, callingUid) && mConstants.mEnforceReceiverExportedFlagRequirement; + // STOPSHIP(b/259139792): Allow apps that are currently targeting U and in process of + // updating their receivers to be exempt from this requirement until their receivers + // are flagged. + if (requireExplicitFlagForDynamicReceivers) { + if ("com.google.android.apps.messaging".equals(callerPackage)) { + // Note, a versionCode check for this package is not performed because it could + // cause breakage with a subsequent update outside the system image. + requireExplicitFlagForDynamicReceivers = false; + } + } if (!onlyProtectedBroadcasts) { if (receiver == null && !explicitExportStateDefined) { // sticky broadcast, no flag specified (flag isn't required)