From 6ce57b67fb6c0b3cc3f8e37722d6a8cffd9d49f2 Mon Sep 17 00:00:00 2001 From: Michael Groover Date: Tue, 4 Oct 2022 17:20:37 -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: I8fbcf69575d829f26e02d661498d69f5fc8740d0 --- .../deviceinfo/simstatus/SimStatusDialogController.java | 3 ++- src/com/android/settings/network/CarrierConfigCache.java | 3 ++- .../android/settings/network/CarrierConfigChangedReceiver.java | 3 ++- src/com/android/settings/network/TetherEnabler.java | 3 ++- .../settings/accounts/WorkModePreferenceControllerTest.java | 3 ++- .../bluetooth/BluetoothDeviceNamePreferenceControllerTest.java | 3 ++- .../PreviouslyConnectedDevicePreferenceControllerTest.java | 3 ++- 7 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java index 2cf523f3b3a..c0934720574 100644 --- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java +++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java @@ -295,7 +295,8 @@ public class SimStatusDialogController implements LifecycleObserver { if (mShowLatestAreaInfo) { updateAreaInfoText(); mContext.registerReceiver(mAreaInfoReceiver, - new IntentFilter(CellBroadcastIntents.ACTION_AREA_INFO_UPDATED)); + new IntentFilter(CellBroadcastIntents.ACTION_AREA_INFO_UPDATED), + Context.RECEIVER_EXPORTED/*UNAUDITED*/); } mIsRegisteredListener = true; diff --git a/src/com/android/settings/network/CarrierConfigCache.java b/src/com/android/settings/network/CarrierConfigCache.java index 2b4637c2d43..30374f57f85 100644 --- a/src/com/android/settings/network/CarrierConfigCache.java +++ b/src/com/android/settings/network/CarrierConfigCache.java @@ -86,7 +86,8 @@ public class CarrierConfigCache { final CarrierConfigChangeReceiver receiver = new CarrierConfigChangeReceiver(); final Context appContext = context.getApplicationContext(); sCarrierConfigManager = appContext.getSystemService(CarrierConfigManager.class); - appContext.registerReceiver(receiver, new IntentFilter(ACTION_CARRIER_CONFIG_CHANGED)); + appContext.registerReceiver(receiver, new IntentFilter(ACTION_CARRIER_CONFIG_CHANGED), + Context.RECEIVER_EXPORTED/*UNAUDITED*/); return sInstance; } } diff --git a/src/com/android/settings/network/CarrierConfigChangedReceiver.java b/src/com/android/settings/network/CarrierConfigChangedReceiver.java index 8a6d47d96fc..9092758866a 100644 --- a/src/com/android/settings/network/CarrierConfigChangedReceiver.java +++ b/src/com/android/settings/network/CarrierConfigChangedReceiver.java @@ -38,7 +38,8 @@ public class CarrierConfigChangedReceiver extends BroadcastReceiver { } public void registerOn(Context context) { - context.registerReceiver(this, new IntentFilter(ACTION_CARRIER_CONFIG_CHANGED)); + context.registerReceiver(this, new IntentFilter(ACTION_CARRIER_CONFIG_CHANGED), + Context.RECEIVER_EXPORTED/*UNAUDITED*/); } @Override diff --git a/src/com/android/settings/network/TetherEnabler.java b/src/com/android/settings/network/TetherEnabler.java index c83d971ebb3..668c76698f2 100644 --- a/src/com/android/settings/network/TetherEnabler.java +++ b/src/com/android/settings/network/TetherEnabler.java @@ -166,7 +166,8 @@ public class TetherEnabler implements SwitchWidgetController.OnSwitchChangeListe TetheringManager.ACTION_TETHER_STATE_CHANGED); filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); - mContext.registerReceiver(mTetherChangeReceiver, filter); + mContext.registerReceiver(mTetherChangeReceiver, filter, + Context.RECEIVER_EXPORTED/*UNAUDITED*/); mTetheringEventCallback = new TetheringManager.TetheringEventCallback() { @Override diff --git a/tests/robotests/src/com/android/settings/accounts/WorkModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/WorkModePreferenceControllerTest.java index b5d1cc78eba..2a283181b1c 100644 --- a/tests/robotests/src/com/android/settings/accounts/WorkModePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/WorkModePreferenceControllerTest.java @@ -114,7 +114,8 @@ public class WorkModePreferenceControllerTest { @Test public void onStop_shouldUnregisterReceiver() { // register it first - mContext.registerReceiver(mController.mReceiver, null); + mContext.registerReceiver(mController.mReceiver, null, + Context.RECEIVER_EXPORTED/*UNAUDITED*/); mController.onStop(); verify(mContext).unregisterReceiver(mController.mReceiver); diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java index b49dc1398ca..af06217e663 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java @@ -99,7 +99,8 @@ public class BluetoothDeviceNamePreferenceControllerTest { @Test public void testOnStop_receiverUnregistered() { // register it first - mContext.registerReceiver(mController.mReceiver, null); + mContext.registerReceiver(mController.mReceiver, null, + Context.RECEIVER_EXPORTED/*UNAUDITED*/); mController.onStop(); verify(mContext).unregisterReceiver(mController.mReceiver); diff --git a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java index e9d834ced6d..e351b71b3dc 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java @@ -168,7 +168,8 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { @Test public void onStop_unregisterCallback() { // register it first - mContext.registerReceiver(mPreConnectedDeviceController.mReceiver, null); + mContext.registerReceiver(mPreConnectedDeviceController.mReceiver, null, + Context.RECEIVER_EXPORTED/*UNAUDITED*/); // unregister the callback in onStop() mPreConnectedDeviceController.onStop();