Blog
Mobil Uygulama Güvenliğinde En İyi Uygulamalar ve Yaygın Hatalar
Mobil uygulama güvenliği, kullanıcı verilerinin korunması, tersine mühendislik saldırılarının engellenmesi ve arka uç (backend) sistemlerinin yetkisiz erişimlere karşı savunulması süreçlerinin tamamını kapsar. Bir mobil uygulamanın yalnızca işlevsel olması, güvenli olduğu anlamına gelmez. Güvenlik açıkları, hassas API anahtarlarının sızmasından kullanıcı oturumlarının ele geçirilmesine kadar geniş çaplı tehditlere yol açabilir.
Modern Android ve iOS ekosistemlerinde güvenli bir mimari kurmak, hem istemci tarafındaki (client-side) hem de sunucu tarafındaki (server-side) zafiyetleri eş zamanlı olarak ele almayı gerektirir.
Mobil ekosistemde temel tehdit vektörleri
Mobil cihazlar, sunucuların aksine kontrolün tamamen son kullanıcıda olduğu güvensiz ortamlarda çalışır. Bu durum, saldırganların uygulamayı statik ve dinamik analiz araçlarıyla incelemesine zemin hazırlar.
- Statik analiz: Uygulama paketinin (APK, AAB veya IPA) kaynak kodlarına, gömülü yapılandırma dosyalarına ve derlenmiş ikili dosyalara (binary) doğrudan erişilerek analiz edilmesidir.
- Dinamik analiz ve kanca (hooking) teknikleri: Uygulama çalışırken bellek manipülasyonu yapılması, fonksiyon çağrılarının Frida veya Xposed gibi araçlarla izlenmesi ya da değiştirilmesidir.
- Ağ dinleme (man-in-the-middle – MitM): Cihaz ile sunucu arasındaki trafiğin yetkisiz üçüncü taraflarca izlenmesi veya değiştirilmesidir.
- Cihaz bütünlüğünün bozulması: Root edilmiş veya jailbreak yapılmış cihazlarda işletim sisteminin sunduğu koruma mekanizmalarının devre dışı kalmasıdır.
Mobil uygulama güvenlik mimarisinde en iyi uygulamalar
Güçlü bir mobil uygulama güvenlik stratejisi, savunmayı tek bir noktaya değil, katmanlı bir yapıya dayandırmalıdır.
Kaynak kod karartma ve ikili dosya koruması
Kaynak kodun derlendikten sonra okunabilir kalması, uygulamanın iş mantığının (business logic) kolayca çözülmesine neden olur.
- Obfuscation (Karartma): Android tarafında ProGuard veya R8, iOS tarafında ise LLVM tabanlı karartma araçları kullanılarak sınıf, yöntem ve değişken adları anlamsız karakter dizileriyle değiştirilmelidir.
- Kontrol akışı düzleştirme (Control flow flattening): Kod bloklarının çalışma sırası karmaşıklaştırılarak statik analiz araçlarının mantıksal akışı çıkarması zorlaştırılmalıdır.
- Dize şifreleme (String encryption): Hassas API uç noktaları, hata ayıklama mesajları veya sabit dizeler derleme aşamasında şifrelenmeli ve yalnızca çalışma zamanında bellekte çözülmelidir.
Güvenli veri depolama standartları
Hassas verilerin cihaz üzerinde düz metin (plain text) olarak saklanması en yaygın ihlal nedenlerinden biridir. Yerel veritabanları ve paylaşılan tercihler (shared preferences) her zaman kriptografik koruma altında tutulmalıdır.
- Android platformu:
EncryptedSharedPreferencesve donanım destekli anahtar yönetim sistemi olan Android Keystore kullanılmalıdır. - iOS platformu: Hassas veriler, parolalar ve oturum jetonları (tokens) doğrudan
Keychain Servicesüzerinde saklanmalı;UserDefaultsveyaCoreDataiçine şifrelenmemiş halde yazılmamalıdır. - Geçici veriler: Önbellek dizinlerinde tutulan hassas dosyalar işlem bittikten hemen sonra bellekten ve diskten kalıcı olarak silinmelidir.
Ağ katmanı güvenliği ve sertifika sabitleme
Yalnızca HTTPS protokolünü kullanmak tek başına yeterli değildir; çünkü saldırganlar cihaza özel bir kök sertifika (root CA) yükleyerek trafiği şifresiz metin olarak okuyabilir.
- SSL/TLS Pinning (Sertifika Sabitleme): Uygulama, yalnızca belirli bir sertifika parmak izine (public key hash) sahip sunucularla iletişim kuracak şekilde yapılandırılmalıdır.
- Ağ Güvenliği Yapılandırması: Android’de
network_security_config.xmlkullanılarak açık metin (cleartext) trafiği kesin olarak engellenmeli ve güvenilmeyen kullanıcı sertifikaları reddedilmelidir.
| Güvenlik Alanı | Tavsiye Edilen Yöntem | Kaçınılması Gereken Uygulama |
|---|---|---|
| Veri Depolama | Android Keystore / iOS Keychain | Düz metin SQLite, SharedPreferences |
| Ağ İletişimi | TLS 1.3 + Public Key Pinning | Sadece varsayılan HTTPS, HTTP izinleri |
| Kod Bütünlüğü | R8/ProGuard + Bütünlük Kontrolleri | Karartılmamış ham kod dağıtımı |
| Oturum Yönetimi | Kısa ömürlü JWT + Donanım korumalı anahtar | Cihazda kalıcı saklanan sabit şifreler |
Çalışma zamanı uygulama öz koruması (RASP)
Çalışma zamanı uygulama öz koruması (Runtime Application Self-Protection – RASP), uygulamanın kendi çalışma ortamını denetlemesini sağlar.
- Root ve Jailbreak tespiti: Cihazda yetkisiz kök erişimi saptandığında uygulamanın hassas işlevleri sınırlandırılmalı veya oturum sonlandırılmalıdır.
- Hata ayıklayıcı (Debugger) kontrolü:
ptraceveya benzeri işletim sistemi çağrıları ile uygulamanın bir hata ayıklayıcıya bağlı olup olmadığı periyodik olarak kontrol edilmelidir. - Emülatör algılama: Uygulamanın fiziksel bir donanım yerine sanal bir ortamda çalıştırılıp çalıştırılmadığı donanım özellikleri üzerinden doğrulanmalıdır.
Geliştiricilerin en sık yaptığı güvenlik hataları
Geliştirme süreçlerindeki dikkatsizlikler veya teslim tarihlerinin baskısı, temel güvenlik ilkelerinin göz ardı edilmesine yol açabilir.
Hassas anahtarları koda gömmek
API anahtarları, özel şifreleme anahtarları ve veritabanı kimlik bilgileri asla kaynak kod içerisine doğrudan (hardcoded) yazılmamalıdır. APK veya IPA paketini açan bir saldırgan, strings.xml veya derlenmiş sınıfları inceleyerek bu anahtarları saniyeler içinde elde edebilir. Hassas işlemler istemci tarafında değil, kimlik doğrulamasından geçen arka uç servisleri üzerinde yürütülmelidir.
İstemci tarafı doğrulamaya aşırı güvenmek
Yetkilendirme, lisans kontrolü, kullanıcı rolü doğrulaması ve girdi denetimleri asla sadece mobil uygulama içerisinde yapılmamalıdır. İstemci tarafındaki kodlar baypas edilebilir, fonksiyon dönüş değerleri (örneğin bir isAdmin() boolean değeri) çalışma zamanında değiştirilebilir. Kritik kararların tamamı sunucu tarafında doğrulanmalıdır.
Dışa aktarılan (exported) bileşenleri kontrolsüz bırakmak
Özellikle Android mimarisinde Activity, Service, BroadcastReceiver ve ContentProvider gibi bileşenlerin varsayılan olarak veya yanlışlıkla android:exported="true" olarak işaretlenmesi ciddi riskler doğurur. Dış uygulamalar bu bileşenleri yetkisiz biçimde tetikleyebilir ve veri sızıntılarına yol açabilir. Gerekli olmayan bileşenler her zaman dışa aktarmaya kapalı tutulmalıdır.
Geliştirme sürecine yönelik güvenlik kontrol listesi
Güvenli bir sürüm hazırlamak için geliştirme döngüsüne entegre edilmesi gereken temel adımlar:
- Statik kod analizi (SAST): Derleme boru hattına (CI/CD) otomatik statik analiz araçları entegre edilmelidir.
- Hata günlüğü temizliği:
Log.d,NSLogveyaprintgibi hata ayıklama çıktıları üretim (release) sürümlerinde tamamen devre dışı bırakılmalıdır. - Üçüncü taraf kütüphane denetimi: Kullanılan açık kaynaklı bağımlılıkların güvenlik açıkları (CVE) düzenli olarak taranmalı ve güncel tutulmalıdır.
- Dinamik sızma testleri: Uygulama mağazalara gönderilmeden önce yetkili güvenlik uzmanlarınca pentest testlerine tabi tutulmalıdır.
Geliştiricilerin istemci tarafını her an manipülasyona açık bir ortam olarak kabul etmesi, modern mobil güvenliğin temel başlangıç noktasıdır. Savunma katmanlarını doğrudan kod tabanına, derleme mimarisine ve arka uç doğrulama süreçlerine yayarak riskleri asgari seviyeye indirebilirsiniz.