Güvenlik, insanın ilk yaradılış anından itibaren her alanda ihtiyaç oldu. Günümüzde ise bilişim güvenliği ile verilerimizi korumamız temel gereksinimdir.
Bu makale OWASP Foundation belirlediği Top 10 Mobil güvenlik tehditlerinden biri olan “Insecure Communication” konusunu Android alanındaki güvenlik zafiyetleri ve çözümlerini açıklayacaktır.
İnternet
Bir API’ye istekte bulunma, uygulama içinde bir web sitesine ulaşma vb. birçok konuda interneti iletişim aracı olarak kullanabiliriz. İletişim alanında en çok karşımıza çıkabilecek güvenlik açığı ve çözümlerinden bahsedeceğim.
Önemli İpucu #1: Ağ çağrılarınızı Log ile yazdırmayın!
Log sınıfı ile komut ekranına yazdırdığınız tüm içerikler her zaman dışarıdan kolaylıkla ulaşılabilir bilgiler haline dönüşür. Projeyi yayınlamadan önce oturum açma kimlik bilgileri, web servis url, şifre vb. bu tarz bilgileri içeren Log kullanımlarını silmelisiniz ya da devre dışı bırakmalısınız.
Tüm log kullanımlarını kolayca nasıl devre dışı yapabiliriz?
Geliştirilen uygulamaların kaynak kodlarını karıştırmaya ve sıkıştırmaya yarayan ücretsiz 3. parti bir kütüphane olan ProGuard kullanacağız. Projeniz oluşturulduğunda ProGuard rules dosyası otomatik oluşturulur.
-
- ProGuard rules dosyasını release modda çalıştıracağımızı belirtmeliyiz. Ana dizinde olan app-> build.gradle dosyasını açmalısınız. Aşağıdaki örnekte olduğu gibi
minifyEnabled true
yazmalıdır ve release kod blokları içinde olmalıdır.
123456buildTypes {release {minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}signingConfig signingConfigs.debug
yazmalıdır.
12345defaultConfig {signingConfig signingConfigs.debug......} - Proje Ana dizininde app->proguard-rules.pro dosyasını açıp aşağıdaki log gizleme kodunu eklemeliyiz.
12345678-assumenosideeffects class android.util.Log {public static boolean isLoggable(java.lang.String, int);public static int v(...);public static int i(...);public static int w(...);public static int d(...);public static int e(...);} - Son olarak Android Studio menüsünde Build-> Select Build Variant seçip açılan
Active Build Variant
alanını release seçmelisiniz. Çünkü 1. adımda release blokları arasında ProGuard rules aktif ettik. Logcat penceresinde ilgili log içeriğini arama yaptığınızda, log komutlarının listelenmediğini (devre dışı) olduğunu göreceksiniz.
- ProGuard rules dosyasını release modda çalıştıracağımızı belirtmeliyiz. Ana dizinde olan app-> build.gradle dosyasını açmalısınız. Aşağıdaki örnekte olduğu gibi
Önemli İpucu #2: Kullanıcı sertifikalarına körü körüne güvenmeyin
Sunucunun gerçekte söyledikleri kişi olduğunu doğrulamak için, kimliği kanıtlayacak bir tür sertifika gerekir. Ancak bir saldırganın sahte bir sertifika oluşturup onu meşru gibi göstermesini engelleyecek hiçbir şey olmayacağından sertifika tek başına yeterli değildir. Bununla mücadele etmek için istemci ve sunucu tarafında ‘certificate authority’ (CA), açık anahtarları kendi gizli anahtarlarıyla imzalayarak 3. taraflara sunmaktır.
Android cihazınıza, ‘trusted‘ olan CA’ların ortak bir listesi önceden yüklenmiş olarak gelir. Bunun anlamı herhangi bir sorun olmadan internete güvenli çağrılar yapabileceğinizdir.
Dilerseniz Android’de kendi ‘trusted‘ sertifikalarınızı da elde edebilirsiniz. Kullanıcı sertifikalarının en yaygın kullanım durumu Charles, Fiddler veya Wireshark gibi proxy yazılımlarıyla birlikte kullanılması yoluyla sağlanır.
Bazı Android uygulamalarında network güvenlik ayar dosyaları bulunmaktadır. Dilerseniz kendinizde oluşturabilirsiniz. Bu ayar AndroidManifest dosyasında application tag içinde android:networkSecurityConfig="@xml/network_security_config"
şeklinde tanımlanır.
network_security_config dosyanızda aşağıdaki gibi ise uygulamanız saldırıya açık olduğu anlamına gelir. Ne yazık ki Android 7.0 (API level 24) ve altında sürümlerde varsayılan olarak bu güvenlik açığı bulunmaktadır.
1 2 3 4 5 6 7 8 |
<!-- Zorunda kalmadıkça kullanılması önerilmez --> <network-security-config> <base-config> <trust-anchors> <certificates src="user" /> </trust-anchors> </base-config> </network-security-config> |
Önerilen yaklaşım, kullanıcı sertifikalarının yalnızca hata ayıklama sırasında uygulamanız tarafından kullanılmasına izin vermektir. debug-overrides kullanarak bu durumu uygulayabilirsiniz. Örnek network_security_config dosya içeriği;
1 2 3 4 5 6 7 |
<network-security-config> <debug-overrides> <trust-anchors> <certificates src="user" /> </trust-anchors> </debug-overrides> </network-security-config> |
Önemli İpucu #3: Her zaman HTTPS kullanarak çağırma yapmalıyız.
İncelediğim bazı uygulamalarda halen HTTP kullanarak güvenlik zafiyetlerinin oluşturduğunu belirtmek isterim.
HTTPS, istemci ile sunucu arasında aktarılan verileri şifrelemek amacıyla kriptografiyi kullanarak güvenli bir şekilde iletişim kurmak için başka bir protokol olan Transport Layer Security (TLS)2 kullanır. Böylelikle bir uygulama HTTPS aracılığıyla veri gönderdiğinde veriler şifrelenir.
Android uygulamalarınızı, Android 9 (API düzeyi 28) ve üstü sürümlerde oluşturduğunuzda HTTP yoluyla veri göndermek varsayılan olarak devre dışıdır. Fakat projenizde HTTP kullanmak zorunda olduğunuz durumlarda network güvenlik ayar dosyanızda domain-config cleartextTrafficPermitted=”true” ekleyebilirsiniz.
Kaynak
1- https://owasp.org/www-project-mobile-top-10/
2-https://developer.android.com/training/articles/security-config
3- https://www.spght.dev/articles/12-08-2022/owasp-m3