Sécurité des applications Kotlin : top 10 des vulnérabilités et méthodes de protection
Kotlin est l'un des langages de programmation à la croissance la plus rapide, utilisé pour le développement d'applications Android, de solutions serveur et de projets multiplateformes. Malgré les mécanismes de sécurité intégrés (null safety, immuabilité des données), les développeurs commettent souvent des erreurs qui entraînent de graves vulnérabilités. Dans cet article, nous analyserons le top 10 des vulnérabilités des applications Kotlin et montrerons comment les éviter.
1. Mauvaise gestion des types nullable (Null Safety)
L'un des points forts de Kotlin est son système de types nullable. Cependant, les développeurs abusent souvent de l'opérateur !! (not-null assertion), ce qui provoque une NullPointerException à toute valeur null inattendue.
Exemple de vulnérabilité :
fun getUserName(user: User?): String { return user!!.name // Si user = null, l'application plante}Comment corriger :
fun getUserName(user: User?): String { return user?.name ?: "Invité" // Appel sécurisé avec valeur par défaut}Recommandation : Utilisez ?.let, ?: (elvis) et les safe casts. Évitez !! dans le code de production.
2. Injections SQL dans les applications serveur
Lors du travail avec des bases de données via JDBC ou Exposed, les développeurs concatènent parfois les chaînes de requêtes, ce qui ouvre la voie aux injections SQL.
Exemple de vulnérabilité :
val id = request.getParameter("id")val query = "SELECT * FROM users WHERE id = $id" // Concaténation dangereuseComment corriger :
val id = request.getParameter("id")val stmt = connection.prepareStatement("SELECT * FROM users WHERE id = ?")stmt.setString(1, id) // Utilisation d'une requête paramétréeRecommandation : Utilisez toujours PreparedStatement ou des bibliothèques ORM (Exposed, Hibernate) avec paramétrage.
3. Stockage non sécurisé des données (SharedPreferences)
Dans les applications Android, les jetons, mots de passe et autres informations confidentielles sont souvent stockés en clair dans SharedPreferences.
Exemple de vulnérabilité :
val prefs = getSharedPreferences("app_prefs", Context.MODE_PRIVATE)prefs.edit().putString("auth_token", "secret123").apply() // Données en clairComment corriger :
// Utilisez EncryptedSharedPreferences d'AndroidX Securityval masterKey = MasterKey.Builder(context) .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) .build()val prefs = EncryptedSharedPreferences.create( context, "secure_prefs", masterKey, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM)prefs.edit().putString("auth_token", "secret123").apply()Recommandation : Pour stocker des données sensibles, utilisez EncryptedSharedPreferences ou KeyStore.
4. Fuite de données via les logs (Logging)
Les développeurs laissent souvent dans le code des logs qui affichent des mots de passe, jetons ou données personnelles des utilisateurs.
Exemple de vulnérabilité :
Log.d("Auth", "User password: $password") // Le mot de passe apparaît dans les logsComment corriger :
// Utilisez Timber ou un logger personnalisé avec filtrageLog.d("Auth", "User authenticated successfully") // Ne pas journaliser les données sensiblesRecommandation : Activez ProGuard/R8 pour supprimer les logs dans la version release et utilisez des bibliothèques avec masquage des données (par exemple, Timber).
5. WebView non sécurisés (Android)
WebView est un point d'entrée fréquent pour les attaques XSS et les fuites de données si JavaScript est activé et les filtres non configurés.