Bases des applications Android

Reading time: 21 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

ModÚle de sécurité Android

Il y a deux couches :

  • Le systĂšme d'exploitation, qui maintient les applications installĂ©es isolĂ©es les unes des autres.
  • L'application elle-mĂȘme, qui permet aux dĂ©veloppeurs de dĂ©voiler certaines fonctionnalitĂ©s et configure les capacitĂ©s de l'application.

SĂ©paration des UID

Chaque application se voit attribuer un identifiant utilisateur spĂ©cifique. Cela se fait lors de l'installation de l'application afin que l'application ne puisse interagir qu'avec les fichiers appartenant Ă  son identifiant utilisateur ou les fichiers partagĂ©s. Par consĂ©quent, seule l'application elle-mĂȘme, certains composants du systĂšme d'exploitation et l'utilisateur root peuvent accĂ©der aux donnĂ©es des applications.

Partage des UID

Deux applications peuvent ĂȘtre configurĂ©es pour utiliser le mĂȘme UID. Cela peut ĂȘtre utile pour partager des informations, mais si l'une d'elles est compromise, les donnĂ©es des deux applications seront compromises. C'est pourquoi ce comportement est dĂ©conseillĂ©.
Pour partager le mĂȘme UID, les applications doivent dĂ©finir la mĂȘme valeur android:sharedUserId dans leurs manifestes.

Sandboxing

Le sandboxing des applications Android permet d'exécuter chaque application comme un processus séparé sous un identifiant utilisateur distinct. Chaque processus a sa propre machine virtuelle, donc le code d'une application s'exécute en isolation par rapport aux autres applications.
Depuis Android 5.0(L), SELinux est appliqué. En gros, SELinux a refusé toutes les interactions entre processus et a ensuite créé des politiques pour permettre uniquement les interactions attendues entre eux.

Permissions

Lorsque vous installez une application et qu'elle demande des permissions, l'application demande les permissions configurĂ©es dans les Ă©lĂ©ments uses-permission du fichier AndroidManifest.xml. L'Ă©lĂ©ment uses-permission indique le nom de la permission demandĂ©e dans l'attribut name. Il a Ă©galement l'attribut maxSdkVersion qui arrĂȘte de demander des permissions sur les versions supĂ©rieures Ă  celle spĂ©cifiĂ©e.
Notez que les applications Android n'ont pas besoin de demander toutes les permissions au dĂ©but, elles peuvent Ă©galement demander des permissions dynamiquement, mais toutes les permissions doivent ĂȘtre dĂ©clarĂ©es dans le manifest.

Lorsqu'une application expose une fonctionnalité, elle peut limiter l'accÚs uniquement aux applications ayant une permission spécifiée.
Un élément de permission a trois attributs :

  • Le nom de la permission
  • L'attribut permission-group, qui permet de regrouper des permissions liĂ©es.
  • Le niveau de protection qui indique comment les permissions sont accordĂ©es. Il existe quatre types :
  • Normal : UtilisĂ© lorsqu'il n'y a aucune menace connue pour l'application. L'utilisateur n'est pas tenu de l'approuver.
  • Dangerous : Indique que la permission accorde Ă  l'application demandeuse un accĂšs Ă©levĂ©. Les utilisateurs sont invitĂ©s Ă  les approuver.
  • Signature : Seules les applications signĂ©es par le mĂȘme certificat que celui exportant le composant peuvent se voir accorder la permission. C'est le type de protection le plus fort.
  • SignatureOrSystem : Seules les applications signĂ©es par le mĂȘme certificat que celui exportant le composant ou les applications fonctionnant avec un accĂšs au niveau systĂšme peuvent se voir accorder des permissions.

Applications préinstallées

Ces applications se trouvent gĂ©nĂ©ralement dans les rĂ©pertoires /system/app ou /system/priv-app et certaines d'entre elles sont optimisĂ©es (vous ne trouverez peut-ĂȘtre mĂȘme pas le fichier classes.dex). Ces applications valent la peine d'ĂȘtre vĂ©rifiĂ©es car parfois elles fonctionnent avec trop de permissions (en tant que root).

  • Celles fournies avec le ROM (Android OpenSource Project) AOSP
  • AjoutĂ©es par le fabricant de l'appareil
  • AjoutĂ©es par le fournisseur de tĂ©lĂ©phonie mobile (si achetĂ©es chez eux)

Rooting

Pour obtenir un accÚs root sur un appareil Android physique, vous devez généralement exploiter 1 ou 2 vulnérabilités qui sont souvent spécifiques à l'appareil et à la version.
Une fois l'exploitation réussie, le binaire Linux su est généralement copié dans un emplacement spécifié dans la variable d'environnement PATH de l'utilisateur comme /system/xbin.

Une fois le binaire su configuré, une autre application Android est utilisée pour interagir avec le binaire su et traiter les demandes d'accÚs root comme Superuser et SuperSU (disponible sur le Google Play Store).

caution

Notez que le processus de rooting est trĂšs dangereux et peut endommager gravement l'appareil.

ROMs

Il est possible de remplacer le systÚme d'exploitation en installant un firmware personnalisé. Ce faisant, il est possible d'étendre l'utilité d'un ancien appareil, de contourner les restrictions logicielles ou d'accéder au dernier code Android.
OmniROM et LineageOS sont deux des firmwares les plus populaires Ă  utiliser.

Notez que ce n'est pas toujours nécessaire de rooter l'appareil pour installer un firmware personnalisé. Certains fabricants permettent le déverrouillage de leurs bootloaders de maniÚre bien documentée et sécurisée.

Implications

Une fois un appareil rooté, n'importe quelle application pourrait demander un accÚs en tant que root. Si une application malveillante obtient cet accÚs, elle pourra accéder à presque tout et pourra endommager le téléphone.

Fondamentaux des applications Android

  • Le format des applications Android est appelĂ© format de fichier APK. C'est essentiellement un fichier ZIP (en renommant l'extension de fichier en .zip, le contenu peut ĂȘtre extrait et visualisĂ©).
  • Contenu de l'APK (non exhaustif)
  • AndroidManifest.xml
  • resources.arsc/strings.xml
  • resources.arsc : contient des ressources prĂ©compilĂ©es, comme du XML binaire.
  • res/xml/files_paths.xml
  • META-INF/
  • C'est ici que se trouve le certificat !
  • classes.dex
  • Contient du bytecode Dalvik, reprĂ©sentant le code Java (ou Kotlin) compilĂ© que l'application exĂ©cute par dĂ©faut.
  • lib/
  • Contient des bibliothĂšques natives, sĂ©parĂ©es par architecture CPU dans des sous-rĂ©pertoires.
  • armeabi : code pour processeurs basĂ©s sur ARM
  • armeabi-v7a : code pour processeurs ARMv7 et supĂ©rieurs
  • x86 : code pour processeurs X86
  • mips : code uniquement pour processeurs MIPS
  • assets/
  • Stocke des fichiers divers nĂ©cessaires Ă  l'application, pouvant inclure des bibliothĂšques natives supplĂ©mentaires ou des fichiers DEX, parfois utilisĂ©s par des auteurs de logiciels malveillants pour dissimuler du code supplĂ©mentaire.
  • res/
  • Contient des ressources qui ne sont pas compilĂ©es dans resources.arsc

Dalvik & Smali

Dans le développement Android, Java ou Kotlin est utilisé pour créer des applications. Au lieu d'utiliser la JVM comme dans les applications de bureau, Android compile ce code en bytecode exécutable Dalvik (DEX). Auparavant, la machine virtuelle Dalvik gérait ce bytecode, mais maintenant, l'Android Runtime (ART) prend le relais dans les versions Android plus récentes.

Pour l'ingénierie inverse, Smali devient crucial. C'est la version lisible par l'homme du bytecode DEX, agissant comme un langage d'assemblage en traduisant le code source en instructions de bytecode. Smali et baksmali font référence aux outils d'assemblage et de désassemblage dans ce contexte.

Intents

Les intents sont le principal moyen par lequel les applications Android communiquent entre leurs composants ou avec d'autres applications. Ces objets de message peuvent Ă©galement transporter des donnĂ©es entre des applications ou des composants, similaire Ă  la façon dont les requĂȘtes GET/POST sont utilisĂ©es dans les communications HTTP.

Ainsi, un Intent est essentiellement un message qui est passĂ© entre des composants. Les Intents peuvent ĂȘtre dirigĂ©s vers des composants ou des applications spĂ©cifiques, ou peuvent ĂȘtre envoyĂ©s sans destinataire spĂ©cifique.
Pour simplifier, un Intent peut ĂȘtre utilisĂ© :

  • Pour dĂ©marrer une activitĂ©, gĂ©nĂ©ralement en ouvrant une interface utilisateur pour une application
  • Comme des diffusions pour informer le systĂšme et les applications des changements
  • Pour dĂ©marrer, arrĂȘter et communiquer avec un service en arriĂšre-plan
  • Pour accĂ©der aux donnĂ©es via des ContentProviders
  • Comme des rappels pour gĂ©rer des Ă©vĂ©nements

S'ils sont vulnĂ©rables, les Intents peuvent ĂȘtre utilisĂ©s pour effectuer une variĂ©tĂ© d'attaques.

Filtre d'Intent

Les filtres d'intent définissent comment une activité, un service ou un récepteur de diffusion peut interagir avec différents types d'intents. Essentiellement, ils décrivent les capacités de ces composants, telles que les actions qu'ils peuvent effectuer ou les types de diffusions qu'ils peuvent traiter. L'endroit principal pour déclarer ces filtres est dans le fichier AndroidManifest.xml, bien que pour les récepteurs de diffusion, les coder soit également une option.

Les filtres d'intent sont composés de catégories, d'actions et de filtres de données, avec la possibilité d'inclure des métadonnées supplémentaires. Cette configuration permet aux composants de gérer des Intents spécifiques qui correspondent aux critÚres déclarés.

Un aspect critique des composants Android (activités/services/content providers/récepteurs de diffusion) est leur visibilité ou statut public. Un composant est considéré comme public et peut interagir avec d'autres applications s'il est exported avec une valeur de true ou si un filtre d'intent est déclaré pour lui dans le manifeste. Cependant, il existe un moyen pour les développeurs de garder ces composants privés, garantissant qu'ils n'interagissent pas avec d'autres applications de maniÚre non intentionnelle. Cela se fait en définissant l'attribut exported sur false dans leurs définitions de manifeste.

De plus, les dĂ©veloppeurs ont la possibilitĂ© de sĂ©curiser davantage l'accĂšs Ă  ces composants en exigeant des permissions spĂ©cifiques. L'attribut permission peut ĂȘtre dĂ©fini pour imposer que seules les applications ayant la permission dĂ©signĂ©e puissent accĂ©der au composant, ajoutant une couche supplĂ©mentaire de sĂ©curitĂ© et de contrĂŽle sur qui peut interagir avec lui.

java
<activity android:name=".MyActivity" android:exported="false">
<!-- Intent filters go here -->
</activity>

Intents implicites

Les intents sont créés de maniÚre programmatique à l'aide d'un constructeur Intent :

java
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));

L'Action de l'intention précédemment déclarée est ACTION_SEND et l'Extra est un mailto Uri (l'Extra est l'information supplémentaire que l'intention attend).

Cette intention doit ĂȘtre dĂ©clarĂ©e dans le manifeste comme dans l'exemple suivant :

xml
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

Un intent-filter doit correspondre à l'action, aux données et à la catégorie pour recevoir un message.

Le processus de "rĂ©solution d'intent" dĂ©termine quelle application doit recevoir chaque message. Ce processus prend en compte l'attribut de prioritĂ©, qui peut ĂȘtre dĂ©fini dans la dĂ©claration d'intent-filter, et celui avec la prioritĂ© la plus Ă©levĂ©e sera sĂ©lectionnĂ©. Cette prioritĂ© peut ĂȘtre dĂ©finie entre -1000 et 1000 et les applications peuvent utiliser la valeur SYSTEM_HIGH_PRIORITY. Si un conflit survient, une fenĂȘtre "choisir" apparaĂźt pour que l'utilisateur puisse dĂ©cider.

Intents explicites

Un intent explicite spécifie le nom de la classe qu'il cible :

java
Intent downloadIntent = new (this, DownloadService.class):

Dans d'autres applications, pour accéder à l'intention précédemment déclarée, vous pouvez utiliser :

java
Intent intent = new Intent();
intent.setClassName("com.other.app", "com.other.app.ServiceName");
context.startService(intent);

Pending Intents

Ces derniers permettent à d'autres applications de prendre des actions au nom de votre application, en utilisant l'identité et les autorisations de votre application. Pour construire un Pending Intent, il faut spécifier un intent et l'action à effectuer. Si l'intent déclaré n'est pas explicite (ne déclare pas quel intent peut l'appeler), une application malveillante pourrait effectuer l'action déclarée au nom de l'application victime. De plus, si une action n'est pas spécifiée, l'application malveillante pourra effectuer n'importe quelle action au nom de la victime.

Broadcast Intents

Contrairement aux intents prĂ©cĂ©dents, qui ne sont reçus que par une seule application, les intents de diffusion peuvent ĂȘtre reçus par plusieurs applications. Cependant, Ă  partir de la version API 14, il est possible de spĂ©cifier l'application qui doit recevoir le message en utilisant Intent.setPackage.

Il est également possible de spécifier une autorisation lors de l'envoi de la diffusion. L'application réceptrice devra avoir cette autorisation.

Il existe deux types de diffusions : Normale (asynchrone) et Ordonnée (synchronisée). L'ordre est basé sur la priorité configurée dans l'élément récepteur. Chaque application peut traiter, relayer ou ignorer la diffusion.

Il est possible de envoyer une diffusion en utilisant la fonction sendBroadcast(intent, receiverPermission) de la classe Context.\ Vous pouvez Ă©galement utiliser la fonction sendBroadcast de LocalBroadCastManager qui garantit que le message ne quitte jamais l'application. Avec cela, vous n'aurez mĂȘme pas besoin d'exporter un composant rĂ©cepteur.

Sticky Broadcasts

Ce type de diffusions peut ĂȘtre accessible longtemps aprĂšs leur envoi.
Celles-ci ont été dépréciées au niveau API 21 et il est recommandé de ne pas les utiliser.
Elles permettent à n'importe quelle application d'intercepter les données, mais aussi de les modifier.

Si vous trouvez des fonctions contenant le mot "sticky" comme sendStickyBroadcast ou sendStickyBroadcastAsUser, vérifiez l'impact et essayez de les supprimer.

Dans les applications Android, les deep links sont utilisés pour initier une action (Intent) directement via une URL. Cela se fait en déclarant un schéma d'URL spécifique dans une activité. Lorsque un appareil Android essaie d'accéder à une URL avec ce schéma, l'activité spécifiée dans l'application est lancée.

Le schĂ©ma doit ĂȘtre dĂ©clarĂ© dans le fichier AndroidManifest.xml :

xml
[...]
<activity android:name=".MyActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="examplescheme" />
</intent-filter>
[...]

Le schéma de l'exemple précédent est examplescheme:// (notez également la catégorie BROWSABLE)

Ensuite, dans le champ de données, vous pouvez spécifier le hÎte et le chemin :

xml
<data android:scheme="examplescheme"
android:host="example"
/>

Pour y accéder depuis le web, il est possible de définir un lien comme :

xml
<a href="examplescheme://example/something">click here</a>
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>

Pour trouver le code qui sera exécuté dans l'application, allez à l'activité appelée par le deeplink et recherchez la fonction onNewIntent.

Apprenez Ă  appeler des deep links sans utiliser de pages HTML.

AIDL - Android Interface Definition Language

Le Android Interface Definition Language (AIDL) est conçu pour faciliter la communication entre le client et le service dans les applications Android via la communication interprocessus (IPC). Étant donnĂ© qu'il n'est pas permis d'accĂ©der directement Ă  la mĂ©moire d'un autre processus sur Android, AIDL simplifie le processus en marshalling des objets dans un format compris par le systĂšme d'exploitation, facilitant ainsi la communication entre diffĂ©rents processus.

Concepts Clés

  • Services LiĂ©s : Ces services utilisent AIDL pour l'IPC, permettant aux activitĂ©s ou composants de se lier Ă  un service, de faire des demandes et de recevoir des rĂ©ponses. La mĂ©thode onBind dans la classe du service est essentielle pour initier l'interaction, marquant ainsi un domaine vital pour l'examen de la sĂ©curitĂ© Ă  la recherche de vulnĂ©rabilitĂ©s.

  • Messenger : Fonctionnant comme un service liĂ©, Messenger facilite l'IPC en se concentrant sur le traitement des donnĂ©es via la mĂ©thode onBind. Il est essentiel d'examiner cette mĂ©thode de prĂšs pour toute manipulation de donnĂ©es non sĂ©curisĂ©e ou exĂ©cution de fonctions sensibles.

  • Binder : Bien que l'utilisation directe de la classe Binder soit moins courante en raison de l'abstraction d'AIDL, il est bĂ©nĂ©fique de comprendre que Binder agit comme un pilote au niveau du noyau facilitant le transfert de donnĂ©es entre les espaces mĂ©moire de diffĂ©rents processus. Pour une comprĂ©hension plus approfondie, une ressource est disponible Ă  https://www.youtube.com/watch?v=O-UHvFjxwZ8.

Composants

Cela inclut : Activités, Services, Récepteurs de Diffusion et Fournisseurs.

Activité de Lancement et autres activités

Dans les applications Android, les activités sont comme des écrans, montrant différentes parties de l'interface utilisateur de l'application. Une application peut avoir de nombreuses activités, chacune présentant un écran unique à l'utilisateur.

L'activité de lancement est la principale porte d'entrée d'une application, lancée lorsque vous appuyez sur l'icÎne de l'application. Elle est définie dans le fichier manifeste de l'application avec des intents spécifiques MAIN et LAUNCHER :

html
<activity android:name=".LauncherActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

Toutes les applications n'ont pas besoin d'une activité de lancement, en particulier celles sans interface utilisateur, comme les services en arriÚre-plan.

Les activitĂ©s peuvent ĂȘtre rendues disponibles Ă  d'autres applications ou processus en les marquant comme "exportĂ©es" dans le manifeste. Ce paramĂštre permet Ă  d'autres applications de dĂ©marrer cette activitĂ© :

markdown
<service android:name=".ExampleExportedService" android:exported="true"/>

Cependant, accéder à une activité d'une autre application n'est pas toujours un risque de sécurité. Le problÚme se pose si des données sensibles sont partagées de maniÚre inappropriée, ce qui pourrait entraßner des fuites d'informations.

Le cycle de vie d'une activité commence avec la méthode onCreate, configurant l'interface utilisateur et préparant l'activité pour l'interaction avec l'utilisateur.

Sous-classe d'application

Dans le dĂ©veloppement Android, une application a la possibilitĂ© de crĂ©er une sous-classe de la classe Application, bien que ce ne soit pas obligatoire. Lorsqu'une telle sous-classe est dĂ©finie, elle devient la premiĂšre classe Ă  ĂȘtre instanciĂ©e dans l'application. La mĂ©thode attachBaseContext, si elle est implĂ©mentĂ©e dans cette sous-classe, est exĂ©cutĂ©e avant la mĂ©thode onCreate. Cette configuration permet une initialisation prĂ©coce avant que le reste de l'application ne dĂ©marre.

java
public class MyApp extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// Initialization code here
}

@Override
public void onCreate() {
super.onCreate();
// More initialization code
}
}

Services

Services sont des opĂ©rateurs en arriĂšre-plan capables d'exĂ©cuter des tĂąches sans interface utilisateur. Ces tĂąches peuvent continuer Ă  s'exĂ©cuter mĂȘme lorsque les utilisateurs passent Ă  d'autres applications, rendant les services cruciaux pour des opĂ©rations de longue durĂ©e.

Les services sont polyvalents ; ils peuvent ĂȘtre initiĂ©s de diffĂ©rentes maniĂšres, les Intents Ă©tant la mĂ©thode principale pour les lancer en tant que point d'entrĂ©e d'une application. Une fois qu'un service est dĂ©marrĂ© en utilisant la mĂ©thode startService, sa mĂ©thode onStart entre en action et continue de s'exĂ©cuter jusqu'Ă  ce que la mĂ©thode stopService soit explicitement appelĂ©e. Alternativement, si le rĂŽle d'un service dĂ©pend d'une connexion client active, la mĂ©thode bindService est utilisĂ©e pour lier le client au service, engageant la mĂ©thode onBind pour le passage de donnĂ©es.

Une application intĂ©ressante des services inclut la lecture de musique en arriĂšre-plan ou la rĂ©cupĂ©ration de donnĂ©es rĂ©seau sans entraver l'interaction de l'utilisateur avec une application. De plus, les services peuvent ĂȘtre rendus accessibles Ă  d'autres processus sur le mĂȘme appareil par le biais de l'exportation. Ce n'est pas le comportement par dĂ©faut et nĂ©cessite une configuration explicite dans le fichier Android Manifest :

xml
<service android:name=".ExampleExportedService" android:exported="true"/>

Broadcast Receivers

Les rĂ©cepteurs de diffusion agissent comme des Ă©couteurs dans un systĂšme de messagerie, permettant Ă  plusieurs applications de rĂ©pondre aux mĂȘmes messages du systĂšme. Une application peut enregistrer un rĂ©cepteur de deux maniĂšres principales : via le Manifest de l'application ou dynamiquement dans le code de l'application via l'API registerReceiver. Dans le Manifest, les diffusions sont filtrĂ©es avec des permissions, tandis que les rĂ©cepteurs enregistrĂ©s dynamiquement peuvent Ă©galement spĂ©cifier des permissions lors de l'enregistrement.

Les filtres d'intention sont cruciaux dans les deux méthodes d'enregistrement, déterminant quelles diffusions déclenchent le récepteur. Une fois qu'une diffusion correspondante est envoyée, la méthode onReceive du récepteur est invoquée, permettant à l'application de réagir en conséquence, comme ajuster le comportement en réponse à une alerte de batterie faible.

Les diffusions peuvent ĂȘtre asynchrones, atteignant tous les rĂ©cepteurs sans ordre, ou synchrones, oĂč les rĂ©cepteurs reçoivent la diffusion en fonction des prioritĂ©s dĂ©finies. Cependant, il est important de noter le risque de sĂ©curitĂ© potentiel, car toute application peut se prioriser pour intercepter une diffusion.

Pour comprendre la fonctionnalité d'un récepteur, recherchez la méthode onReceive dans sa classe. Le code de cette méthode peut manipuler l'Intent reçu, soulignant la nécessité de validation des données par les récepteurs, en particulier dans les Diffusions Ordonnées, qui peuvent modifier ou supprimer l'Intent.

Content Provider

Les Fournisseurs de Contenu sont essentiels pour partager des donnĂ©es structurĂ©es entre les applications, soulignant l'importance de la mise en Ɠuvre de permissions pour garantir la sĂ©curitĂ© des donnĂ©es. Ils permettent aux applications d'accĂ©der Ă  des donnĂ©es provenant de diverses sources, y compris des bases de donnĂ©es, des systĂšmes de fichiers ou le web. Des permissions spĂ©cifiques, comme readPermission et writePermission, sont cruciales pour contrĂŽler l'accĂšs. De plus, un accĂšs temporaire peut ĂȘtre accordĂ© via les paramĂštres grantUriPermission dans le manifest de l'application, en utilisant des attributs tels que path, pathPrefix et pathPattern pour un contrĂŽle d'accĂšs dĂ©taillĂ©.

La validation des entrées est primordiale pour prévenir les vulnérabilités, telles que l'injection SQL. Les Fournisseurs de Contenu prennent en charge les opérations de base : insert(), update(), delete(), et query(), facilitant la manipulation et le partage de données entre les applications.

FileProvider, un Fournisseur de Contenu spécialisé, se concentre sur le partage sécurisé de fichiers. Il est défini dans le manifest de l'application avec des attributs spécifiques pour contrÎler l'accÚs aux dossiers, désignés par android:exported et android:resource pointant vers les configurations de dossier. Une prudence est conseillée lors du partage de répertoires pour éviter d'exposer involontairement des données sensibles.

Exemple de déclaration de manifest pour FileProvider :

xml
<provider android:name="androidx.core.content.FileProvider"
android:authorities="com.example.myapp.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>

Et un exemple de spécification des dossiers partagés dans filepaths.xml :

xml
<paths>
<files-path path="images/" name="myimages" />
</paths>

Pour plus d'informations, consultez :

WebViews

Les WebViews sont comme des mini navigateurs web à l'intérieur des applications Android, tirant du contenu soit du web, soit de fichiers locaux. Ils font face à des risques similaires à ceux des navigateurs classiques, mais il existe des moyens de réduire ces risques grùce à des paramÚtres spécifiques.

Android propose deux types principaux de WebView :

  • WebViewClient est excellent pour le HTML de base mais ne prend pas en charge la fonction d'alerte JavaScript, ce qui affecte la maniĂšre dont les attaques XSS peuvent ĂȘtre testĂ©es.
  • WebChromeClient agit davantage comme l'expĂ©rience complĂšte du navigateur Chrome.

Un point clé est que les navigateurs WebView ne partagent pas les cookies avec le navigateur principal de l'appareil.

Pour charger du contenu, des mĂ©thodes telles que loadUrl, loadData et loadDataWithBaseURL sont disponibles. Il est crucial de s'assurer que ces URL ou fichiers sont sĂ»rs Ă  utiliser. Les paramĂštres de sĂ©curitĂ© peuvent ĂȘtre gĂ©rĂ©s via la classe WebSettings. Par exemple, dĂ©sactiver JavaScript avec setJavaScriptEnabled(false) peut prĂ©venir les attaques XSS.

Le "Bridge" JavaScript permet aux objets Java d'interagir avec JavaScript, nécessitant que les méthodes soient marquées avec @JavascriptInterface pour des raisons de sécurité à partir d'Android 4.2.

Autoriser l'accĂšs au contenu (setAllowContentAccess(true)) permet aux WebViews d'accĂ©der aux Content Providers, ce qui pourrait ĂȘtre un risque Ă  moins que les URL de contenu ne soient vĂ©rifiĂ©es comme sĂ©curisĂ©es.

Pour contrĂŽler l'accĂšs aux fichiers :

  • DĂ©sactiver l'accĂšs aux fichiers (setAllowFileAccess(false)) limite l'accĂšs au systĂšme de fichiers, avec des exceptions pour certains actifs, garantissant qu'ils ne sont utilisĂ©s que pour du contenu non sensible.

Autres composants d'application et gestion des appareils mobiles

Signature numérique des applications

  • La signature numĂ©rique est indispensable pour les applications Android, garantissant qu'elles sont authentiquement crĂ©Ă©es avant l'installation. Ce processus utilise un certificat pour l'identification de l'application et doit ĂȘtre vĂ©rifiĂ© par le gestionnaire de paquets de l'appareil lors de l'installation. Les applications peuvent ĂȘtre auto-signĂ©es ou certifiĂ©es par une CA externe, protĂ©geant contre l'accĂšs non autorisĂ© et garantissant que l'application reste intacte lors de sa livraison Ă  l'appareil.

Vérification des applications pour une sécurité renforcée

  • À partir d'Android 4.2, une fonctionnalitĂ© appelĂ©e VĂ©rifier les applications permet aux utilisateurs de faire vĂ©rifier les applications pour leur sĂ©curitĂ© avant l'installation. Ce processus de vĂ©rification peut avertir les utilisateurs contre des applications potentiellement nuisibles, ou mĂȘme empĂȘcher l'installation de celles particuliĂšrement malveillantes, renforçant ainsi la sĂ©curitĂ© des utilisateurs.

Gestion des appareils mobiles (MDM)

  • Les solutions MDM fournissent une supervision et une sĂ©curitĂ© pour les appareils mobiles via l'API d'administration des appareils. Elles nĂ©cessitent l'installation d'une application Android pour gĂ©rer et sĂ©curiser efficacement les appareils mobiles. Les fonctions clĂ©s incluent l'application de politiques de mot de passe, l'obligation de chiffrement des donnĂ©es, et la possibilitĂ© d'effacer des donnĂ©es Ă  distance, garantissant un contrĂŽle et une sĂ©curitĂ© complets sur les appareils mobiles.
java
// Example of enforcing a password policy with MDM
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminComponent = new ComponentName(context, AdminReceiver.class);

if (dpm.isAdminActive(adminComponent)) {
// Set minimum password length
dpm.setPasswordMinimumLength(adminComponent, 8);
}

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks