From 1ea4f56c3d75ac61042eb097f57619190a21e72d Mon Sep 17 00:00:00 2001 From: yawanng Date: Mon, 8 Feb 2021 22:38:28 +0000 Subject: [PATCH] Adds caller check to getAllPackages() This change enforces that only system, root or shell may call getAllPackages(), a hidden API that shares all package names regardless of user, instant app or package visibility rules. The only exception is the uid of iorapd. iorapd needs the package info to prefetch the right data. Bug: 179618216 Bug: 174661955 Test: run iorapd and check it works well. Change-Id: I77460ae19a4d41151577646441f11e2eddbb741a Merged-In: I77460ae19a4d41151577646441f11e2eddbb741a (cherry picked from commit 8124efd57b50056d22e1b63c32c366ebdf049598) --- core/java/android/os/Process.java | 6 ++++++ .../java/com/android/server/pm/PackageManagerService.java | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 54d2df865c392..136dc388022f4 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -206,6 +206,12 @@ public class Process { */ public static final int SE_UID = 1068; + /** + * Defines the UID/GID for the iorapd. + * @hide + */ + public static final int IORAPD_UID = 1071; + /** * Defines the UID/GID for the NetworkStack app. * @hide diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e6789d4ba8aca..24d550f6da3f6 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -8942,6 +8942,10 @@ public class PackageManagerService extends IPackageManager.Stub @Override public List getAllPackages() { + // Allow iorapd to call this method. + if (Binder.getCallingUid() != Process.IORAPD_UID) { + enforceSystemOrRootOrShell("getAllPackages is limited to privileged callers"); + } final int callingUid = Binder.getCallingUid(); final int callingUserId = UserHandle.getUserId(callingUid); synchronized (mLock) {