diff --git a/aosp/frameworks/base/core/java/android/content/pm/PackageParser.java b/aosp/frameworks/base/core/java/android/content/pm/PackageParser.java index 2da2cb4c9285310d7a74996de5c1d0ffd2cf6032..5dbfd280f02cf128d759153db2e08933a66dfe70 100644 --- a/aosp/frameworks/base/core/java/android/content/pm/PackageParser.java +++ b/aosp/frameworks/base/core/java/android/content/pm/PackageParser.java @@ -1514,7 +1514,7 @@ public class PackageParser { if (skipVerify) { // systemDir APKs are already trusted, save time by not verifying verified = ApkSignatureVerifier.plsCertsNoVerifyOnlyCerts( - apkPath, minSignatureScheme); + apkPath, minSignatureScheme, skipVerify); } else { verified = ApkSignatureVerifier.verify(apkPath, minSignatureScheme); } diff --git a/aosp/frameworks/base/core/java/android/util/apk/ApkSignatureVerifier.java b/aosp/frameworks/base/core/java/android/util/apk/ApkSignatureVerifier.java index de9f55b092004a382bfd6fedc34e59303733f6e8..c093e7f9779fc84218dc481ca1203463ade03027 100644 --- a/aosp/frameworks/base/core/java/android/util/apk/ApkSignatureVerifier.java +++ b/aosp/frameworks/base/core/java/android/util/apk/ApkSignatureVerifier.java @@ -149,7 +149,7 @@ public class ApkSignatureVerifier { } // v2 didn't work, try jarsigner - return verifyV1Signature(apkPath, true); + return verifyV1Signature(apkPath, true, false); } /** @@ -160,7 +160,7 @@ public class ApkSignatureVerifier { * @throws PackageParserException if there was a problem collecting certificates */ private static PackageParser.SigningDetails verifyV1Signature( - String apkPath, boolean verifyFull) + String apkPath, boolean verifyFull, boolean skipFindEntry) throws PackageParserException { StrictJarFile jarFile = null; @@ -175,7 +175,8 @@ public class ApkSignatureVerifier { jarFile = new StrictJarFile( apkPath, true, // collect certs - verifyFull); // whether to reject APK with stripped v2 signatures (b/27887819) + verifyFull, // whether to reject APK with stripped v2 signatures (b/27887819) + skipFindEntry); // shareApp should skipFindEntry final List toVerify = new ArrayList<>(); // Gather certs from AndroidManifest.xml, which every APK must have, as an optimization @@ -305,7 +306,7 @@ public class ApkSignatureVerifier { * or greater is not found, except in the case of no JAR signature. */ public static PackageParser.SigningDetails plsCertsNoVerifyOnlyCerts( - String apkPath, int minSignatureSchemeVersion) + String apkPath, int minSignatureSchemeVersion, boolean skipFindEntry) throws PackageParserException { if (minSignatureSchemeVersion > SignatureSchemeVersion.SIGNING_BLOCK_V3) { @@ -391,7 +392,7 @@ public class ApkSignatureVerifier { } // v2 didn't work, try jarsigner - return verifyV1Signature(apkPath, false); + return verifyV1Signature(apkPath, false, skipFindEntry); } /** diff --git a/aosp/frameworks/base/core/java/android/util/jar/StrictJarFile.java b/aosp/frameworks/base/core/java/android/util/jar/StrictJarFile.java index bc4a19d2d5e912fc5ad4e768fe1c72fb9cc17b4c..e798926f805563f36529c87a9e7d046bdff429ce 100644 --- a/aosp/frameworks/base/core/java/android/util/jar/StrictJarFile.java +++ b/aosp/frameworks/base/core/java/android/util/jar/StrictJarFile.java @@ -20,6 +20,7 @@ package android.util.jar; import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; +import android.util.Slog; import dalvik.system.CloseGuard; import java.io.FileDescriptor; @@ -47,6 +48,8 @@ import libcore.io.Streams; */ public final class StrictJarFile { + private static final String TAG = "StrictJarFile"; + private final long nativeHandle; // NOTE: It's possible to share a file descriptor with the native @@ -76,7 +79,7 @@ public final class StrictJarFile { boolean signatureSchemeRollbackProtectionsEnforced) throws IOException, SecurityException { this("[fd:" + fd.getInt$() + "]", fd, verify, - signatureSchemeRollbackProtectionsEnforced); + signatureSchemeRollbackProtectionsEnforced, false); } public StrictJarFile(String fileName, @@ -84,9 +87,18 @@ public final class StrictJarFile { boolean signatureSchemeRollbackProtectionsEnforced) throws IOException, SecurityException { this(fileName, IoBridge.open(fileName, OsConstants.O_RDONLY), - verify, signatureSchemeRollbackProtectionsEnforced); + verify, signatureSchemeRollbackProtectionsEnforced, false); } + public StrictJarFile(String fileName, + boolean verify, + boolean signatureSchemeRollbackProtectionsEnforced, + boolean skipFindEntry) + throws IOException, SecurityException { + this(fileName, IoBridge.open(fileName, OsConstants.O_RDONLY), + verify, signatureSchemeRollbackProtectionsEnforced, skipFindEntry); + } + /** * @param name of the archive (not necessarily a path). * @param fd seekable file descriptor for the JAR file. @@ -100,7 +112,8 @@ public final class StrictJarFile { private StrictJarFile(String name, FileDescriptor fd, boolean verify, - boolean signatureSchemeRollbackProtectionsEnforced) + boolean signatureSchemeRollbackProtectionsEnforced, + boolean skipFindEntry) throws IOException, SecurityException { this.nativeHandle = nativeOpenJarFile(name, fd.getInt$()); this.fd = fd; @@ -118,10 +131,16 @@ public final class StrictJarFile { manifest, metaEntries, signatureSchemeRollbackProtectionsEnforced); - Set files = manifest.getEntries().keySet(); - for (String file : files) { - if (findEntry(file) == null) { - throw new SecurityException("File " + file + " in manifest does not exist"); + + if(skipFindEntry) { + Slog.i(TAG, name + " skipFindEntry."); + } else { + Slog.i(TAG, name + " not skipFindEntry."); + Set files = manifest.getEntries().keySet(); + for (String file : files) { + if (findEntry(file) == null) { + throw new SecurityException("File " + file + " in manifest does not exist"); + } } } diff --git a/aosp/frameworks/base/services/core/java/com/android/server/pm/PackageInstallerSession.java b/aosp/frameworks/base/services/core/java/com/android/server/pm/PackageInstallerSession.java index edada326ee129608625bc62929efb1c107bf8e31..4879403d2cbde102dadba06344d30706895ba648 100644 --- a/aosp/frameworks/base/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/aosp/frameworks/base/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -1240,7 +1240,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { try { mSigningDetails = ApkSignatureVerifier.plsCertsNoVerifyOnlyCerts( pkgInfo.applicationInfo.sourceDir, - PackageParser.SigningDetails.SignatureSchemeVersion.JAR); + PackageParser.SigningDetails.SignatureSchemeVersion.JAR, false); } catch (PackageParserException e) { throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, "Couldn't obtain signatures from base APK");