diff options
author | 2024-04-30 18:00:07 +0000 | |
---|---|---|
committer | 2024-04-30 18:00:07 +0000 | |
commit | 8b7af664f055fed96f78a0e82390f688753a79df (patch) | |
tree | c42d329be036f58f564db726336dee1e4b96ddaf | |
parent | 69ca903763bdbd8cf5bc3eb78022a473b09133b9 (diff) | |
parent | 955e78071ec49139583056e21f612edba6439436 (diff) |
Merge "Fix READ/WRITE operation access issues on Restricted appOps." into main
-rw-r--r-- | core/java/android/app/AppOpInfo.java | 2 | ||||
-rw-r--r-- | core/java/android/app/AppOpsManager.java | 2 | ||||
-rw-r--r-- | services/core/java/com/android/server/appop/AppOpsService.java | 31 |
3 files changed, 28 insertions, 7 deletions
diff --git a/core/java/android/app/AppOpInfo.java b/core/java/android/app/AppOpInfo.java index 5268ec42e21c..a0f0ccaec58c 100644 --- a/core/java/android/app/AppOpInfo.java +++ b/core/java/android/app/AppOpInfo.java @@ -88,7 +88,7 @@ class AppOpInfo { /** * This specifies whether each option is only allowed to be read - * by apps with manage appops permission. + * by apps with privileged appops permission. */ public final boolean restrictRead; diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 8e766c95b2e8..20b2357e967d 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -3265,7 +3265,7 @@ public class AppOpsManager { } /** - * Retrieve whether the op can be read by apps with manage appops permission. + * Retrieve whether the op can be read by apps with privileged appops permission. * @hide */ public static boolean opRestrictsRead(int op) { diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index e59de6aceb04..798aaee58a8e 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -1563,19 +1563,29 @@ public class AppOpsService extends IAppOpsService.Stub { private ArrayList<AppOpsManager.OpEntry> collectOps(Ops pkgOps, int[] ops, String persistentDeviceId) { ArrayList<AppOpsManager.OpEntry> resOps = null; + boolean shouldReturnRestrictedAppOps = mContext.checkPermission( + Manifest.permission.GET_APP_OPS_STATS, + Binder.getCallingPid(), Binder.getCallingUid()) + == PackageManager.PERMISSION_GRANTED; if (ops == null) { resOps = new ArrayList<>(); - for (int j=0; j<pkgOps.size(); j++) { + for (int j = 0; j < pkgOps.size(); j++) { Op curOp = pkgOps.valueAt(j); + if (opRestrictsRead(curOp.op) && !shouldReturnRestrictedAppOps) { + continue; + } resOps.add(getOpEntryForResult(curOp, persistentDeviceId)); } } else { - for (int j=0; j<ops.length; j++) { + for (int j = 0; j < ops.length; j++) { Op curOp = pkgOps.get(ops[j]); if (curOp != null) { if (resOps == null) { resOps = new ArrayList<>(); } + if (opRestrictsRead(curOp.op) && !shouldReturnRestrictedAppOps) { + continue; + } resOps.add(getOpEntryForResult(curOp, persistentDeviceId)); } } @@ -4244,10 +4254,21 @@ public class AppOpsService extends IAppOpsService.Stub { private void verifyIncomingOp(int op) { if (op >= 0 && op < AppOpsManager._NUM_OP) { - // Enforce manage appops permission if it's a restricted read op. + // Enforce privileged appops permission if it's a restricted read op. if (opRestrictsRead(op)) { - mContext.enforcePermission(Manifest.permission.MANAGE_APPOPS, - Binder.getCallingPid(), Binder.getCallingUid(), "verifyIncomingOp"); + if (!(mContext.checkPermission(Manifest.permission.MANAGE_APPOPS, + Binder.getCallingPid(), Binder.getCallingUid()) + == PackageManager.PERMISSION_GRANTED || mContext.checkPermission( + Manifest.permission.GET_APP_OPS_STATS, + Binder.getCallingPid(), Binder.getCallingUid()) + == PackageManager.PERMISSION_GRANTED || mContext.checkPermission( + Manifest.permission.MANAGE_APP_OPS_MODES, + Binder.getCallingPid(), Binder.getCallingUid()) + == PackageManager.PERMISSION_GRANTED)) { + throw new SecurityException("verifyIncomingOp: uid " + Binder.getCallingUid() + + " does not have any of {MANAGE_APPOPS, GET_APP_OPS_STATS, " + + "MANAGE_APP_OPS_MODES}"); + } } return; } |