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
This commit is contained in:
Michael Groover
2022-10-04 17:20:37 -05:00
parent c6c8515d00
commit 6ce57b67fb
7 changed files with 14 additions and 7 deletions

View File

@@ -295,7 +295,8 @@ public class SimStatusDialogController implements LifecycleObserver {
if (mShowLatestAreaInfo) { if (mShowLatestAreaInfo) {
updateAreaInfoText(); updateAreaInfoText();
mContext.registerReceiver(mAreaInfoReceiver, mContext.registerReceiver(mAreaInfoReceiver,
new IntentFilter(CellBroadcastIntents.ACTION_AREA_INFO_UPDATED)); new IntentFilter(CellBroadcastIntents.ACTION_AREA_INFO_UPDATED),
Context.RECEIVER_EXPORTED/*UNAUDITED*/);
} }
mIsRegisteredListener = true; mIsRegisteredListener = true;

View File

@@ -86,7 +86,8 @@ public class CarrierConfigCache {
final CarrierConfigChangeReceiver receiver = new CarrierConfigChangeReceiver(); final CarrierConfigChangeReceiver receiver = new CarrierConfigChangeReceiver();
final Context appContext = context.getApplicationContext(); final Context appContext = context.getApplicationContext();
sCarrierConfigManager = appContext.getSystemService(CarrierConfigManager.class); 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; return sInstance;
} }
} }

View File

@@ -38,7 +38,8 @@ public class CarrierConfigChangedReceiver extends BroadcastReceiver {
} }
public void registerOn(Context context) { 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 @Override

View File

@@ -166,7 +166,8 @@ public class TetherEnabler implements SwitchWidgetController.OnSwitchChangeListe
TetheringManager.ACTION_TETHER_STATE_CHANGED); TetheringManager.ACTION_TETHER_STATE_CHANGED);
filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
mContext.registerReceiver(mTetherChangeReceiver, filter); mContext.registerReceiver(mTetherChangeReceiver, filter,
Context.RECEIVER_EXPORTED/*UNAUDITED*/);
mTetheringEventCallback = mTetheringEventCallback =
new TetheringManager.TetheringEventCallback() { new TetheringManager.TetheringEventCallback() {
@Override @Override

View File

@@ -114,7 +114,8 @@ public class WorkModePreferenceControllerTest {
@Test @Test
public void onStop_shouldUnregisterReceiver() { public void onStop_shouldUnregisterReceiver() {
// register it first // register it first
mContext.registerReceiver(mController.mReceiver, null); mContext.registerReceiver(mController.mReceiver, null,
Context.RECEIVER_EXPORTED/*UNAUDITED*/);
mController.onStop(); mController.onStop();
verify(mContext).unregisterReceiver(mController.mReceiver); verify(mContext).unregisterReceiver(mController.mReceiver);

View File

@@ -99,7 +99,8 @@ public class BluetoothDeviceNamePreferenceControllerTest {
@Test @Test
public void testOnStop_receiverUnregistered() { public void testOnStop_receiverUnregistered() {
// register it first // register it first
mContext.registerReceiver(mController.mReceiver, null); mContext.registerReceiver(mController.mReceiver, null,
Context.RECEIVER_EXPORTED/*UNAUDITED*/);
mController.onStop(); mController.onStop();
verify(mContext).unregisterReceiver(mController.mReceiver); verify(mContext).unregisterReceiver(mController.mReceiver);

View File

@@ -168,7 +168,8 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
@Test @Test
public void onStop_unregisterCallback() { public void onStop_unregisterCallback() {
// register it first // register it first
mContext.registerReceiver(mPreConnectedDeviceController.mReceiver, null); mContext.registerReceiver(mPreConnectedDeviceController.mReceiver, null,
Context.RECEIVER_EXPORTED/*UNAUDITED*/);
// unregister the callback in onStop() // unregister the callback in onStop()
mPreConnectedDeviceController.onStop(); mPreConnectedDeviceController.onStop();