Introdução: por que a segurança de aplicativos Swift é crítica
Swift é uma linguagem de programação poderosa e moderna criada pela Apple para desenvolvimento de aplicativos para iOS, macOS, watchOS e tvOS. Apesar dos mecanismos de segurança integrados (ARC, gerenciamento seguro de memória, tipos opcionais), milhares de aplicativos se tornam vítimas de ataques todos os anos devido a erros de desenvolvedores. De acordo com o relatório OWASP Mobile Top 10, a maioria das vulnerabilidades em aplicativos móveis ocorre no lado do cliente. Neste artigo, analisaremos as 10 vulnerabilidades mais comuns em aplicativos Swift, forneceremos exemplos de código e mostraremos como evitá-las.
1. Armazenamento inseguro de dados (Insecure Data Storage)
Problema
Desenvolvedores frequentemente salvam dados confidenciais (tokens, senhas, chaves de API) em UserDefaults, arquivos Plist ou Core Data sem criptografia. Em dispositivos com jailbreak, um invasor pode facilmente acessá-los.
Exemplo de código vulnerável
// Código vulnerávelUserDefaults.standard.set("secret_token_123", forKey: "api_token")UserDefaults.standard.set("password123", forKey: "user_password")Solução
Use o Keychain para armazenar dados confidenciais. Swift possui wrappers convenientes, como KeychainSwift ou o framework Security.
// Armazenamento seguro com Keychainimport KeychainSwift
let keychain = KeychainSwift()keychain.set("secret_token_123", forKey: "api_token")keychain.set("password123", forKey: "user_password", withAccess: .accessibleWhenUnlockedThisDeviceOnly)2. Injeção de código e SQL Injection (Code Injection & SQL Injection)
Problema
Se seu aplicativo usa SQLite, Core Data com NSPredicate ou WebView para exibir conteúdo web, um invasor pode injetar código malicioso através da entrada do usuário.
Exemplo de código vulnerável
// Consulta vulnerável ao SQLitelet userInput = "1' OR '1'='1"let query = "SELECT * FROM users WHERE id = '\\(userInput)'"Solução
Use consultas parametrizadas ou NSPredicate com substituições seguras.
// Consulta segura com parâmetroslet query = "SELECT * FROM users WHERE id = ?"let statement = try db.prepare(query)try statement.bind(1, userInput)3. Comunicação de rede insegura (Insecure Network Communication)
Problema
Uso de HTTP em vez de HTTPS, ignorar certificados SSL (App Transport Security) ou enviar dados sem criptografia.
Exemplo de código vulnerável
// Código vulnerável: desabilitando ATSlet url = URL(string: "http://example.com/api/login")!let task = URLSession.shared.dataTask(with: url) { data, response, error in // Processamento de dados não seguros}Solução
Configure o App Transport Security (ATS) no Info.plist e use HTTPS. Para verificação de certificados, aplique SSL pinning.
// Requisição segura com SSL Pinning (exemplo com 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 // Processamento de dados seguros}4. Injeção via WebView (WebView Injection)
Problema
Carregar conteúdo HTML com dados do usuário em WKWebView sem sanitização pode levar a ataques XSS e roubo de cookies.
Exemplo de código vulnerável
// Código vulnerávellet userComment = "<script>alert('XSS')</script>"let html