From c6bdbec499d7afd4806e6f472ab049d3b6967764 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Fri, 7 Dec 2018 16:57:38 -0800 Subject: [PATCH] Do not review removed permissions Removed permissions don't participate in the permission model, hence we should ignore them everywhere. The problem was that if we set them as "review-required" other code gets confused as an app that has been reviewed still has some permissions with this flag set. Test: 1. Installed legacy app that needs storage access (verified permission flags) 2. reviewed permisisons (verified permission flags) 3. reset app (verified permission flags) atest android.appsecurity.cts.PermissionsHostTest#testCompatDefault22 (while in isolated storage mode) atest android.appsecurity.cts.PermissionsHostTest#testReviewPermissionWhenServiceIsBound (while in isolated storage mode) Fixes: 120223984 Change-Id: I4b55cc4fb2e39b358fd3b6c5db600c5b3b927096 --- .../java/com/android/server/pm/PackageManagerService.java | 4 ++++ .../com/android/server/pm/permission/BasePermission.java | 5 +++++ .../server/pm/permission/PermissionManagerService.java | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 6bfcfa2246d0c..774b53b0b84db 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -18302,6 +18302,10 @@ public class PackageManagerService extends IPackageManager.Stub continue; } + if (bp.isRemoved()) { + continue; + } + // If shared user we just reset the state to which only this app contributed. if (ps.sharedUser != null) { boolean used = false; diff --git a/services/core/java/com/android/server/pm/permission/BasePermission.java b/services/core/java/com/android/server/pm/permission/BasePermission.java index 2d583ca39adb4..302874e06ab82 100644 --- a/services/core/java/com/android/server/pm/permission/BasePermission.java +++ b/services/core/java/com/android/server/pm/permission/BasePermission.java @@ -189,6 +189,11 @@ public final class BasePermission { return (protectionLevel & PermissionInfo.PROTECTION_MASK_BASE) == PermissionInfo.PROTECTION_DANGEROUS; } + + public boolean isRemoved() { + return perm.info != null && (perm.info.flags & PermissionInfo.FLAG_REMOVED) != 0; + } + public boolean isSignature() { return (protectionLevel & PermissionInfo.PROTECTION_MASK_BASE) == PermissionInfo.PROTECTION_SIGNATURE; 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 4406fdde6454f..7e51786848d5f 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -799,6 +799,10 @@ public class PermissionManagerService { continue; } + if (bp.isRemoved()) { + continue; + } + // Limit ephemeral apps to ephemeral allowed permissions. if (pkg.applicationInfo.isInstantApp() && !bp.isInstant()) { if (DEBUG_PERMISSIONS) {