From 3c36fd5feec889c99427780c9f26217d2680356d Mon Sep 17 00:00:00 2001 From: Michael Groover Date: Fri, 18 Feb 2022 14:41:10 -0800 Subject: [PATCH] [DO NOT MERGE]Revert "Relax minimum signature scheme version for apps on system partition" This reverts commit b71e39893596a7aa6a8733b9add83452c57b7df9. Revert reason: System apps should now have uncompressed dex / library files in their APKs and should be able to satisfy the minimum V2 signature requirement when targeting API level 30+. Fixes: 215046612 Test: Manually verified V1 only signed APK targeting API level 30 on the system image failed to verify. Change-Id: Ic53d2a3614e7dff4e4bfe18561d3dfbb665bbcb2 --- .../android/content/pm/PackageParser.java | 6 ++---- .../pm/parsing/ParsingPackageUtils.java | 6 ++---- .../server/pm/PackageManagerService.java | 20 +++++++++---------- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 4ff26242dab2b..f54d9a76d02dc 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -1401,11 +1401,9 @@ public class PackageParser { } SigningDetails verified; if (skipVerify) { - // systemDir APKs are already trusted, save time by not verifying; since the signature - // is not verified and some system apps can have their V2+ signatures stripped allow - // pulling the certs from the jar signature. + // systemDir APKs are already trusted, save time by not verifying verified = ApkSignatureVerifier.unsafeGetCertsWithoutVerification( - apkPath, SigningDetails.SignatureSchemeVersion.JAR); + apkPath, minSignatureScheme); } else { verified = ApkSignatureVerifier.verify(apkPath, minSignatureScheme); } diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java index dce242c9d87c5..e1d34dc3f622b 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java @@ -3038,11 +3038,9 @@ public class ParsingPackageUtils { SigningDetails verified; try { if (skipVerify) { - // systemDir APKs are already trusted, save time by not verifying; since the - // signature is not verified and some system apps can have their V2+ signatures - // stripped allow pulling the certs from the jar signature. + // systemDir APKs are already trusted, save time by not verifying verified = ApkSignatureVerifier.unsafeGetCertsWithoutVerification( - baseCodePath, SigningDetails.SignatureSchemeVersion.JAR); + baseCodePath, minSignatureScheme); } else { verified = ApkSignatureVerifier.verify(baseCodePath, minSignatureScheme); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index c0486443b97ec..b5957052d5a85 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -15193,17 +15193,15 @@ public class PackageManagerService extends IPackageManager.Stub } } - // If the package is not on a system partition ensure it is signed with at least the - // minimum signature scheme version required for its target SDK. - if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) == 0) { - int minSignatureSchemeVersion = - ApkSignatureVerifier.getMinimumSignatureSchemeVersionForTargetSdk( - pkg.getTargetSdkVersion()); - if (pkg.getSigningDetails().signatureSchemeVersion < minSignatureSchemeVersion) { - throw new PackageManagerException(INSTALL_PARSE_FAILED_NO_CERTIFICATES, - "No signature found in package of version " + minSignatureSchemeVersion - + " or newer for package " + pkg.getPackageName()); - } + // Ensure the package is signed with at least the minimum signature scheme version + // required for its target SDK. + int minSignatureSchemeVersion = + ApkSignatureVerifier.getMinimumSignatureSchemeVersionForTargetSdk( + pkg.getTargetSdkVersion()); + if (pkg.getSigningDetails().signatureSchemeVersion < minSignatureSchemeVersion) { + throw new PackageManagerException(INSTALL_PARSE_FAILED_NO_CERTIFICATES, + "No signature found in package of version " + minSignatureSchemeVersion + + " or newer for package " + pkg.getPackageName()); } } }