From 0d9f847f763beb8006ee8023f4e9f63e0761a4dd Mon Sep 17 00:00:00 2001 From: Michael Groover Date: Mon, 31 Oct 2022 13:38:29 -0500 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 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. 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 U release. Bug: 234659204 Test: Build Change-Id: I2b6962ece6410a4e86a22732d181a38302659b9e --- .../coretests/src/android/app/activity/LocalReceiver.java | 3 ++- core/tests/coretests/src/android/app/activity/ServiceTest.java | 2 +- .../src/com/android/wm/shell/bubbles/BubbleController.java | 2 +- .../android/systemui/statusbar/policy/SafetyController.java | 3 ++- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/tests/coretests/src/android/app/activity/LocalReceiver.java b/core/tests/coretests/src/android/app/activity/LocalReceiver.java index 7f813390552c7..5ac84f809564d 100644 --- a/core/tests/coretests/src/android/app/activity/LocalReceiver.java +++ b/core/tests/coretests/src/android/app/activity/LocalReceiver.java @@ -36,7 +36,8 @@ public class LocalReceiver extends BroadcastReceiver { if (BroadcastTest.BROADCAST_FAIL_REGISTER.equals(intent.getAction())) { resultString = "Successfully registered, but expected it to fail"; try { - context.registerReceiver(this, new IntentFilter("foo.bar")); + context.registerReceiver(this, new IntentFilter("foo.bar"), + Context.RECEIVER_EXPORTED_UNAUDITED); context.unregisterReceiver(this); } catch (ReceiverCallNotAllowedException e) { //resultString = "This is the correct behavior but not yet implemented"; diff --git a/core/tests/coretests/src/android/app/activity/ServiceTest.java b/core/tests/coretests/src/android/app/activity/ServiceTest.java index c89f37db7fed3..3f3d6a3bff347 100644 --- a/core/tests/coretests/src/android/app/activity/ServiceTest.java +++ b/core/tests/coretests/src/android/app/activity/ServiceTest.java @@ -172,7 +172,7 @@ public class ServiceTest extends TestCase { pidResult.complete(intent.getIntExtra(EXTRA_PID, NOT_STARTED)); mContext.unregisterReceiver(this); } - }, new IntentFilter(ACTION_SERVICE_STARTED)); + }, new IntentFilter(ACTION_SERVICE_STARTED), Context.RECEIVER_EXPORTED_UNAUDITED); serviceTrigger.run(); try { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java index 725b20525bf7e..0262d9a9321e8 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java @@ -692,7 +692,7 @@ public class BubbleController implements ConfigurationChangeListener { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); filter.addAction(Intent.ACTION_SCREEN_OFF); - mContext.registerReceiver(mBroadcastReceiver, filter); + mContext.registerReceiver(mBroadcastReceiver, filter, Context.RECEIVER_EXPORTED_UNAUDITED); } private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SafetyController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SafetyController.java index f3d183ceb45f6..9db207ae9e1dc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SafetyController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SafetyController.java @@ -78,7 +78,8 @@ public class SafetyController implements synchronized (mListeners) { mListeners.add(listener); if (mListeners.size() == 1) { - mContext.registerReceiver(mPermControllerChangeReceiver, PKG_CHANGE_INTENT_FILTER); + mContext.registerReceiver(mPermControllerChangeReceiver, PKG_CHANGE_INTENT_FILTER, + Context.RECEIVER_EXPORTED_UNAUDITED); mBgHandler.post(() -> { mSafetyCenterEnabled = mSafetyCenterManager.isSafetyCenterEnabled(); listener.onSafetyCenterEnableChanged(isSafetyCenterEnabled());