Résumé
L'avertissement que vous avez rencontré ne s'applique qu'à la signature APK v1, mais comme le fichier APK est signé avec des signatures supplémentaires des schémas de signature plus récents, vous pouvez ignorer ce message en toute sécurité car chaque modification sur le fichier APK peut être détectée par les schémas de signature plus récents.
Cependant, même si la signature peut être vérifiée, cela ne signifie pas que le fichier APK est authentique. Il peut encore être modifié, c'est pourquoi vous devez comparer attentivement les digests du certificat (affichés lors de la vérification à l'aide de l'option apksigner verify --verbose --print-certs
) de l'APK à vérifier et le comparer aux autres fichiers APK du même développeur d'applications. Voir cette réponse de Comment puis-je vérifier l'authenticité d'un fichier APK que j'ai téléchargé ? pour savoir comment comparer le certificat digest d'un APK.
Explication détaillée
Tout d'abord, comme vous pouvez le constater, vous obtenez un WARNING et non un ERREUR. Si le ou les fichiers concernés du fichier APK ont été modifiés, la vérification échouera et vous obtiendrez un message d'ERREUR.
Pour comprendre le message d'avertissement, vous devez avoir quelques notions de Java et du fonctionnement des signatures Java (signature APK v1). Cette ancienne signature est stockée à l'intérieur du JAR dans deux fichiers : META-INF/CERT.SF
y META-INF/CERT.RSA
. Bien entendu, une signature ne peut pas signer les fichiers dans lesquels elle est écrite, et ces fichiers sont donc exclus par la signature.
En outre, le répertoire META-INF est l'emplacement de l'interface utilisateur de l'utilisateur. MANIFEST.MF
- un fichier qui n'est pertinent que pour Java sur le bureau mais qui n'est pas du tout utilisé par Android.
Il peut y avoir des fichiers supplémentaires dans le répertoire META-INF, compte tenu de la disposition standard des répertoires Java, aucun code ne doit être stocké dans les fichiers du répertoire META-INF.
En raison de tout cela, Sun, en tant qu'inventeur original de Java, a décidé d'exclure le répertoire META-INF de la signature du code Java. Plusieurs années plus tard, Google a simplement utilisé la signature Java pour les fichiers APK, qui est maintenant connue sous le nom de signature APK v1.
Par conséquent, pour la signature APK v1, les fichiers à l'intérieur du répertoire META-INF ne sont pas couverts par la signature et peuvent donc être modifiés sans être reconnus si vous vérifiez seulement
En raison de plusieurs attaques contre la signature APK elle-même (comme l'inclusion du même fichier plusieurs fois avec un contenu différent dans l'APK), Google a décidé de développer une signature APK entièrement nouvelle qui ne s'applique pas au contenu de l'APK mais à l'ensemble du fichier APK lui-même. Ce fut le début de la signature APK v2 et de ses successeurs.
Ces nouveaux systèmes de signature d'APK signent le contenu complet de l'APK en une seule fois, sans exclure un seul fichier stocké à l'intérieur du fichier APK.
Pour en revenir à l'APK de Google Podcast, sa vérification à l'aide d'apksigner donne le résultat suivant :
java -jar apksigner.jar verify --verbose "Google Podcasts Discover free trending podcasts_v1.0.0.301897054_apkpure.com.apk"
Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): true
Verified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: false
Number of signers: 1
WARNING: META-INF/services/com.google.protobuf.GeneratedExtensionRegistryLoader not protected by signature. Unauthorized modifications to this JAR entry will not be detected. Delete or move the entry outside of META-INF/.
Comme vous pouvez le constater, le fichier APK est signé non seulement par une signature v1 mais aussi par une signature v2, v3 et v4. Cela signifie que le WARNING ne s'applique qu'à la signature créée par le schéma v1. Vous pouvez facilement vérifier cela en modifiant un seul caractère dans le fichier META-INF/services/com.google.protobuf.GeneratedExtensionRegistryLoader
car il est stocké non compressé dans le fichier APK. Vous pouvez simplement ouvrir le fichier APK dans un éditeur hexadécimal, modifier un caractère dans la section qui appartient à ce fichier (il s'agit de la première entrée ZIP dans l'APK), puis vérifier à nouveau l'APK :
java -jar apksigner.jar verify --verbose "Google Podcasts Discover free trending podcasts_v1.0.0.301897054_apkpure.com - modified.apk"
DOES NOT VERIFY
ERROR: APK Signature Scheme v3 signer #1: APK integrity check failed. CHUNKED_SHA256 digest mismatch. Expected: <ac8a15569352655a22f13d3c565c2c0e5c62dc70c8f6f8c10f6fbfa63decb19b>, actual: <aa5622cd904500c38424562ef4b5be9e5716d10a85985a41f35e4ed834cee8fe>
ERROR: APK Signature Scheme v3 signer #1: APK integrity check failed. VERITY_CHUNKED_SHA256 digest mismatch. Expected: <56eeebd545733fd6408cd6a30b8bcf98a557076167902b6d9502b5aca86b78e89b42220000000000>, actual: <c37e1e1436cfd62f89592c48211ffb6ad2f1dff0f69d2203072f1e6c3872a5919b42220000000000>
Comme vous pouvez le voir maintenant, la signature de l'APK est considérée comme invalide. Je ne sais pas pourquoi la signature v3 échoue en premier, peut-être que les signatures ne sont pas vérifiées dans l'ordre v1, v2, v3... D'après ce que je comprends, toutes les signatures sauf la v1 devraient échouer sur le fichier APK modifié.