Stockage local mobile : pourquoi votre app fuit des secrets
Le problème fondamental du stockage mobile
Contrairement à une application web où les données sensibles restent côté serveur, une application mobile stocke souvent des informations localement : tokens d'authentification, préférences utilisateur, données en cache, fichiers téléchargés. Chaque donnée stockée sur le device est potentiellement accessible à un attaquant qui a un accès physique ou qui exploite une autre vulnérabilité.
Android : les pièges du stockage
SharedPreferences en clair
Les SharedPreferences sont le mécanisme de stockage clé-valeur le plus utilisé sur Android. Par défaut, elles sont stockées en XML non chiffré dans /data/data/[package]/shared_prefs/. Sur un appareil rooté, ces fichiers sont lisibles. Nous trouvons régulièrement des tokens JWT, des clés API et même des mots de passe dans ces fichiers.
Solution : utilisez EncryptedSharedPreferences de la bibliothèque Jetpack Security. Le chiffrement est transparent pour le développeur.
Bases SQLite non chiffrées
SQLite est utilisé pour le stockage structuré. Sans bibliothèque de chiffrement comme SQLCipher, les bases sont lisibles en clair. Un adb pull sur un appareil rooté ou un backup non chiffré suffit pour extraire l'intégralité des données.
Logs applicatifs
Log.d("auth", "Token: " + token) en mode debug qui reste en production. Les logs sont accessibles via adb logcat et peuvent contenir des tokens, des données utilisateur ou des URL avec des paramètres sensibles.
Cache WebView
Les WebViews mettent en cache le HTML, les cookies et les données de formulaire. Si une WebView affiche des données sensibles, elles peuvent persister dans le cache même après déconnexion.
iOS : les faux-amis de la sécurité
NSUserDefaults
L'équivalent iOS des SharedPreferences. Stocke en clair dans un plist. Ce n'est pas un emplacement sécurisé malgré ce que beaucoup de développeurs pensent. Les données sont dans le backup iTunes et accessibles avec des outils de forensics.
Keychain mal configuré
Le Keychain iOS est sécurisé par conception mais son niveau de protection dépend de la configuration. L'attribut kSecAttrAccessibleAlways rend les données accessibles même quand le device est verrouillé. L'attribut correct pour la plupart des cas est kSecAttrAccessibleWhenUnlockedThisDeviceOnly.
Clipboard
Le presse-papier iOS est partagé entre toutes les applications. Si l'utilisateur copie un mot de passe ou un code 2FA, toute application en arrière-plan peut le lire. Depuis iOS 16, l'utilisateur est averti mais l'accès reste possible.
Background snapshots
Quand une application passe en arrière-plan, iOS capture une capture d'écran pour l'animation de transition. Si l'écran affiche des données sensibles (solde bancaire, informations médicales), cette image est stockée sur le device.
Les données qu'on trouve en audit
Lors de nos analyses, nous trouvons fréquemment :
Règles de base
Demandez un revue externe CleanIssue pour auditer le stockage local de votre application mobile.
Articles liés
Trois analyses proches pour continuer la lecture sur la meme surface de risque.
Sécurité mobile : OWASP MASVS pour iOS et Android
Le référentiel OWASP MASVS décrypté : les catégories de vérification pour sécuriser vos applications mobiles iOS et Android.
Cryptographie en pratique : les erreurs qui rendent votre chiffrement inutile
Les erreurs cryptographiques courantes dans les applications : algorithmes obsolètes, clés mal gérées, modes de chiffrement inadaptés.
Chatbot leaks : 5 façons dont votre bot IA expose vos données
Les chatbots IA d'entreprise fuient des données de 5 manières différentes. Identification des vecteurs et solutions concrètes.
Sources
Analyse éditoriale fondée sur la documentation officielle des éditeurs, projets et autorités concernées.
Services associés
Si ce sujet reflète un risque concret sur votre stack, voici les audits CleanIssue les plus pertinents.