Ingénierie inverse de l'application Android Subway

C'est formidable de constater l'adoption croissante de l'épinglage de certificats dans les applications Android. Lorsque je rencontre une application qui génère des erreurs de connexion lors d’une tentative de proxy de requêtes, j’ai tendance à m’intéresser davantage à approfondir. Ce fut le cas lorsque j'ai récemment utilisé l'application Subway. L’inversion de l’APK a révélé l’épinglage du certificat parmi d’autres découvertes intéressantes.

Le démarrage de l'application pendant le proxy des requêtes a provoqué cette erreur :

L’épinglage est assez simple à contourner. J'ai commencé par décompiler l'application et analyser le code source pour épingler des mots-clés. En fait, j'ai trouvé des implémentations épinglées dans deux classes distinctes qui implémentaient X509TrustManager. Voici l'une des méthodes qui ont imposé l'épinglage :

 // Code removed at request of Subway leadership

Contourner cela était aussi simple que d'ajouter une instruction return dans le code smali pour ignorer le code d'épinglage dans la méthode ci-dessus. Notez l'ajout du retour nul déclaration ci-dessous :

 // Code removed at request of Subway leadership

Après avoir recompilé l'application et installé, j'ai été surpris de voir cette nouvelle erreur :

Subway utilisait un processus de vérification de signature d'application personnalisé afin d'empêcher l'inversion de son APK. En recherchant la source des mentions de ce processus, je l'ai retracé à la méthode suivante :

 // Code removed at request of Subway leadership

Il s’agissait d’une tentative intéressante pour empêcher l’ingénierie inverse, même si elle n’a en réalité provoqué qu’un léger retard. Afin de contourner ce processus, j'ai simplement ajouté une ligne pour sauter l'exécution de la méthode en ajoutant une autre retour nul ligne, similaire au processus de contournement d’épinglage ci-dessus.

 // Code removed at request of Subway leadership

Après avoir recompilé et installé l'application, j'ai réussi à envoyer des requêtes proxy :

Au cours de mes recherches, je suis tombé sur ce message Reddit. Apparemment, Subway déterminait également si l'appareil de l'utilisateur avait été rooté. J'ai cherché dans la source et confirmé les mentions de méthodes de détection de racine.

 // Code removed at request of Subway leadership

C'est un excellent exemple d'application prenant la sécurité très au sérieux, mais je ne suis pas sûr du raisonnement derrière le processus de vérification racine. Bien que les techniques d’épinglage de certificat et de vérification de signature soient généralement une bonne idée, elles n’entravent que légèrement le processus d’ingénierie inverse.