From 2d6070d088a8fcf9a609659c3950559b984e5372 Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Thu, 30 Mar 2023 20:07:59 +0000 Subject: [PATCH] Allow attribution source to be correctly set Maps HotwordDetectionSevice's isolated uid to the package uid for accessing various services. Test: Recognition service can be called inside isolated process. Bug: 274535894 Change-Id: Ia4b0022eb2547c319acb4ce5479c782ddb406da1 --- .../permission/PermissionManagerService.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index b56e5c993ce5c..c5f939a2a66ef 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -64,6 +64,7 @@ import android.permission.IPermissionManager; import android.permission.PermissionCheckerManager; import android.permission.PermissionManager; import android.permission.PermissionManagerInternal; +import android.service.voice.VoiceInteractionManagerInternal; import android.util.ArrayMap; import android.util.Slog; import android.util.SparseArray; @@ -969,12 +970,13 @@ public class PermissionManagerService extends IPermissionManager.Stub { // the private data in your process; or by you explicitly calling to another // app passing the source, in which case you must trust the other side; - final int callingUid = Binder.getCallingUid(); - if (source.getUid() != callingUid && mContext.checkPermission( + final int callingUid = resolveUid(Binder.getCallingUid()); + final int sourceUid = resolveUid(source.getUid()); + if (sourceUid != callingUid && mContext.checkPermission( Manifest.permission.UPDATE_APP_OPS_STATS, /*pid*/ -1, callingUid) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("Cannot register attribution source for uid:" - + source.getUid() + " from uid:" + callingUid); + + sourceUid + " from uid:" + callingUid); } final PackageManagerInternal packageManagerInternal = LocalServices.getService( @@ -983,10 +985,10 @@ public class PermissionManagerService extends IPermissionManager.Stub { // TODO(b/234653108): Clean up this UID/package & cross-user check. // If calling from the system process, allow registering attribution for package from // any user - int userId = UserHandle.getUserId((callingUid == Process.SYSTEM_UID ? source.getUid() + int userId = UserHandle.getUserId((callingUid == Process.SYSTEM_UID ? sourceUid : callingUid)); if (packageManagerInternal.getPackageUid(source.getPackageName(), 0, userId) - != source.getUid()) { + != sourceUid) { throw new SecurityException("Cannot register attribution source for package:" + source.getPackageName() + " from uid:" + callingUid); } @@ -1012,6 +1014,21 @@ public class PermissionManagerService extends IPermissionManager.Stub { return false; } } + + private int resolveUid(int uid) { + final VoiceInteractionManagerInternal vimi = LocalServices + .getService(VoiceInteractionManagerInternal.class); + if (vimi == null) { + return uid; + } + final VoiceInteractionManagerInternal.HotwordDetectionServiceIdentity + hotwordDetectionServiceIdentity = vimi.getHotwordDetectionServiceIdentity(); + if (hotwordDetectionServiceIdentity != null + && uid == hotwordDetectionServiceIdentity.getIsolatedUid()) { + return hotwordDetectionServiceIdentity.getOwnerUid(); + } + return uid; + } } /**