Allows system uid to access application across users

After this change, applying the
function shouldFilterApplicationIncludingUninstalled to the APIs
which do not take the user id as the parameter becomes easier.
There’s no need to consider whether the system caller invokes
the API with a correct user id. The system caller is able to
access the application across users.

Bug: 229684723
Test: atest AppEnumerationTests
Test: atest AppEnumerationInternalTests
Test: atest CrossUserPackageVisibilityTests
Change-Id: I674281a1fa9083bcf63dd67cad2f944d7481cb39
This commit is contained in:
Rhed Jao
2022-06-16 12:36:55 +08:00
parent 48ba68187a
commit a4fb7ea171
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;
}