From 0a46c2f78ca8117680f6d6133db7af306eaea0b9 Mon Sep 17 00:00:00 2001 From: Michael Groover Date: Thu, 30 Dec 2021 08:28:33 -0800 Subject: [PATCH] Add unaudited exported flag to exposed runtime receivers 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 T 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. This commit updates all the exposed receivers with a new RECEIVER_EXPORTED_UNAUDITED flag to maintain the existing behavior of exporting the receiver while also flagging the receiver for audit before the T release. Bug: 161145287 Test: Build Change-Id: If360077718549a66179175e197817f7315d8c8ca --- .../deviceinfo/AbstractConnectivityPreferenceController.java | 3 ++- .../server/notification/CountdownConditionProvider.java | 3 ++- .../android/server/notification/EventConditionProvider.java | 3 ++- .../server/notification/NotificationHistoryDatabase.java | 3 ++- .../server/notification/NotificationManagerService.java | 3 ++- .../android/server/notification/ScheduleConditionProvider.java | 3 ++- .../java/com/android/server/notification/SnoozeHelper.java | 3 ++- .../server/notification/NotificationHistoryDatabaseTest.java | 2 +- 8 files changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractConnectivityPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractConnectivityPreferenceController.java index c6552f77a2b25..d3934bf131ba5 100644 --- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractConnectivityPreferenceController.java +++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractConnectivityPreferenceController.java @@ -73,7 +73,8 @@ public abstract class AbstractConnectivityPreferenceController } mContext.registerReceiver(mConnectivityReceiver, connectivityIntentFilter, - android.Manifest.permission.CHANGE_NETWORK_STATE, null); + android.Manifest.permission.CHANGE_NETWORK_STATE, null, + Context.RECEIVER_EXPORTED_UNAUDITED); } protected abstract String[] getConnectivityIntents(); diff --git a/services/core/java/com/android/server/notification/CountdownConditionProvider.java b/services/core/java/com/android/server/notification/CountdownConditionProvider.java index 471c9b97200f7..4b70e2e318885 100644 --- a/services/core/java/com/android/server/notification/CountdownConditionProvider.java +++ b/services/core/java/com/android/server/notification/CountdownConditionProvider.java @@ -94,7 +94,8 @@ public class CountdownConditionProvider extends SystemConditionProviderService { @Override public void onConnected() { if (DEBUG) Slog.d(TAG, "onConnected"); - mContext.registerReceiver(mReceiver, new IntentFilter(ACTION)); + mContext.registerReceiver(mReceiver, new IntentFilter(ACTION), + Context.RECEIVER_EXPORTED_UNAUDITED); mConnected = true; } diff --git a/services/core/java/com/android/server/notification/EventConditionProvider.java b/services/core/java/com/android/server/notification/EventConditionProvider.java index 4be4f0a1e7f02..4fe7a27c64c67 100644 --- a/services/core/java/com/android/server/notification/EventConditionProvider.java +++ b/services/core/java/com/android/server/notification/EventConditionProvider.java @@ -306,7 +306,8 @@ public class EventConditionProvider extends SystemConditionProviderService { filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(ACTION_EVALUATE); - registerReceiver(mReceiver, filter); + registerReceiver(mReceiver, filter, + Context.RECEIVER_EXPORTED_UNAUDITED); } else { unregisterReceiver(mReceiver); } diff --git a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java index 8a3329913142e..a9b2570a3ddae 100644 --- a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java +++ b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java @@ -100,7 +100,8 @@ public class NotificationHistoryDatabase { IntentFilter deletionFilter = new IntentFilter(ACTION_HISTORY_DELETION); deletionFilter.addDataScheme(SCHEME_DELETION); - mContext.registerReceiver(mFileCleanupReceiver, deletionFilter); + mContext.registerReceiver(mFileCleanupReceiver, deletionFilter, + Context.RECEIVER_EXPORTED_UNAUDITED); } public void init() { diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 20686322fd3d8..46e688a138363 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -2328,7 +2328,8 @@ public class NotificationManagerService extends SystemService { IntentFilter timeoutFilter = new IntentFilter(ACTION_NOTIFICATION_TIMEOUT); timeoutFilter.addDataScheme(SCHEME_TIMEOUT); - getContext().registerReceiver(mNotificationTimeoutReceiver, timeoutFilter); + getContext().registerReceiver(mNotificationTimeoutReceiver, timeoutFilter, + Context.RECEIVER_EXPORTED_UNAUDITED); IntentFilter settingsRestoredFilter = new IntentFilter(Intent.ACTION_SETTING_RESTORED); getContext().registerReceiver(mRestoreReceiver, settingsRestoredFilter); diff --git a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java index 92cdce7ddceb4..737353dc51518 100644 --- a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java +++ b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java @@ -261,7 +261,8 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(ACTION_EVALUATE); filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); - registerReceiver(mReceiver, filter); + registerReceiver(mReceiver, filter, + Context.RECEIVER_EXPORTED_UNAUDITED); } else { unregisterReceiver(mReceiver); } diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java index 4500bbcd250f3..7f265df3f416a 100644 --- a/services/core/java/com/android/server/notification/SnoozeHelper.java +++ b/services/core/java/com/android/server/notification/SnoozeHelper.java @@ -116,7 +116,8 @@ public class SnoozeHelper { mContext = context; IntentFilter filter = new IntentFilter(REPOST_ACTION); filter.addDataScheme(REPOST_SCHEME); - mContext.registerReceiver(mBroadcastReceiver, filter); + mContext.registerReceiver(mBroadcastReceiver, filter, + Context.RECEIVER_EXPORTED_UNAUDITED); mAm = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); mCallback = callback; mUserProfiles = userProfiles; diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java index 182848b4f6288..bd7186e74354d 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java @@ -108,7 +108,7 @@ public class NotificationHistoryDatabaseTest extends UiServiceTestCase { @Test public void testDeletionReceiver() { - verify(mContext, times(1)).registerReceiver(any(), any()); + verify(mContext, times(1)).registerReceiver(any(), any(), anyInt()); } @Test