Güvenlik

Android ile Sunucu Arasında Veri Akış Güvenliği

Verilerimizi korumak, güvenlik altına almak her daim önemli bir konu olmuştur. Piyasadaki mobil uygulamaların büyük bölümünün verileri uzak sunucularda bulunmaktadır. Bu tarz uygulamalar, ağ üzerinden iletişim kurar. Mobil uygulamalardaki veri güvenliği bir çok yazılıma göre daha büyük riskler taşıyabilir.

Bu makalede Android uygulamalar ile sunucu arasındaki veri iletişiminin güvenli şekilde yapılmasını sağlayan yöntemlerden bahsedeceğim.

Uygulamanızı geliştirirken, ağ isteklerinizi gerekli olanlarla yani ihtiyaçlarınızla sınırlamak en iyi yöntemlerden biridir. Normalde temel olarak ağ bağlantınız HTTP’dir. Sizin uygulamanız gereken ise HTTPS kullanmaktır.  HTTPS, ağ trafiğini şifreleyen bir protokoldür. Böylece ağınızı dinleyen, sızmaya çalışan sistemlerin sizin iletişim ağızınıza müdahale etmesini önler.

Android’de güvenli ağ yapısını kullanmak için ilk öncelikle aşağıdaki Java kodları ile ilgili  ağa bağlanmak gerekir.

Sonrasında Android Studio idesinde app/res dizinine üstüne sağ tıklama File > New File ile xml dizini oluşturmanız gerekir. Xml dizini içine network_security_config.xml.  adlı bir xml dosyası oluşturun. Asağıdaki kodları bu dosyaya içine ekleyin.

Son olarak AndroidManifest.xml ayar dosyamıza da aşağıdaki gibi networkSecurityConfig özeliğini ekleyin.

HTTPS protokolü yıllar içinde kullanılırken, güvenlik uzmanları buldukları güvenlik açıklarını yamalarıyla birlikte bildirirler. Protokollerin en yeni sürümleri, öncekilerden daha az güvenlik zafiyetleri içerir.Bu güncel ve güvenilir yapıya ulaşabilmek için Google Play Hizmetleri’ni ekleyerek, crypto providers güncellemeniz gerekir.Bu işlemide SafetyNet servisi yapmaktadır.

SafetyNet, güvenliksiz URL’ler, potansiyel olarak zararlı uygulamalar ve sahte kullanıcılar dahil olmak üzere güvenlik tehditlerine karşı korumaya yardımcı olan bir dizi hizmet ve API sağlar. Uygulamanızı spam göndericilerinden ve diğer kötü amaçlı trafiğinden korumak için bir reCAPTCHA API’si de dahil olmak üzere daha birçok özelliğe sahiptir.

SafetyNet API Kullanımı

Android Studio Ide ile oluşturduğum projemin app dizinin altındaki build.gradle dosyasını açıyoruz. Dependencies kod bloklarının arasına aşağıdaki kodları yerleştirerek safetynet kütüphanesini yüklüyoruz.

Java sınıfınıza da ProviderInstaller.ProviderInstallListener dahil ederek kullanabilirsiniz.

Bir sunucuya HTTPS bağlantısı yaptığınızda, sunucu tarafından bir dijital sertifika sunulur ve bağlantının güvenli olduğundan emin olmak için Android tarafından doğrulanır.

Güven zincirindeki sertifikalardan biri geçerli değilse, bağlantı güvenli değildir. Bu iyi bir sistem olsa da, kusursuz değil. Bir saldırganın Android işletim sistemini özel sertifikaları kabul etmesi için talimat vermesi mümkündür. Interception proxy’leri güvenilir bir sertifikaya sahip olabilir ve cihaz bir şirket tarafından kontrol ediliyorsa, şirket cihazı kendi sertifikasını kabul edecek şekilde yapılandırmış olabilir. Bu senaryolar, HTTPS trafiğinin şifresinin çözülmesini ve okunmasını sağlayan “man in the middle” saldırısına izin verir.

Certificate Pinning, beklenen sertifikanın bir kopyasına karşı sunulan sunucunun sertifikasını kontrol ederek kurtarmaya gelir. Bu, sertifika beklenenlerden farklı olduğunda bağlantıların yapılmasını engeller.

Android N ve üzeri sürümlerde pinning uygulamak için, sertifikanın hash adını (pin olarak adlandırılır) network_security_config.xml dosyasına eklemeniz gerekir.Aşağıda örnek kod bulunmaktadır.

Belirli bir sitenin pinlerini bulmak için SSL Labs sitesinden faydalanabilirsiniz.Eğer bir şirket için bir uygulama geliştiriyorsanız, şirketten bunun için talepte bulunabilirsiniz.

Verilerin Kontrol Edilmesi ve Doğrulanması

Şimdiye kadar anlatığım başlıklarda daha çok ağ bağlantılarının güvenliğinden bahsettim. Fakat  ağ bağlantıları güvenliği haricinde programlama yapma tarafında da kontroller yapmamız gerekmektedir.

Örneğin,Sunucunuz 48 karakterden oluşan bir karakter bekliyorsa, arayüzün yalnızca 48 karakterlik bir veri göndereceğinden emin olun.

Sunucudan yalnızca sayıları bekliyorsanız, veri çekerken gelen değerin sayı olup olmadığını kontrol etmelisiniz. Bu, masum hataların önlenmesine yardımcı olurken, aynı zamanda enjeksiyon ve bellek bozulması saldırılarının olasılığını da azaltır.

Aynı şey sunucuya veri göndermek için de geçerlidir. Özellikle kullanıcı tarafından oluşturulmuşsa, verileri körü körüne göndermeyin. Örneğin, özellikle bir SQL sunucusu veya kodu çalıştıracak herhangi bir teknoloji tarafından çalıştırılacaksa, kullanıcı girdisi uzunluğunu sınırlamak iyi bir uygulamadır.

Mobil  uygulama geliştirici olarak  sunucuya gönderdiğimiz verilerinde güvenilir olması bizim sorumluluğumuzdadır. Bu yüzden kullanıcıdan aldığımız değerleri sql injection yapmayacak şekilde hazırlayıp sonrasında değeri sunucuya göndermemiz gerekir.Örneğin kullanıcıda aldığınız değeri aşağıda örnek kod ile zarar verici karakterlerden temizleyebilirsiniz.

Örneğin, kullanıcıdan bir email adresi gelecekse , aşağıdaki kod ile gelen değerin email adresi olup olmadığını kontrol edebilirsiniz.

Diğer Uygulamalar ile İletişim

Bir uygulamadan diğer uygulamaya geciş sırasındaki güvenliği sağlamak da önemlidir. Geliştiricilerin paylaşılan dosyaları bıraktıkları veya hassas bilgi alışverişi için soket uyguladıkları durumlar olmuştur. Fakat bu güvenli değildir. Bu gibi durumlarda  Intents sınıfını  kullanmak daha iyi bir çözümdür.

Verileri birden fazla uygulamada yayınlamak için, yalnızca imzalama anahtarınızla imzalanmış uygulamaların verileri alacağını zorunlu kılmalısınız. Aksi takdirde, gönderdiğiniz bilgiler yayını almayı kaydeden herhangi bir uygulama tarafından okunabilir. Benzer şekilde, kötü amaçlı bir uygulama, yayını almak için kaydolduysanız uygulamanıza bir yayın gönderebilir. İmzanın protectionLevel olarak kullanıldığı yayınları gönderirken ve alırken bir izin kullanabilirsiniz. Bu gibi durumlar için manifest dosyasında özel bir izin tanımlayabilirsiniz.

Her iki uygulamanın da çalışması için bildirim dosyasında izinlere sahip olması gerekir. Yayını göndermek için; aşağıda ki kodu kullanmalıyız.

Kaynaklar

1- https://code.tutsplus.com/tutorials/securing-communications-on-android–cms-31596

2-https://developer.android.com/training/articles/security-config

Bülten
Bültene abone ol

Bültene abone olarak yeni makalelerimden haberdar olun.