Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9d0f287b authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Prepare for: disallow installation of non-preloads using system certs or uids." into main

parents 6c0b72fe 69098d6d
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -77,6 +77,8 @@ public final class KnownPackages {
    // Please note the numbers should be continuous.
    public static final int LAST_KNOWN_PACKAGE = PACKAGE_WEARABLE_SENSING;

    static final String SYSTEM_PACKAGE_NAME = "android";

    private final DefaultAppProvider mDefaultAppProvider;
    private final String mRequiredInstallerPackage;
    private final String mRequiredUninstallerPackage;
@@ -186,7 +188,7 @@ public final class KnownPackages {
            case PACKAGE_SETUP_WIZARD:
                return snapshot.filterOnlySystemPackages(mSetupWizardPackage);
            case PACKAGE_SYSTEM:
                return new String[]{"android"};
                return new String[]{SYSTEM_PACKAGE_NAME};
            case PACKAGE_VERIFIER:
                return snapshot.filterOnlySystemPackages(mRequiredVerifierPackages);
            case PACKAGE_SYSTEM_TEXT_CLASSIFIER:
+29 −4
Original line number Diff line number Diff line
@@ -20,15 +20,19 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIB
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
import static android.content.pm.SigningDetails.CapabilityMergeRule.MERGE_RESTRICTED_CAPABILITY;

import static com.android.server.pm.PackageManagerService.SCAN_AS_APEX;
import static com.android.server.pm.PackageManagerService.SCAN_BOOTING;
import static com.android.server.pm.PackageManagerService.SCAN_DONT_KILL_APP;
import static com.android.server.pm.PackageManagerService.TAG;

import android.content.pm.PackageManager;
import android.content.pm.SharedLibraryInfo;
import android.content.pm.SigningDetails;
import android.os.Build;
import android.os.SystemProperties;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Slog;

import com.android.internal.pm.parsing.pkg.ParsedPackage;
import com.android.internal.pm.pkg.parsing.ParsingPackageUtils;
@@ -49,6 +53,8 @@ import java.util.Map;
 * as install) led to the request.
 */
final class ReconcilePackageUtils {
    private static final boolean ALLOW_NON_PRELOADS_SYSTEM_SIGNATURE = Build.IS_DEBUGGABLE || true;

    public static List<ReconciledPackage> reconcilePackages(
            List<InstallRequest> installRequests,
            Map<String, AndroidPackage> allPackages,
@@ -90,6 +96,8 @@ final class ReconcilePackageUtils {
            }
        }

        final AndroidPackage systemPackage = allPackages.get(KnownPackages.SYSTEM_PACKAGE_NAME);

        for (InstallRequest installRequest : installRequests) {
            final String installPackageName = installRequest.getParsedPackage().getPackageName();
            final List<SharedLibraryInfo> allowedSharedLibInfos =
@@ -133,6 +141,9 @@ final class ReconcilePackageUtils {
            if (parsedPackage != null) {
                signingDetails = parsedPackage.getSigningDetails();
            }
            final boolean isSystemPackage =
                    ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) != 0);
            final boolean isApex = (scanFlags & SCAN_AS_APEX) != 0;
            SharedUserSetting sharedUserSetting = settings.getSharedUserSettingLPr(
                    signatureCheckPs);
            if (ksms.shouldCheckUpgradeKeySetLocked(
@@ -141,7 +152,7 @@ final class ReconcilePackageUtils {
                    // We just determined the app is signed correctly, so bring
                    // over the latest parsed certs.
                } else {
                    if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) == 0) {
                    if (!isSystemPackage) {
                        throw new ReconcileFailure(INSTALL_FAILED_UPDATE_INCOMPATIBLE,
                                "Package " + parsedPackage.getPackageName()
                                        + " upgrade keys do not match the previously installed"
@@ -168,9 +179,23 @@ final class ReconcilePackageUtils {
                        removeAppKeySetData = true;
                    }

                    if (!isSystemPackage && !isApex && signingDetails != null
                            && systemPackage != null && systemPackage.getSigningDetails() != null
                            && systemPackage.getSigningDetails().checkCapability(
                                    signingDetails,
                                    SigningDetails.CertCapabilities.PERMISSION)) {
                        Slog.d(TAG, "Non-preload app associated with system signature: "
                                + signatureCheckPs.getPackageName());
                        if (!ALLOW_NON_PRELOADS_SYSTEM_SIGNATURE) {
                            throw new ReconcileFailure(
                                    INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES,
                                    "Non-preload app associated with system signature: "
                                            + signatureCheckPs.getPackageName());
                        }
                    }

                    // if this is is a sharedUser, check to see if the new package is signed by a
                    // newer
                    // signing certificate than the existing one, and if so, copy over the new
                    // newer signing certificate than the existing one, and if so, copy over the new
                    // details
                    if (sharedUserSetting != null) {
                        // Attempt to merge the existing lineage for the shared SigningDetails with
@@ -203,7 +228,7 @@ final class ReconcilePackageUtils {
                        }
                    }
                } catch (PackageManagerException e) {
                    if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) == 0) {
                    if (!isSystemPackage) {
                        throw new ReconcileFailure(e);
                    }
                    signingDetails = parsedPackage.getSigningDetails();