Introduction : pourquoi la sécurité des applications Swift est cruciale
Swift est un langage de programmation puissant et moderne créé par Apple pour le développement d'applications sous iOS, macOS, watchOS et tvOS. Malgré les mécanismes de sécurité intégrés (ARC, gestion sécurisée de la mémoire, types optionnels), des milliers d'applications deviennent chaque année victimes d'attaques en raison d'erreurs de développeurs. Selon le rapport OWASP Mobile Top 10, la plupart des vulnérabilités dans les applications mobiles surviennent côté client. Dans cet article, nous analyserons les 10 vulnérabilités les plus courantes des applications Swift, fournirons des exemples de code et montrerons comment les éviter.
1. Stockage non sécurisé des données (Insecure Data Storage)
Problème
Les développeurs sauvegardent souvent des données confidentielles (jetons, mots de passe, clés API) dans UserDefaults, des fichiers Plist ou Core Data sans chiffrement. Sur les appareils jailbreakés, un attaquant peut facilement y accéder.
Exemple de code vulnérable
// Code vulnérableUserDefaults.standard.set("secret_token_123", forKey: "api_token")UserDefaults.standard.set("password123", forKey: "user_password")Solution
Utilisez le Keychain pour stocker les données sensibles. Swift dispose de wrappers pratiques, comme KeychainSwift ou le framework Security.
// Stockage sécurisé avec Keychainimport KeychainSwift
let keychain = KeychainSwift()keychain.set("secret_token_123", forKey: "api_token")keychain.set("password123", forKey: "user_password", withAccess: .accessibleWhenUnlockedThisDeviceOnly)2. Injection de code et injections SQL (Code Injection & SQL Injection)
Problème
Si votre application utilise SQLite, Core Data avec NSPredicate ou WebView pour afficher du contenu web, un attaquant peut injecter du code malveillant via une saisie utilisateur.
Exemple de code vulnérable
// Requête vulnérable à SQLitelet userInput = "1' OR '1'='1"let query = "SELECT * FROM users WHERE id = '\\(userInput)'"Solution
Utilisez des requêtes paramétrées ou NSPredicate avec des substitutions sécurisées.
// Requête sécurisée avec paramètreslet query = "SELECT * FROM users WHERE id = ?"let statement = try db.prepare(query)try statement.bind(1, userInput)3. Communication réseau non sécurisée (Insecure Network Communication)
Problème
Utilisation de HTTP au lieu de HTTPS, ignorance des certificats SSL (App Transport Security) ou envoi de données sans chiffrement.
Exemple de code vulnérable
// Code vulnérable : désactivation de ATSlet url = URL(string: "http://example.com/api/login")!let task = URLSession.shared.dataTask(with: url) { data, response, error in // Traitement de données non sécurisées}Solution
Configurez App Transport Security (ATS) dans Info.plist et utilisez HTTPS. Pour la vérification des certificats, appliquez le SSL pinning.
// Requête sécurisée avec SSL Pinning (exemple avec Alamofire)let evaluator = PinnedCertificatesTrustEvaluator(certificates: [certificate])let session = Session(serverTrustManager: ServerTrustManager(evaluators: ["example.com": evaluator]))session.request("https://example.com/api/login").responseJSON { response in // Traitement de données sécurisées}4. Injection via WebView (WebView Injection)
Problème
Le chargement de contenu HTML avec des données utilisateur dans WKWebView sans assainissement peut entraîner des attaques XSS et le vol de cookies.
Exemple de code vulnérable
// Code vulnérablelet userComment = "<script>alert('XSS')</script>"let html