Vérifiez qu'un APK a été créé à partir du code source donné

10

Pour la même application, j'ai:

  • un APK depuis une boutique d'applications,
  • ce qui est censé être le code source de la même version. Avec un script et une structure de construction Gradle assez habituels.

Je veux vérifier si l'APK a vraiment été construit à partir de ce code source ou non.
Comment vérifier ça?

Remarques:

  • L'APK n'est pas masqué.
  • Je n'ai aucune raison de faire confiance à la signature de qui que ce soit. Je ne fais confiance qu'au code source.
  • J'ai déjà créé l'application pour moi, mais maintenant je veux savoir si l'APK était OK ou non.
  • De préférence avec les outils de ligne de commande Linux, mais tout outil est OK.
Nicolas Raoul
la source
2
Je n'ai pas essayé cela, mais vous devriez pouvoir utiliser Apktool à cette fin: rétroconcevoir les deux .apkfichiers, puis exécuter un diff par rapport aux répertoires résultants. La seule différence devrait alors être la signature (qui ne peut pas correspondre pour des raisons évidentes). En y réfléchissant: décompresser simplement les .apkfichiers et faire un diff binaire devrait faire de même. Les deux nécessiteraient bien sûr d'avoir utilisé les mêmes versions de bibliothèque, etc. lors de la compilation en premier lieu :)
Izzy
@Izzy: " mêmes versions de bibliothèque ": la version de l'API est écrite dans le manifeste et la version des bibliothèques dans le script Gradle, donc cette partie devrait être OK, je suppose. Une liste de fichiers / dossiers qui peuvent être ignorés en ferait une excellente réponse (bonus pour les lignes de commande réelles).
Nicolas Raoul
1
Je pourrais le faire si j'étais sur mon ordinateur à la maison, ce que je ne suis pas actuellement. Mais pour que ce soit une "réponse honorable", je devrais d'abord l'essayer moi-même :) Si j'oublie (et que personne d'autre ne l'a fait avant moi), n'hésitez pas à m'envoyer un autre ping (par exemple dans le chat) dans environ 8..10h :)
Izzy
@Izzy La diffméthode semble soignée ... mais que faire si les gars de l'App Store ont obscurci l'APK lors de sa compilation?
Grimoire
À mon humble avis, c'est là qu'Apktool entre en jeu. Avez-vous vérifié le lien? Jetez également un œil à LibRadar qui l'utilise. AFAIR cela aide à désobscurcir (quelque chose doit, ou LibRadar aurait du mal à détecter ces bibliothèques).
Izzy

Réponses:

2

Vous ne pouvez le faire qu'avec des versions reproductibles:

"Une version est reproductible si elle reçoit le même code source, le même environnement de génération et les mêmes instructions de génération, toute partie peut recréer des copies identiques bit par bit de tous les artefacts spécifiés."

Le développeur de l'application ou l'App Store doit donc être intégré pour que cela fonctionne.
Sinon, votre seule option est de le construire vous-même.

Un exemple de développeur qui le fait actuellement est Open Whisper Systems: https://github.com/WhisperSystems/Signal-Android/wiki/Reproducible-Builds

andDevW
la source
Très intéressant! Alors, êtes-vous sûr que la comparaison ne peut se faire sans que le développeur soit à bord? Malheureusement (mais il est compréhensible) la plupart des applications open source n'utilisent pas Docker ou similaire pour les builds, elles sont simplement construites sur le système que le responsable exécute.
Nicolas Raoul
Il n'est pas nécessaire d'être le développeur, tant que la personne qui construit l'application à partir de la source permet de recréer exactement son environnement de construction. Les dépendances peuvent être très pénibles lors de la configuration de ces types de builds.
andDevW
"recréer exactement leur environnement de construction": est-il possible de deviner? Par exemple, si pour une raison quelconque, la construction sur Mac ou Linux produit un APK différent, puis-je deviner si l'APK de l'App Store a été construit sur Mac ou Linux?
Nicolas Raoul
Il n'est pas possible de deviner et d'obtenir des résultats significatifs. Finalement, cela sera plus facile à mettre en œuvre et vous verrez de plus en plus de projets open source le faire.
andDevW
1

Une grande chose à propos de Java et des APK est que vous pouvez décompiler complètement l'APK en code source Java.

Cependant, le code source résultant n'est pas garanti d'être identique.

Une bonne façon d'essayer de faire correspondre le code source résultant avec une révision connue est de vérifier quelles modifications ont été apportées directement avant et après la validation connue dans le référentiel, et de voir si ces modifications sont également présentes dans la source décompilée.

Pour décompiler, utilisez dex2jar et JD-Gui .

edit Je viens de remarquer que vous vouliez des outils Linux. Ma seule expérience est avec Windows, mais je suis sûr que des outils similaires existent pour Linux.

Mark Ch
la source
Si je comprends bien, votre méthode consiste à vérifier la dernière modification dans le référentiel du code source, puis à décompiler l'APK et à vérifier manuellement si la dernière modification se trouve également dans le code décompilé, non? Approche intéressante, mais cela ne me dira pas si une annonce d'appel ou une annonce intégrée a été ajoutée à la version APK, non?
Nicolas Raoul
1
C'est une approche que j'ai utilisée au bureau pour essayer de faire correspondre un APK inconnu à une révision source, ce qui a été assez bon si vous savez que vous pouvez faire confiance aux développeurs. Mais comme vous le dites, il est probablement encore possible pour une partie non digne de confiance de se faufiler quelque chose. J'espère que quelqu'un fournira une réponse plus définitive, serait également utile pour moi.
Mark Ch
Que diriez-vous de compiler la source dans l'APK vous-même, puis de la décompiler en code source et de la comparer à la source décompilée de Play Store APK? Quelqu'un at-il essayé cela?
Sergiy Belozorov
1
@SergiyBelozorov désolé, je ne peux pas répondre à cela, je ne travaille plus vraiment avec Android, mais cela semble être une très bonne idée.
Mark Ch