From 65a00767b605c98e2c4f47b968fe28216a033f1d Mon Sep 17 00:00:00 2001 From: Gavin Corkery Date: Thu, 17 Mar 2022 15:36:38 +0000 Subject: [PATCH] Enforce that sdk sandbox may only bind/start allowed services Integrates with an in-process API in SdkSandboxManagerLocal, which enforces that a service may only be bound to or started by an SDK sandbox uid if it is explicitly allowlisted. Test: atest SdkSandboxManagerUnitTests Bug: 209770510 Change-Id: I8da1b8f5f97b199a9500736c3fd44194a7c6813e --- .../server/am/ActivityManagerService.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index abd5764605fc2..450cfbbace75c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -2949,6 +2949,27 @@ public class ActivityManagerService extends IActivityManager.Stub } } + /** + * If the caller is an {@link Process#isSdkSandboxUid(int) SDK sandbox uid}, enforces that the + * SDK sandbox has permission to start or bind to a given service. + * + * @param intent the intent used to start or bind to the service. + * @throws IllegalStateException if {@link SdkSandboxManagerLocal} cannot be resolved. + * @throws SecurityException if the SDK sandbox is not allowed to bind to this service. + */ + private void enforceAllowedToStartOrBindServiceIfSdkSandbox(Intent intent) { + if (Process.isSdkSandboxUid(Binder.getCallingUid())) { + SdkSandboxManagerLocal sdkSandboxManagerLocal = + LocalManagerRegistry.getManager(SdkSandboxManagerLocal.class); + if (sdkSandboxManagerLocal != null) { + sdkSandboxManagerLocal.enforceAllowedToStartOrBindService(intent); + } else { + throw new IllegalStateException("SdkSandboxManagerLocal not found when checking" + + " whether SDK sandbox uid may start or bind to a service."); + } + } + } + @Override public void setPackageScreenCompatMode(String packageName, int mode) { mActivityTaskManager.setPackageScreenCompatMode(packageName, mode); @@ -12363,6 +12384,7 @@ public class ActivityManagerService extends IActivityManager.Stub String callingFeatureId, int userId) throws TransactionTooLargeException { enforceNotIsolatedCaller("startService"); + enforceAllowedToStartOrBindServiceIfSdkSandbox(service); // Refuse possible leaked file descriptors if (service != null && service.hasFileDescriptors() == true) { throw new IllegalArgumentException("File descriptors passed in Intent"); @@ -12523,6 +12545,7 @@ public class ActivityManagerService extends IActivityManager.Stub String sdkSandboxClientAppPackage, String callingPackage, int userId) throws TransactionTooLargeException { enforceNotIsolatedCaller("bindService"); + enforceAllowedToStartOrBindServiceIfSdkSandbox(service); // Refuse possible leaked file descriptors if (service != null && service.hasFileDescriptors() == true) {