From 12a8a0866a9a3790d08dd9972e0065661700a1a0 Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Fri, 25 Jun 2021 12:37:57 +0800 Subject: [PATCH] Enforce package visibility to the api getAppOpPermissionPackages App can query which applications are installed on the device via the api IPackageManager#getAppOpPermissionPackages. This cl enforcing the package visibility filter to the api to fix the package information disclosure issue. Bug: 188913056 Test: atest AppEnumerationInternalTests Change-Id: Ic2771051babab49d885d0b21d9d8f7e9ae1d8418 --- .../server/pm/PackageManagerService.java | 17 +++++++- .../appenumeration/AndroidTest.xml | 1 + .../AppEnumerationInternalTests.java | 39 ++++++++++++++++--- .../test-apps/target/Android.bp | 14 +++++++ .../AndroidManifest-hasAppOpPermission.xml | 25 ++++++++++++ 5 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 services/tests/PackageManagerServiceTests/appenumeration/test-apps/target/AndroidManifest-hasAppOpPermission.xml diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 5917415204e07..79405fece0c80 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -10134,7 +10134,22 @@ public class PackageManagerService extends IPackageManager.Stub if (getInstantAppPackageName(getCallingUid()) != null) { return EmptyArray.STRING; } - return mPermissionManager.getAppOpPermissionPackages(permissionName); + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getUserId(callingUid); + + final ArraySet packageNames = new ArraySet( + mPermissionManager.getAppOpPermissionPackages(permissionName)); + synchronized (mLock) { + for (int i = packageNames.size() - 1; i >= 0; i--) { + final String packageName = packageNames.valueAt(i); + if (!shouldFilterApplicationLocked(mSettings.getPackageLPr(packageName), + callingUid, callingUserId)) { + continue; + } + packageNames.removeAt(i); + } + } + return packageNames.toArray(new String[packageNames.size()]); } @Override diff --git a/services/tests/PackageManagerServiceTests/appenumeration/AndroidTest.xml b/services/tests/PackageManagerServiceTests/appenumeration/AndroidTest.xml index 6f168a3888b33..7b821c0606a09 100644 --- a/services/tests/PackageManagerServiceTests/appenumeration/AndroidTest.xml +++ b/services/tests/PackageManagerServiceTests/appenumeration/AndroidTest.xml @@ -32,6 +32,7 @@