Merge "Allows system uid to access application across users"

This commit is contained in:
Rhed Jao
2022-06-20 09:47:52 +00:00
committed by Android (Google) Code Review
3 changed files with 20 additions and 5 deletions

View File

@@ -236,7 +236,8 @@ public interface Computer extends PackageDataSnapshot {
* existence.
* <p>
* Package with {@link PackageManager#SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN} is not
* treated as an uninstalled package for the carrier apps customization.
* treated as an uninstalled package for the carrier apps customization. Bypassing the
* uninstalled package check if the caller is system, shell or root uid.
*/
boolean shouldFilterApplicationIncludingUninstalled(@Nullable PackageStateInternal ps,
int callingUid, int userId);

View File

@@ -58,6 +58,7 @@ import static com.android.server.pm.PackageManagerService.EMPTY_INT_ARRAY;
import static com.android.server.pm.PackageManagerService.HIDE_EPHEMERAL_APIS;
import static com.android.server.pm.PackageManagerService.TAG;
import static com.android.server.pm.PackageManagerServiceUtils.compareSignatures;
import static com.android.server.pm.PackageManagerServiceUtils.isSystemOrRootOrShell;
import static com.android.server.pm.resolution.ComponentResolver.RESOLVE_PRIORITY_SORTER;
import android.Manifest;
@@ -2737,9 +2738,13 @@ public class ComputerEngine implements Computer {
final String instantAppPkgName = getInstantAppPackageName(callingUid);
final boolean callerIsInstantApp = instantAppPkgName != null;
// Don't treat hiddenUntilInstalled as an uninstalled state, phone app needs to access
// these hidden application details to customize carrier apps.
if (ps == null || (filterUninstall && !ps.isHiddenUntilInstalled()
&& !ps.getUserStateOrDefault(userId).isInstalled())) {
// these hidden application details to customize carrier apps. Also, allowing the system
// caller accessing to application across users.
if (ps == null
|| (filterUninstall
&& !isSystemOrRootOrShell(callingUid)
&& !ps.isHiddenUntilInstalled()
&& !ps.getUserStateOrDefault(userId).isInstalled())) {
// If caller is instant app or sdk sandbox and ps is null, pretend the application
// exists, but, needs to be filtered
return (callerIsInstantApp || filterUninstall || Process.isSdkSandboxUid(callingUid));
@@ -2837,6 +2842,9 @@ public class ComputerEngine implements Computer {
if (shouldFilterApplication(sus, callingUid, userId)) {
return true;
}
if (isSystemOrRootOrShell(callingUid)) {
return false;
}
final ArraySet<PackageStateInternal> packageStates =
(ArraySet<PackageStateInternal>) sus.getPackageStates();
for (int index = 0; index < packageStates.size(); index++) {

View File

@@ -1271,7 +1271,13 @@ public class PackageManagerServiceUtils {
* Check if the Binder caller is system UID, root's UID, or shell's UID.
*/
public static boolean isSystemOrRootOrShell() {
final int uid = Binder.getCallingUid();
return isSystemOrRootOrShell(Binder.getCallingUid());
}
/**
* @see #isSystemOrRoot()
*/
public static boolean isSystemOrRootOrShell(int uid) {
return uid == Process.SYSTEM_UID || uid == Process.ROOT_UID || uid == Process.SHELL_UID;
}