
Giriş
iOS uygulama güvenliği, Apple ekosisteminin kapalı doğasına rağmen, geliştirici hataları ve yanlış yapılandırmalar yüzünden ciddi açıklar barındırabilir.
Bu makalede iOS güvenlik bileşenlerini, karşılaşılabilecek riskleri ve Swift kod örnekleriyle savunma yöntemlerini adım adım inceleyeceğiz.
Info.plist Güvenliği ve App Transport Security (ATS)
Info.plist, iOS uygulamalarında Android’deki AndroidManifest.xml dosyasına karşılık gelir. Yanlış ATS (App Transport Security) yapılandırması, tüm ağ trafiğini şifrelenmemiş şekilde göndermenize neden olabilir.
ATS, iOS 9 ile tanıtılan ve TLS 1.2+ zorunluluğu getiren bir güvenlik politikasıdır. HTTPS bağlantılarında Forward Secrecy (EFS) ve 256-bit şifreleme (AES-GCM) gerektirir.
MITM Saldırılarına Karşı:
NSAllowsArbitraryLoads kapatılmazsa, saldırganlar SSL Strip veya self-signed sertifika kullanarak trafiği deşifre edebilir.
Yanlış Konfigürasyon (Tehlikeli)
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
Bu ayar tüm trafiği HTTPS dışına çıkarır, MITM saldırılarına davetiye çıkarır.
Doğru Konfigürasyon
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>api.orneksite.com</key>
<dict>
<key>NSIncludesSubdomains</key><true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key><false/>
</dict>
</dict>
</dict>
Swift Kod — Güvenli HTTPS İsteği
import Foundation
func secureRequest() {
guard let url = URL(string: “https://api.orneksite.com/data”) else { return }
let task = URLSession.shared.dataTask(with: url) { data, _, error in
if let error = error {
print(“Hata: \(error)”)
return
}
if let data = data {
print(“Gelen Veri: \(String(data: data, encoding: .utf8) ?? “”)”)
}
}
task.resume()
}
Keychain Kullanımı ile Güvenli Veri Saklama
Hassas verilerin UserDefaults veya düz metin dosyalarda tutulması, jailbreak edilmiş cihazlarda kolayca ifşa olur. Keychain, AES-256 ile şifrelenmiş güvenli depolama sağlar.
AES-256 şifreleme, Secure Enclave donanımıyla entegre çalışır.
kSecAttrAccessible parametreleri:
kSecAttrAccessibleAfterFirstUnlock: Cihaz açıldıktan sonra erişilebilir.
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly: Biyometrik kilitleme şartı koyar.
Swift Kod — Token Saklama ve Okuma
import Security
func saveToken(token: String) {
let tokenData = token.data(using: .utf8)!
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: “authToken”,
kSecValueData as String: tokenData,
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
SecItemDelete(query as CFDictionary)
SecItemAdd(query as CFDictionary, nil)
}
func readToken() -> String? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: “authToken”,
kSecReturnData as String: true
]
var dataTypeRef: AnyObject?
let status = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)
if status == errSecSuccess, let data = dataTypeRef as? Data {
return String(data: data, encoding: .utf8)
}
return nil
}
URL Scheme ve Universal Links Güvenliği
Yanlış yapılandırılmış URL Scheme, başka uygulamaların sizin uygulamanızı yetkisiz şekilde tetiklemesine yol açabilir.
Swift Kod — URL Scheme Doğrulama
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
guard url.scheme == “guvenliuygulama” else {
print(“Yetkisiz girişim!”)
return false
}
// Parametre doğrulama
if let host = url.host, host == “login” {
print(“Giriş işlemi tetiklendi.”)
}
return true
}
Secure Enclave ile Kriptografi
Secure Enclave, kriptografik işlemleri cihazın ana işlemcisinden izole eder. Parola, biyometrik veri ve anahtar yönetimi için idealdir.
Swift Kod — Anahtar Üretme
import LocalAuthentication
func generateSecureKey() {
let tag = “com.orneksite.securekey”.data(using: .utf8)!
let attributes: [String: Any] = [
kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,
kSecAttrKeySizeInBits as String: 256,
kSecPrivateKeyAttrs as String: [
kSecAttrIsPermanent as String: true,
kSecAttrApplicationTag as String: tag,
kSecAttrAccessControl as String: SecAccessControlCreateWithFlags(nil,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
.privateKeyUsage, nil)!
]
]
var error: Unmanaged<CFError>?
if let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) {
print(“Anahtar üretildi: \(privateKey)”)
} else {
print(“Anahtar üretilemedi: \(error.debugDescription)”)
}
}
Jailbreak Tespiti
Jailbreak, sandbox korumalarını kaldırır ve uygulamanın güvenlik varsayımlarını bozar.
Jailbreak, sandbox izinlerini genişletir. /private/var dizinine yazma denemesi yapılabilir.
Swift Kod — Basit Jailbreak Kontrolü
func isJailbroken() -> Bool {
let jailbreakPaths = [
“/Applications/Cydia.app”,
“/Library/MobileSubstrate/MobileSubstrate.dylib”,
“/bin/bash”,
“/usr/sbin/sshd”
]
for path in jailbreakPaths where FileManager.default.fileExists(atPath: path) {
return true
}
return false
}
Dosya Sistemi ve Veri Koruma
iOS, dosya koruma sınıfları (NSFileProtectionComplete) ile veri erişimini sınırlar.
NSFileProtectionComplete vs. NSFileProtectionNone:
NSFileProtectionComplete: Cihaz kilitliyken dosya erişilemez (AES-256 + Secure Enclave).NSFileProtectionNone: Jailbreak sonrası savunmasızdır.
Swift Kod — Şifreli Dosya Yazma
func writeSecureFile() {
let filePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent(“data.txt”)
let data = “Gizli veri”.data(using: .utf8)!
do {
try data.write(to: filePath, options: .completeFileProtection)
print(“Dosya güvenli şekilde yazıldı.”)
} catch {
print(“Dosya yazma hatası: \(error)”)
}
}
Öneriler
- Derinlemesine Savunma (Defense in Depth):
- ATS + Pinning + Secure Enclave + Jailbreak tespiti birlikte kullanılmalı.
- Sürekli Güncelleme:
- Apple’ın her yeni iOS sürümüyle gelen güvenlik düzeltmeleri (örneğin, Pointer Authentication Codes/PAC) takip edilmeli.
- Statik ve Dinamik Analiz:
MobSF (Mobile Security Framework) veya Apple’s own Xcode Analyzer ile kod taraması yapılmalı
Sonuç
Bu rehberde iOS uygulama güvenliği konusunu her bileşen için kod örnekleriyle ele aldık. Info.plist yapılandırmasından Keychain kullanımına, Secure Enclave’den jailbreak tespitine kadar iOS’ta güvenlik, sadece Apple’ın sunduğu korumalarla değil, geliştiricinin bilinçli uygulama tasarımıyla mümkün olur.
Unutmayın: Yanlış yapılandırılmış tek bir izin, tüm uygulamanın güvenliğini yok edebilir.
Daha fazla ios güvenliği için aşağıdaki linki takip edebilirsiniz.
https://support.apple.com/tr-tr/guide/security/welcome/web
Android dünyasını merak ediyorsanız aşağıdaki araştırmayı okuyabilirsiniz.
Android Uygulama Güvenliği ve Bileşenleri












