diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 20 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/SharedUserSetting.java | 5 |
2 files changed, 25 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 1e2f2b2df863..54b68b1aa280 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -10652,6 +10652,26 @@ public class PackageManagerService extends IPackageManager.Stub } } } + + // Verify that packages sharing a user with a privileged app are marked as privileged. + if (!pkg.isPrivileged() && (pkg.mSharedUserId != null)) { + SharedUserSetting sharedUserSetting = null; + try { + sharedUserSetting = mSettings.getSharedUserLPw(pkg.mSharedUserId, 0, 0, false); + } catch (PackageManagerException ignore) {} + if (sharedUserSetting != null && sharedUserSetting.isPrivileged()) { + // Exempt SharedUsers signed with the platform key. + PackageSetting platformPkgSetting = mSettings.mPackages.get("android"); + if ((platformPkgSetting.signatures.mSignatures != null) && + (compareSignatures(platformPkgSetting.signatures.mSignatures, + pkg.mSigningDetails.signatures) != PackageManager.SIGNATURE_MATCH)) { + throw new PackageManagerException("Apps that share a user with a " + + "privileged app must themselves be marked as privileged. " + + pkg.packageName + " shares privileged user " + + pkg.mSharedUserId + "."); + } + } + } } } diff --git a/services/core/java/com/android/server/pm/SharedUserSetting.java b/services/core/java/com/android/server/pm/SharedUserSetting.java index 877da144730f..244613180d00 100644 --- a/services/core/java/com/android/server/pm/SharedUserSetting.java +++ b/services/core/java/com/android/server/pm/SharedUserSetting.java @@ -17,6 +17,7 @@ package com.android.server.pm; import android.annotation.Nullable; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageParser; import android.service.pm.PackageServiceDumpProto; import android.util.ArraySet; @@ -102,4 +103,8 @@ public final class SharedUserSetting extends SettingBase { } return pkgList; } + + public boolean isPrivileged() { + return (this.pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0; + } } |