From b07fdf9c019f187de4ad8f697fe44a43daad4f86 Mon Sep 17 00:00:00 2001 From: Lucas Silva Date: Mon, 2 May 2022 21:46:08 +0000 Subject: [PATCH] Revert "Merge "Restore V2+ signature requirement for system apps" into tm-dev am: a347b6c2e6 am: 8aa6d20125" This reverts commit 613c328e138e4ff7445c53d8407475e4ba056f3d. Bug: 230910314 Bug: 231165527 Change-Id: If4e49842ddcba42f01c629da54d14bc2d78d541e Merged-In: a199b313075d10076e80b9275bbfc00c7dbad419 (cherry picked from commit a199b313075d10076e80b9275bbfc00c7dbad419) --- .../java/android/content/pm/PackageParser.java | 6 ++++-- .../server/pm/InstallPackageHelper.java | 4 ++-- .../android/server/pm/ScanPackageUtils.java | 18 ++++++++++-------- .../pm/pkg/parsing/ParsingPackageUtils.java | 6 ++++-- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 44dc28d2b0faf..4d4a57db84bea 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -1414,9 +1414,11 @@ public class PackageParser { final ParseTypeImpl input = ParseTypeImpl.forDefaultParsing(); final ParseResult result; if (skipVerify) { - // systemDir APKs are already trusted, save time by not verifying + // 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. result = ApkSignatureVerifier.unsafeGetCertsWithoutVerification( - input, apkPath, minSignatureScheme); + input, apkPath, SigningDetails.SignatureSchemeVersion.JAR); } else { result = ApkSignatureVerifier.verify(input, apkPath, minSignatureScheme); } diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 57a1fe04b6901..2d8d4f5881925 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -4187,8 +4187,8 @@ final class InstallPackageHelper { assertOverlayIsValid(pkg, parseFlags, scanFlags); } - // Ensure the package is signed with at least the minimum signature scheme version - // required for its target SDK. + // 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. ScanPackageUtils.assertMinSignatureSchemeIsValid(pkg, parseFlags); } } diff --git a/services/core/java/com/android/server/pm/ScanPackageUtils.java b/services/core/java/com/android/server/pm/ScanPackageUtils.java index 0dc188b75d5e9..4e8313bf1891d 100644 --- a/services/core/java/com/android/server/pm/ScanPackageUtils.java +++ b/services/core/java/com/android/server/pm/ScanPackageUtils.java @@ -690,14 +690,16 @@ final class ScanPackageUtils { public static void assertMinSignatureSchemeIsValid(AndroidPackage pkg, @ParsingPackageUtils.ParseFlags int parseFlags) throws PackageManagerException { - int minSignatureSchemeVersion = - ApkSignatureVerifier.getMinimumSignatureSchemeVersionForTargetSdk( - pkg.getTargetSdkVersion()); - if (pkg.getSigningDetails().getSignatureSchemeVersion() - < minSignatureSchemeVersion) { - throw new PackageManagerException(INSTALL_PARSE_FAILED_NO_CERTIFICATES, - "No signature found in package of version " + minSignatureSchemeVersion - + " or newer for package " + pkg.getPackageName()); + if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) == 0) { + int minSignatureSchemeVersion = + ApkSignatureVerifier.getMinimumSignatureSchemeVersionForTargetSdk( + pkg.getTargetSdkVersion()); + if (pkg.getSigningDetails().getSignatureSchemeVersion() + < minSignatureSchemeVersion) { + throw new PackageManagerException(INSTALL_PARSE_FAILED_NO_CERTIFICATES, + "No signature found in package of version " + minSignatureSchemeVersion + + " or newer for package " + pkg.getPackageName()); + } } } diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java index e1ff9ead6740c..9897c42e4cec6 100644 --- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java +++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java @@ -3105,9 +3105,11 @@ public class ParsingPackageUtils { } final ParseResult verified; if (skipVerify) { - // systemDir APKs are already trusted, save time by not verifying + // 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. verified = ApkSignatureVerifier.unsafeGetCertsWithoutVerification(input, baseCodePath, - minSignatureScheme); + SigningDetails.SignatureSchemeVersion.JAR); } else { verified = ApkSignatureVerifier.verify(input, baseCodePath, minSignatureScheme); }