Sécurité des applications Kotlin : top 10 des vulnérabilités pour débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Sécurité des applications Kotlin : top 10 des vulnérabilités pour débutants

\n\n

Kotlin est un langage de programmation moderne, activement utilisé pour le développement d'applications Android, de solutions serveur (Ktor, Spring Boot) et même de frontend (Kotlin/JS). Cependant, comme tout autre langage, Kotlin est sujet à des vulnérabilités, surtout si le développeur débute. Dans cet article, nous analyserons le top 10 des vulnérabilités des applications Kotlin que tout développeur débutant doit connaître. Nous examinerons des exemples de code et donnerons des conseils pratiques pour les corriger.

\n\n

1. Ignorer la Null Safety

\n

Kotlin est réputé pour sa gestion sécurisée des valeurs nulles (Null Safety). Cependant, les débutants utilisent souvent l'opérateur !! (not-null assertion), ce qui entraîne des NullPointerException.

\n
// Mauvais : risque de NPE\nval name: String? = null\nprintln(name!!.length)\n\n// Bon : appel sécurisé\nprintln(name?.length ?: "Nom absent")
\n

Recommandation : Évitez !!. Utilisez l'opérateur Elvis (?:) ou let/also.

\n\n

2. Stockage non sécurisé des secrets (Hardcoded Secrets)

\n

Stocker des clés API, des jetons et des mots de passe directement dans le code est une erreur grave. Un attaquant peut facilement les extraire du fichier APK.

\n
// Mauvais : jeton dans le code\nval apiToken = "sk-1234567890abcdef"\n\n// Bon : utilisation de BuildConfig ou NDK\n// Dans build.gradle : buildConfigField "String", "API_TOKEN", "\\"${apiToken}\\""
\n

Recommandation : Utilisez des variables d'environnement, BuildConfig ou un stockage sécurisé (Android Keystore).

\n\n

3. Injections SQL dans Android (Room/Exposed)

\n

Même avec un ORM (Object-Relational Mapping), une injection est possible si vous utilisez des requêtes SQL brutes avec concaténation de chaînes.

\n
// Mauvais : vulnérable à l'injection\nval query = "SELECT * FROM users WHERE name = '$userInput'"\n\n// Bon : requête paramétrée\nval query = "SELECT * FROM users WHERE name = ?"\nval cursor = db.rawQuery(query, arrayOf(userInput))
\n

Recommandation : Utilisez toujours des requêtes paramétrées ou des API sécurisées (Room @Query avec paramètres).

\n\n

4. Journalisation non sécurisée

\n

La journalisation de données sensibles (mots de passe, numéros de carte) en production peut entraîner une fuite d'informations.

\n
// Mauvais : journalisation du mot de passe\nLog.d("Auth", "Mot de passe utilisateur : $password")\n\n// Bon : journalisation uniquement du fait\nLog.d("Auth", "Tentative d'authentification utilisateur")
\n

Recommandation : Utilisez des niveaux de journalisation et des filtres. En production, désactivez Log.v et Log.d.

\n\n

5. Mauvaise utilisation de SharedPreferences

\n

SharedPreferences stocke par défaut les données dans un fichier XML sans chiffrement. Si l'appareil est rooté, les données sont accessibles à un attaquant.

\n
// Mauvais : SharedPreferences classiques\nval prefs = context.getSharedPreferences("app_prefs", Context.MODE_PRIVATE)\n\n// Bon : EncryptedSharedPreferences (AndroidX Security)\nval masterKey = MasterKey.Builder(context)\n    .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)\n    .build()\nval encryptedPrefs = EncryptedSharedPreferences.create(\n    context, "secure_prefs", masterKey,\n    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,\n    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM\n)
\n

Recommandation : Pour les données confidentielles, utilisez EncryptedSharedPreferences ou DataStore avec chiffrement.

\n\n

6. Vulnérabilités de désérialisation (JSON/Gson/Moshi)

\n

La désérialisation de données non fiables peut entraîner l'exécution de code arbitraire ou une fuite de mémoire.

\n
// Mauvais : utilisation de Gson sans validation\nval user = Gson().fromJson(jsonString, User::class.java)\n\n// Bon : vali                

Blogs

Book Recommendations