From 9f5f1a26c184b0ad3ab87853f11b4aa346a866d5 Mon Sep 17 00:00:00 2001 From: Gavin Corkery Date: Fri, 13 May 2022 17:36:08 +0000 Subject: [PATCH] Add DeviceConfig flag for enforcing receiver restrictions Allows the restrictions on the SDK sandbox registering broadcast receivers to be enabled or disabled depending on the value of a DeviceConfig property in the Sdk Sandbox namespace. Test: atest SdkSandboxRestrictionsHostTest Bug: 229199225 Change-Id: Id6194b2b90bdf8eaa3b0e59cf8dff0b735d663bb --- .../server/am/ActivityManagerService.java | 54 ++++++++++++++++++- 1 file changed, 53 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 f6e8bc826153d..aa510e7717eb6 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1530,6 +1530,8 @@ public class ActivityManagerService extends IActivityManager.Stub // Encapsulates the global setting "hidden_api_blacklist_exemptions" final HiddenApiSettings mHiddenApiBlacklist; + final SdkSandboxSettings mSdkSandboxSettings; + private final PlatformCompat mPlatformCompat; PackageManagerInternal mPackageManagerInt; @@ -2235,6 +2237,53 @@ public class ActivityManagerService extends IActivityManager.Stub } } + /** + * Handles settings related to the enforcement of SDK sandbox restrictions. + */ + static class SdkSandboxSettings implements DeviceConfig.OnPropertiesChangedListener { + + private final Context mContext; + private final Object mLock = new Object(); + + @GuardedBy("mLock") + private boolean mEnforceBroadcastReceiverRestrictions; + + /** + * Property to enforce broadcast receiver restrictions for SDK sandbox processes. If the + * value of this property is {@code true}, the restrictions will be enforced. + */ + public static final String ENFORCE_BROADCAST_RECEIVER_RESTRICTIONS = + "enforce_broadcast_receiver_restrictions"; + + SdkSandboxSettings(Context context) { + mContext = context; + } + + void registerObserver() { + synchronized (mLock) { + mEnforceBroadcastReceiverRestrictions = DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_SDK_SANDBOX, + ENFORCE_BROADCAST_RECEIVER_RESTRICTIONS, false); + DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SDK_SANDBOX, + mContext.getMainExecutor(), this); + } + } + + @Override + public void onPropertiesChanged(DeviceConfig.Properties properties) { + synchronized (mLock) { + mEnforceBroadcastReceiverRestrictions = properties.getBoolean( + ENFORCE_BROADCAST_RECEIVER_RESTRICTIONS, false); + } + } + + boolean isBroadcastReceiverRestrictionsEnforced() { + synchronized (mLock) { + return mEnforceBroadcastReceiverRestrictions; + } + } + } + AppOpsManager getAppOpsManager() { if (mAppOpsManager == null) { mAppOpsManager = mContext.getSystemService(AppOpsManager.class); @@ -2287,6 +2336,7 @@ public class ActivityManagerService extends IActivityManager.Stub mProcStartHandlerThread = null; mProcStartHandler = null; mHiddenApiBlacklist = null; + mSdkSandboxSettings = null; mFactoryTest = FACTORY_TEST_OFF; mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class); mInternal = new LocalService(); @@ -2406,6 +2456,7 @@ public class ActivityManagerService extends IActivityManager.Stub mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class); mHiddenApiBlacklist = new HiddenApiSettings(mHandler, mContext); + mSdkSandboxSettings = new SdkSandboxSettings(mContext); Watchdog.getInstance().addMonitor(this); Watchdog.getInstance().addThread(mHandler); @@ -7911,6 +7962,7 @@ public class ActivityManagerService extends IActivityManager.Stub final boolean alwaysFinishActivities = Settings.Global.getInt(resolver, ALWAYS_FINISH_ACTIVITIES, 0) != 0; mHiddenApiBlacklist.registerObserver(); + mSdkSandboxSettings.registerObserver(); mPlatformCompat.registerContentObserver(); mAppProfiler.retrieveSettings(); @@ -12940,7 +12992,7 @@ public class ActivityManagerService extends IActivityManager.Stub // Allow Sandbox process to register only unexported receivers. if ((flags & Context.RECEIVER_NOT_EXPORTED) != 0) { enforceNotIsolatedCaller("registerReceiver"); - } else { + } else if (mSdkSandboxSettings.isBroadcastReceiverRestrictionsEnforced()) { enforceNotIsolatedOrSdkSandboxCaller("registerReceiver"); } ArrayList stickyIntents = null;