Merge "Revert "Revert "Merge "Restore V2+ signature requirement for system apps" into tm-dev am: a347b6c2e6 am: 8aa6d20125""" into tm-d1-dev am: c2da54f24e am: 20adc38129

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18409337

Change-Id: Ide661c30713cf5a105ee20f4c4b95c89481994b0
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Michael Groover
2022-05-20 12:49:13 +00:00
committed by Automerger Merge Worker
4 changed files with 14 additions and 20 deletions

View File

@@ -1414,11 +1414,9 @@ public class PackageParser {
final ParseTypeImpl input = ParseTypeImpl.forDefaultParsing(); final ParseTypeImpl input = ParseTypeImpl.forDefaultParsing();
final ParseResult<android.content.pm.SigningDetails> result; final ParseResult<android.content.pm.SigningDetails> result;
if (skipVerify) { if (skipVerify) {
// systemDir APKs are already trusted, save time by not verifying; since the signature // systemDir APKs are already trusted, save time by not verifying
// is not verified and some system apps can have their V2+ signatures stripped allow
// pulling the certs from the jar signature.
result = ApkSignatureVerifier.unsafeGetCertsWithoutVerification( result = ApkSignatureVerifier.unsafeGetCertsWithoutVerification(
input, apkPath, SigningDetails.SignatureSchemeVersion.JAR); input, apkPath, minSignatureScheme);
} else { } else {
result = ApkSignatureVerifier.verify(input, apkPath, minSignatureScheme); result = ApkSignatureVerifier.verify(input, apkPath, minSignatureScheme);
} }

View File

@@ -4199,8 +4199,8 @@ final class InstallPackageHelper {
assertOverlayIsValid(pkg, parseFlags, scanFlags); assertOverlayIsValid(pkg, parseFlags, scanFlags);
} }
// If the package is not on a system partition ensure it is signed with at least the // Ensure the package is signed with at least the minimum signature scheme version
// minimum signature scheme version required for its target SDK. // required for its target SDK.
ScanPackageUtils.assertMinSignatureSchemeIsValid(pkg, parseFlags); ScanPackageUtils.assertMinSignatureSchemeIsValid(pkg, parseFlags);
} }
} }

View File

@@ -690,16 +690,14 @@ final class ScanPackageUtils {
public static void assertMinSignatureSchemeIsValid(AndroidPackage pkg, public static void assertMinSignatureSchemeIsValid(AndroidPackage pkg,
@ParsingPackageUtils.ParseFlags int parseFlags) throws PackageManagerException { @ParsingPackageUtils.ParseFlags int parseFlags) throws PackageManagerException {
if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) == 0) { int minSignatureSchemeVersion =
int minSignatureSchemeVersion = ApkSignatureVerifier.getMinimumSignatureSchemeVersionForTargetSdk(
ApkSignatureVerifier.getMinimumSignatureSchemeVersionForTargetSdk( pkg.getTargetSdkVersion());
pkg.getTargetSdkVersion()); if (pkg.getSigningDetails().getSignatureSchemeVersion()
if (pkg.getSigningDetails().getSignatureSchemeVersion() < minSignatureSchemeVersion) {
< minSignatureSchemeVersion) { throw new PackageManagerException(INSTALL_PARSE_FAILED_NO_CERTIFICATES,
throw new PackageManagerException(INSTALL_PARSE_FAILED_NO_CERTIFICATES, "No signature found in package of version " + minSignatureSchemeVersion
"No signature found in package of version " + minSignatureSchemeVersion + " or newer for package " + pkg.getPackageName());
+ " or newer for package " + pkg.getPackageName());
}
} }
} }

View File

@@ -3108,11 +3108,9 @@ public class ParsingPackageUtils {
} }
final ParseResult<SigningDetails> verified; final ParseResult<SigningDetails> verified;
if (skipVerify) { if (skipVerify) {
// systemDir APKs are already trusted, save time by not verifying; since the // systemDir APKs are already trusted, save time by not verifying
// 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, verified = ApkSignatureVerifier.unsafeGetCertsWithoutVerification(input, baseCodePath,
SigningDetails.SignatureSchemeVersion.JAR); minSignatureScheme);
} else { } else {
verified = ApkSignatureVerifier.verify(input, baseCodePath, minSignatureScheme); verified = ApkSignatureVerifier.verify(input, baseCodePath, minSignatureScheme);
} }