Mobil Uygulama Güvenliği: OWASP Mobile Top 10
OWASP Mobile Top 10 Nedir?
OWASP (Open Web Application Security Project), mobil uygulama güvenliği alanında en yaygın ve kritik güvenlik risklerini belirleyen Mobile Top 10 listesini düzenli olarak yayımlamaktadır. Bu liste, mobil uygulama geliştiricileri ve güvenlik uzmanları için bir yol haritası niteliğindedir. Android ve iOS platformlarında geliştirme yapan ekiplerin, uygulamalarını yayına almadan önce bu riskleri mutlaka değerlendirmesi gerekir.
M1: Improper Credential Usage (Hatalı Kimlik Bilgisi Kullanımı)
Mobil uygulamalarda en sık karşılaşılan güvenlik açıklarından biri, kimlik bilgilerinin yanlış yönetilmesidir. API anahtarlarının, şifrelerin veya token'ların kaynak koda gömülmesi (hardcoding) ciddi bir güvenlik riski oluşturur.
// YANLIŞ: API anahtarını doğrudan koda gömmek
const API_KEY = "sk-abc123secretkey456";
// DOĞRU: Güvenli depolama mekanizması kullanmak
import * as Keychain from 'react-native-keychain';
await Keychain.setGenericPassword('apiUser', token);
Kimlik bilgileri her zaman platform tarafından sağlanan güvenli depolama mekanizmalarında tutulmalıdır. Android'de EncryptedSharedPreferences, iOS'ta ise Keychain Services bu amaçla kullanılmalıdır.
M2: Inadequate Supply Chain Security (Yetersiz Tedarik Zinciri Güvenliği)
Mobil uygulamalar genellikle onlarca üçüncü parti kütüphane ve SDK kullanır. Bu bağımlılıkların her biri potansiyel bir saldırı vektörüdür. Kötü niyetli veya güvenlik açığı barındıran bir kütüphane, tüm uygulamanızı tehlikeye atabilir.
- Bağımlılıklarınızı düzenli olarak npm audit, Snyk veya OWASP Dependency-Check gibi araçlarla tarayın
- Kullandığınız kütüphanelerin bakım durumunu ve güvenlik geçmişini kontrol edin
- Bağımlılık sürümlerini sabitleyerek (lock file) beklenmedik güncellemeleri önleyin
- Kod imzalama ve bütünlük doğrulama mekanizmalarını uygulayın
M3: Insecure Authentication/Authorization (Güvensiz Kimlik Doğrulama ve Yetkilendirme)
Mobil uygulamalarda kimlik doğrulama ve yetkilendirme mekanizmalarının zayıf uygulanması, yetkisiz erişimlere kapı açar. Özellikle yalnızca istemci tarafında yapılan doğrulamalar kolayca atlatılabilir.
// YANLIŞ: Sadece istemci tarafında rol kontrolü
if (user.role === "admin") {
showAdminPanel();
}
// DOĞRU: Sunucu tarafında her istek için yetkilendirme kontrolü
// Backend middleware örneği
app.use('/admin/*', (req, res, next) => {
const token = req.headers.authorization;
const decoded = jwt.verify(token, SECRET);
if (decoded.role !== 'admin') {
return res.status(403).json({ error: 'Yetkisiz erişim' });
}
next();
});
Tüm kritik işlemler için sunucu tarafında yetkilendirme kontrolü yapılmalı, JWT token'ların süresi kısa tutulmalı ve refresh token rotation mekanizması uygulanmalıdır.
M4: Insufficient Input/Output Validation (Yetersiz Giriş/Çıkış Doğrulama)
Kullanıcıdan gelen verilerin doğrulanmaması, SQL Injection, XSS ve komut enjeksiyonu gibi saldırılara zemin hazırlar. Mobil uygulamalarda WebView kullanan bileşenler özellikle bu tür saldırılara açıktır.
// YANLIŞ: Kullanıcı girdisini doğrudan SQL sorgusuna eklemek
String query = "SELECT * FROM users WHERE id = " + userInput;
// DOĞRU: Parametreli sorgu kullanmak
String query = "SELECT * FROM users WHERE id = ?";
cursor = db.rawQuery(query, new String[]{userInput});
- Tüm kullanıcı girdilerini hem istemci hem sunucu tarafında doğrulayın
- WebView içinde JavaScript injection riskine karşı
evaluateJavascript()kullanırken girdileri sanitize edin - Deep link parametrelerini mutlaka doğrulayın
M5: Insecure Communication (Güvensiz İletişim)
Ağ trafiğinin şifrelenmemesi veya sertifika doğrulamasının atlanması, Man-in-the-Middle (MitM) saldırılarına olanak tanır. Tüm ağ iletişimi TLS 1.2 veya üzeri ile şifrelenmelidir.
<!-- Android: network_security_config.xml -->
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">api.orneksite.com</domain>
<pin-set expiration="2026-12-31">
<pin digest="SHA-256">base64EncodedPin=</pin>
<pin digest="SHA-256">backupPin=</pin>
</pin-set>
</domain-config>
</network-security-config>
Certificate Pinning uygulayarak, uygulamanızın yalnızca bilinen ve güvenilen sertifikalarla iletişim kurmasını sağlayabilirsiniz. Ancak pin yönetimini dikkatli yapmazsanız sertifika yenilemelerinde uygulama çalışmaz hale gelebilir; bu nedenle yedek pin kullanmayı unutmayın.
M6: Inadequate Privacy Controls (Yetersiz Gizlilik Kontrolleri)
Kullanıcıların kişisel verilerinin (PII) gereksiz yere toplanması, güvenli olmayan şekilde saklanması veya üçüncü taraflarla paylaşılması hem yasal hem de etik sorunlara yol açar. KVKK ve GDPR gibi düzenlemeler bu konuda ciddi yaptırımlar öngörmektedir.
- Yalnızca uygulamanızın işlevselliği için gerçekten gerekli olan verileri toplayın
- Hassas verileri loglamayın; özellikle üretim ortamında debug logları kapalı olmalıdır
- Kullanıcıya verilerini silme ve dışa aktarma seçenekleri sunun
- Üçüncü parti SDK'ların hangi verileri topladığını denetleyin
M7: Insufficient Binary Protections (Yetersiz İkili Dosya Korumaları)
Mobil uygulama binary'leri tersine mühendislik (reverse engineering) ile analiz edilebilir. Saldırganlar jadx, Hopper veya Ghidra gibi araçlarla uygulamanızın kaynak koduna yakın bir görünüm elde edebilir.
- Android için ProGuard veya R8 ile kod obfuscation uygulayın
- Çalışma zamanında root/jailbreak tespiti yapın
- Tamper detection mekanizmaları ekleyin
- Debugger bağlanmasını tespit edip engelleyin
// Android ProGuard kuralı örneği (proguard-rules.pro)
-keep class com.ornekuygulama.model.** { *; }
-obfuscationdictionary obfuscation-dictionary.txt
-assumenosideeffects class android.util.Log {
public static int d(...);
public static int v(...);
}
M8: Security Misconfiguration (Güvenlik Yapılandırma Hataları)
Varsayılan güvenlik ayarlarının değiştirilmemesi, gereksiz izinlerin istenmesi ve debug modunun üretimde açık bırakılması gibi yapılandırma hataları sıkça görülür.
- AndroidManifest.xml dosyasında
android:debuggable="false"olduğundan emin olun - Yalnızca gerçekten ihtiyaç duyulan izinleri isteyin
android:exported="false"ile gereksiz bileşen dışa aktarımını engelleyin- iOS'ta App Transport Security (ATS) istisnalarını minimize edin
- Backup mekanizmalarında hassas verilerin dışarıda kalmasını sağlayın
M9: Insecure Data Storage (Güvensiz Veri Depolama)
Hassas verilerin düz metin olarak cihazda saklanması en yaygın güvenlik hatalarından biridir. SharedPreferences, SQLite veritabanları, plist dosyaları ve SD kart gibi alanlar saldırganlar tarafından kolayca okunabilir.
// Android: EncryptedSharedPreferences kullanımı
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val sharedPreferences = EncryptedSharedPreferences.create(
context,
"secret_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
sharedPreferences.edit().putString("auth_token", token).apply()
Veritabanı şifreleme için SQLCipher, dosya düzeyinde şifreleme için ise platformun sunduğu kriptografik API'ler tercih edilmelidir.
M10: Insufficient Cryptography (Yetersiz Kriptografi)
Zayıf veya kullanımdan kaldırılmış şifreleme algoritmalarının kullanılması, verilerin korunmasını anlamsız kılar. MD5, SHA1, DES ve ECB modu gibi eski yöntemler artık güvenli kabul edilmemektedir.
- Simetrik şifreleme için AES-256-GCM kullanın
- Asimetrik şifreleme için RSA-2048 veya tercihen ECDSA kullanın
- Parola hashleme için bcrypt, scrypt veya Argon2 tercih edin
- Kendi kriptografi implementasyonunuzu yazmayın; kanıtlanmış kütüphaneleri kullanın
- Şifreleme anahtarlarını asla kaynak kodda veya cihaz üzerinde düz metin olarak saklamayın
Güvenlik Testi Araçları ve Pratik Öneriler
OWASP Mobile Top 10 risklerini tespit etmek için aşağıdaki araçlardan faydalanabilirsiniz:
- MobSF (Mobile Security Framework): Statik ve dinamik analiz için kapsamlı bir açık kaynak araç
- Frida: Çalışma zamanı manipülasyonu ve dinamik analiz için güçlü bir araç
- Burp Suite: Ağ trafiğini yakalama ve analiz etme
- objection: Frida tabanlı, kullanımı kolay bir runtime exploration aracı
- apktool / jadx: Android APK tersine mühendislik araçları
Geliştirme Sürecine Güvenliği Entegre Etmek
Güvenlik, geliştirme sürecinin sonuna bırakılmamalı, baştan itibaren (Shift Left) sürece dahil edilmelidir. CI/CD pipeline'ınıza statik analiz araçları (SAST) ve bağımlılık tarama adımları ekleyin. Kod inceleme süreçlerinde güvenlik kontrol listelerini kullanın. Düzenli penetrasyon testleri planlayın ve sonuçlarını takip edin.
Mobil uygulama güvenliği sürekli bir süreçtir. OWASP Mobile Top 10 listesini referans alarak, uygulamalarınızı düzenli olarak denetleyin ve güvenlik güncellemelerini takip edin. Unutmayın: güvenlik bir özellik değil, bir gerekliliktir.