Une courte histoire sur la façon dont la commodité tire parfois dans le genou

Artem Azariev, Chef du Centre de Compétence des Chaînes de Services à Distance de la Direction des Technologies de l'Information de l'ICD

Bonjour, Habr!

Je m'appelle Artyom Azariev, je suis le chef d'équipe de l'équipe Android de la Banque de crédit de Moscou, et aujourd'hui je veux parler de la sécurité des applications du point de vue des bibliothèques de débogage. Il y a quelques années, j'étais engagé en indépendant, puis pendant 4 ans, je me suis engagé dans un développement à part entière pour un système d'exploitation mobile. Il s'est avéré que dans les années de mon travail indépendant dans le but d'améliorer mes propres qualifications, j'ai abordé le sujet de la rétro-ingénierie des applications Android, et progressivement cela est devenu mon hobby.

Présentation


Ce n'est un secret pour personne qu'Android Studio n'a présenté pendant longtemps aucun mécanisme pour recevoir correctement les données d'application de l'appareil: le contenu de la base de données, SharedPrefrences, les requêtes réseau. Tout le monde a souffert, y compris des géants comme Facebook.

Ce sont eux qui ont donné à la communauté une bibliothèque extrêmement utile pour déboguer Shetho (https://github.com/facebook/stetho) avec une intégration très simple dans le projet en quelques lignes seulement. Je ne parlerai pas de la bibliothèque elle-même; très probablement, beaucoup de gens la connaissent déjà, mais peu importe, ils la lisent eux-mêmes.

L'intégration de cette bibliothèque est la suivante:





En utilisant le navigateur Chrome, nous avons accès au contenu des bases de données et aux paramètres stockés sur l'appareil, et si nous connectons le plug-in pour okhttp3, puis également au contenu des demandes réseau.



"Mais bon, ce sera aussi dans la version finale?" - se demandera le développeur attentif. Passons maintenant à la description de la bibliothèque - que nous conseille-t-on à ce sujet?

L'exemple de projet montre que cette bibliothèque doit être initialisée uniquement dans la branche de débogage en surchargeant le manifeste dans l'une des options de génération.



Nous assemblons l'assemblage de libération avec la minification activée (indicateur minifyEnabled). Nous vérifions le navigateur, nous ne voyons aucune application disponible pour le débogage et nous nous mettons tranquillement en veille.

La minification est un processus visant à réduire la taille du code source en supprimant les caractères inutiles sans modifier sa fonctionnalité. L'outil Proguard utilisé dans Android est également impliqué dans le nettoyage du projet du code inutilisé.

Les pirates


Toute ingénierie inverse de l'application commence par l'étude des signets et des backdoors potentiels, qui ont été aimablement laissés par les développeurs pour eux-mêmes.

Tout d'abord, nous décompilons l'application autant que possible en Java et étudions l'arborescence des packages.



La chose la plus douce que l'on puisse trouver dans l'application attaquée est le bon vieux Stetho. La minification configurée par défaut ne la supprime pas et, en général, la base de code entière de cette bibliothèque se glisse simplement dans une version de production.

J'ai vu beaucoup d'applications d'entreprises assez cool et grandes qui ont laissé une telle bibliothèque dans des builds de production pendant de nombreuses années.

Quelqu'un demandera: «Et qu'est-ce que c'est? C'est éteint. De plus, même si vous l'activez, essayez de créer cette application plus tard. »

Certes, la décompilation en Java ne donne presque jamais 100% de code de travail. Mais il y a smali / backsmali.
Smali / backsmali est un assembleur / désassembleur pour le format dex utilisé par dalvik, une implémentation de Java VM dans Android.

En démontant notre application, nous verrons que rien n'est vraiment inclus.



Mais, après avoir ajouté quelques lignes et avoir dans le projet tout le code de la bibliothèque, nous pouvons, sans forcer particulièrement, le réactiver.



Pour le plugin okhttp3, la prise en charge est également activée de la même manière - en ajoutant un intercepteur à OkhttpClient.

Après avoir récupéré l'application (et il est facile de le faire à partir de smali), nous voyons que le débogage via stetho est à nouveau disponible, et toutes vos données dans le référentiel des paramètres locaux, toute votre api est complètement devant les yeux des pirates informatiques rusés.

Que faire?


Il existe de nombreuses options pour exclure le package de la version finale. Personnellement, je préfère écrire un petit wrapper pour initialiser la bibliothèque Stetho et décomposer ses différentes implémentations en fonction des options d'assemblage.
libérer



déboguer



Et indiquez également que cette base de code n'est nécessaire que dans la version de débogage.



Peut expirer


Je voudrais conclure en exprimant les principes de base que j'utilise lorsque je travaille dans le contexte de la sécurité des applications Android:

  • Minimisez et, si possible, obscurcissez tout ce que vous obtenez.

    Dans tous les cas, cela complique l'analyse du code décompilé. Un argument supplémentaire pour créer des cheveux gris sur la tête du pirate sera le drapeau repackageclasses, qui déplacera les classes minifiées dans un seul paquet. Il y en aura beaucoup.
  • Explorez vos propres applications.

    Au moins une inspection rapide de l'arborescence de vos packages peut en dire long sur la structure utilisée dans le projet, les frameworks, les bibliothèques. Ce qui n'appartient manifestement pas à cet endroit devrait être impitoyablement retiré.
  • N'importe quel outil peut vous tirer tôt ou tard dans le genou.

Lorsque vous ajoutez quelque chose à votre projet, même pour de bonnes raisons, pensez à le faire correctement et à combien vous en avez besoin.

J'espère que mon expérience vous sera utile.

Source: https://habr.com/ru/post/fr471738/


All Articles