From f5f55f41711707f0bcff6a7b9fe9a4bd07e5053b Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Wed, 13 Apr 2022 17:53:56 +0800 Subject: [PATCH] Fix cross user package visibility leakage for PackageManager (1/n) APIs: - IPackageManager#isPackageSignedByKeySet - IPackageManager#isPackageSignedByKeySetExactly Bug: 214394643 Test: atest CrossUserPackageVisibilityTests Change-Id: I14e4cc5cf27f205353fe709bc2bc8b45778b0764 --- .../com/android/server/pm/ComputerEngine.java | 10 +- .../appenumeration/Android.bp | 1 + .../appenumeration/AndroidManifest.xml | 10 +- .../appenumeration/AndroidTest.xml | 1 + .../CrossUserPackageVisibilityTests.java | 95 ++++++++++++++++++- .../test-apps/target/Android.bp | 14 +++ ...oidManifest-crossUserPackageVisibility.xml | 22 +++++ 7 files changed, 145 insertions(+), 8 deletions(-) create mode 100644 services/tests/PackageManagerServiceTests/appenumeration/test-apps/target/AndroidManifest-crossUserPackageVisibility.xml diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index c5661a3dc253f..a29b1f8f39ca4 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -5284,9 +5284,10 @@ public class ComputerEngine implements Computer { return false; } final AndroidPackage pkg = mPackages.get(packageName); + final int callingUserId = UserHandle.getUserId(callingUid); if (pkg == null - || shouldFilterApplication(getPackageStateInternal(pkg.getPackageName()), - callingUid, UserHandle.getUserId(callingUid))) { + || shouldFilterApplicationIncludingUninstalled( + getPackageStateInternal(pkg.getPackageName()), callingUid, callingUserId)) { Slog.w(TAG, "KeySet requested for unknown package: " + packageName); throw new IllegalArgumentException("Unknown package: " + packageName); } @@ -5308,9 +5309,10 @@ public class ComputerEngine implements Computer { return false; } final AndroidPackage pkg = mPackages.get(packageName); + final int callingUserId = UserHandle.getUserId(callingUid); if (pkg == null - || shouldFilterApplication(getPackageStateInternal(pkg.getPackageName()), - callingUid, UserHandle.getUserId(callingUid))) { + || shouldFilterApplicationIncludingUninstalled( + getPackageStateInternal(pkg.getPackageName()), callingUid, callingUserId)) { Slog.w(TAG, "KeySet requested for unknown package: " + packageName); throw new IllegalArgumentException("Unknown package: " + packageName); } diff --git a/services/tests/PackageManagerServiceTests/appenumeration/Android.bp b/services/tests/PackageManagerServiceTests/appenumeration/Android.bp index 479ef8e5f1880..cdb6324988bea 100644 --- a/services/tests/PackageManagerServiceTests/appenumeration/Android.bp +++ b/services/tests/PackageManagerServiceTests/appenumeration/Android.bp @@ -30,6 +30,7 @@ android_test { "compatibility-device-util-axt", "androidx.test.runner", "truth-prebuilt", + "Harrier", ], platform_apis: true, test_suites: ["device-tests"], diff --git a/services/tests/PackageManagerServiceTests/appenumeration/AndroidManifest.xml b/services/tests/PackageManagerServiceTests/appenumeration/AndroidManifest.xml index 2039aaa20945c..0395aa8a1db62 100644 --- a/services/tests/PackageManagerServiceTests/appenumeration/AndroidManifest.xml +++ b/services/tests/PackageManagerServiceTests/appenumeration/AndroidManifest.xml @@ -16,7 +16,15 @@ --> + xmlns:tools="http://schemas.android.com/tools" + package="com.android.server.pm.test.appenumeration"> + + + + + + +