Güvenlik

“Insecure Communication” Güvenlik Zafiyetleri

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.

    1. 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.
      build.gradle dosyasında defaultConfig kod blokları içinde signingConfig signingConfigs.debug yazmalıdır.
       
    2. Proje Ana dizininde app->proguard-rules.pro dosyasını açıp aşağıdaki log gizleme kodunu eklemeliyiz.
    3. 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.

 

Ö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.

 

Ö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;

 

Ö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

Bülten
Bültene abone ol

Bültene abone olarak yeni makalelerimden haberdar olun.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir