From 81d4a1ff3e4566924d7119065d435146e15cc5b5 Mon Sep 17 00:00:00 2001 From: Rubin Xu Date: Mon, 14 Dec 2020 16:50:26 +0000 Subject: [PATCH] Fix DPMS.isCredentialManagementApp() Call KeyChain.bindAsUser() with cleared binder identity. Bug: 175032227 Test: atest MixedManagedProfileOwnerTest#testDelegation Change-Id: I4c696519a630a81f9a2210d5ec07045298738f7b --- .../DevicePolicyManagerService.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 065d5ffac5b34..9051823b7f11b 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -5905,25 +5905,26 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { * @return {@code true} if the calling process is the credential management app. */ private boolean isCredentialManagementApp(CallerIdentity caller, String alias) { - // Should include alias in authentication policy - try (KeyChainConnection connection = KeyChain.bindAsUser(mContext, - caller.getUserHandle())) { - // The policy will be null if there is no credential management app - AppUriAuthenticationPolicy policy = - connection.getService().getCredentialManagementAppPolicy(); - if (policy == null || policy.getAppAndUriMappings().isEmpty() - || !containsAlias(policy, alias)) { + return mInjector.binderWithCleanCallingIdentity(() -> { + // Should include alias in authentication policy + try (KeyChainConnection connection = KeyChain.bindAsUser(mContext, + caller.getUserHandle())) { + // The policy will be null if there is no credential management app + AppUriAuthenticationPolicy policy = + connection.getService().getCredentialManagementAppPolicy(); + if (policy == null || policy.getAppAndUriMappings().isEmpty() + || !containsAlias(policy, alias)) { + return false; + } + } catch (RemoteException | InterruptedException e) { return false; } - } catch (RemoteException | InterruptedException e) { - return false; - } - AppOpsManager appOpsManager = mInjector.getAppOpsManager(); - return appOpsManager != null - ? appOpsManager.noteOpNoThrow(AppOpsManager.OP_MANAGE_CREDENTIALS, caller.getUid(), - caller.getPackageName(), null, null) == AppOpsManager.MODE_ALLOWED - : false; + AppOpsManager appOpsManager = mInjector.getAppOpsManager(); + if (appOpsManager == null) return false; + return appOpsManager.noteOpNoThrow(AppOpsManager.OP_MANAGE_CREDENTIALS, caller.getUid(), + caller.getPackageName(), null, null) == AppOpsManager.MODE_ALLOWED; + }); } private static boolean containsAlias(AppUriAuthenticationPolicy policy, String alias) {