Android Uygulamalar İçin Güvenlik Önlemleri

Hüseyin Serkan Özaydin
Applixus Tech
Published in
6 min readDec 4, 2023

--

Herkese merhaba, bugünlerde Jetpack Compose, Macro benchmark derken Android dünyası yeni teknolojiler ile yeni bir sürece giriyor. Bu yeni süreçte atlanmaması gereken önemli bir konu var. O da Güvenlik

Peki neden güvenlik önemli bir konu?

Bir proje sürecinde bazı önemli verileri Android uygulamalarda tutuyoruz. Örneğin servis url, client secret key, kullanıcı telefon numarası vb. bu bilgiler ile kötü niyetli kişiler servisimize ulaşıp bazı önemli bilgileri alabilir ve bu durum canımızı sıkabilir.

Bu yazıda amacımız kötü niyetli kişilerin uygulamamızı hacklemesini önlemek. Yani uygulamanın hacklenmesini öyle bir zor duruma getirmeliyiz ki kötü niyetli kişi “Yeter bununla uğraşacağıma başka bir uygulama hackleyebilirim” desin.

Peki güvenliği nasıl sağlarım?

Bu süreci iki başlık altında ele almak lazım. Bunlar;

  • Server side güvenlik önlemleri
  • Mobil side güvenlik önlemleri

Hadi Server side güvenlik önlemlerinden başlayalım :)

Not: Aşağıda verdiğim tavsiyelerin hepsini birlikte uygulayabilirsiniz.

Server side güvenlik önlemleri

  1. Yöntem — isteklere sınır koymak

Bu yöntem ile sunucu tarafına aynı IP’den, belli yerlerde gelen istekleri(örneğin login veya şifre validation) sınırlamalıyız. Nasıl yani isteyen istediği kadar login isteği atamasın mı?

Evet atamasın. Çünkü eğer kullanıcı şifresini 5(örnek sayıdır) kez yanlış girmiş ise şüphelenmelisiniz. Servis tarafına şöyle bir kontrol koyabilirsiniz;

Eğer kullanıcı 5 kez login isteği atmış ve hepsinde yanlış bir şifre girmiş ise tekrar istek atabilmesi için 3 dakika beklesin.

Bazı önemli servislere böyle bir kural koyarsanız kötü niyetli kişilerin deneme yanılma hakkını ellerinden alırsınız ve bu durum kötü niyetli kişilerin vazgeçmesine sebep olabilir.

2. Yöntem — istek cevaplarına çok detaylı bilgi dönmemek
Çok basit bir kuraldır. Eğer kullanıcı e-mail veya şifresini yanlış girmiş ise yada girdiği bilgiler hiç database tarafında yok ise kullanıcıya “Böyle bir kullanıcı yok ” yerine “Kullanıcı adı veya şifreniz yanlış” mesajını dönün.
Bu durum kötü niyetli kişinin yanlış yönlenmesine sebep olacaktır.

3. Yöntem — reCAPTCHA
Login ve register kısmına reCAPTCHA entegrasyonu yaparak kötü niyetli kişilerin bu servislere robot ile istek attığını Google ile birlikte kontrol edebilirsiniz. Böyle bir durumda isteği atan tarafa IP ban atabilirsiniz. Tabi bu sadece server side implementasyonu değil mobil side implementasyonda yapmanız gerekir.

4. Yöntem — JWT & Authorization
Server side tarafında authorization işlemi yapmanız gerekir. Çünkü servisiniz hacklendiği zaman kötü niyetli kişiler en azından başka bilgilere erişemesin.

5. Yöntem — Servis endpointi
Rest servis standartlarına göre bir kullanıcının bilgisini güncellemek istiyorsanız endpointiniz şu şekilde olmalı;
endpoint: /users/{userId}
ama servisinizi böyle yaparsanız şöyle bir senaryo yaşayabilirsiniz;

Kötü niyetli kişi servisinizi hackleyip başka bir kullanıcının id bilgisini öğrenir ise /users/{userId} endpointinde {userId} alanına kullanıcının id bilgisini verip ilgili kullanıcının bilgisini güncelleyebilir. Bunun için bazı endpointlerinizi aşağıdaki gibi yapmanız daha doğru olur

endpoint: /users/update-user

Bu servise gelen kullanıcının Authorization Key’inden kim olduğunu alıp eğer gelen Authorization Key güncellenmek istenen kullanıcının Authorization Key’i ise kullanıcı bilgilerini güncelleyebilirsiniz. Bu sayede kötü niyetli kişi sadece bilgisini çaldığı kullanıcının bilgilerini güncelleyebilir.

6. Yöntem- SSL pinning
Yine bu hem mobil tarafta hemde sunucu tarafında yapılması gereken bir işlem( Bu yüzden mobil tavsiyelerinin içinde yer almayacak). Peki bu yöntem ne işe yarıyor?

Server side sadece kendi SSL sertifikasına sahip olan istemcinin attığı isteği kabul edip bunun dışında farklı bir sertifika ile gelen isteği kabul etmez.

İyi güzel anlattında tam olarak ne yapıyor yine anlamadım derseniz bir senaryo ile detaylandırayım.

Mesela bir kafeye gittiniz ve mobil uygulama geliştiriyorsunuz. Kafenin internetine bağlandınız (bu arada tavsiye etmem kendi internetinize bağlanmanız daha sağlıklı) peki gerçekten kafenin internetine mi bağlandınız? Ya kötü niyetli kişi hotspot açmış ve kendi hotspotunu kafenin interneti olarak gösterip kendisine bağlanan kişilerin tüm isteklerini görüyor ise?

Böyle bir durumda eğer araya birisi girmiş ise bize buna Man in the middle atack diyoruz ve böyle bir durumda SSL sertifikasıyla attığınız istek bozulduğu için servise isteğiniz bozuk gidiyor ve servis “bana gelen istek benim SSL sertifikam ile gelmedi o zaman ben bu isteğe cevap dönmeyeyim” diyecektir.

https://www.indusface.com/learning/what-is-ssl-pinning-a-quick-walk-through/#:~:text=SSL%20pinning%20is%20a%20technique,into%20the%20app%20or%20device.

7. Yöntem — Giden gelen veriyi şifrelemek
Bu durum artık biraz daha high level güvenlik önlemi olacaktır. Kötü niyetli kişi bir şekilde istekleri ele geçirdi ve SSL pinning sorununuda çözdü diyelim. Böyle bir durumda eğer attığınız istekler ve cevaplar şifrelenmiş ise kötü niyetli kişi şifrelenme keyini bilmiyorsa elde ettiği veri bir işe yaramayacaktır.

8. Yöntem — Her istekte Authorization Key’i güncelleme
Zaten başlıktanda anladığınız gibi her istek sonucunda Authorization Key’inizi güncelleyebilirsiniz. Bu da bir güvenlik önlemi

Genel olarak yukarıda server side tarafında alınması gereken önlemlerden bahsettim. Peki Android tarafında nasıl önlemler almak gerekir?

Mobil side güvenlik önlemleri

  1. Yöntem — Proguard/R8 veya muadilleri

Proguard ve R8'i kullanarak uygulamanızın kaynak kodunu karıştırabilirsiniz. Bu sayede APK’nız decompile edilse bile karışık olacaktır ve bu durum kötü niyetli kişiyi caydırabilir.
Bu arada Proguard/R8 bir şekilde aşılabiliyor. Dexguard bazı enterprise çözümler mevcut.

2. Yöntem — Özel keylerinizi saklayın

Artık kodunuzun ele geçirilebileceğini biliyorsunuz ve Android uygulamanın içine gömdüğünüz önemli bilgilerin alınabileceğinide biliyorsunuz peki ben bu bilgileri nasıl koruyabilirim?

En güzel yol veriyi mobil tarafta tutmamanız Firebase Remote Config tarafında veya servis tarafında tutabilirsiniz. Bu durum biraz uygulamanın açılışını yavaşlatabilir.

Ben mobilte tutmak istiyorum derseniz en sağlıklı alan NDK tarafında tutmanız olacaktır. Evet yanlış duymadın dostum C++ dosyalarında bu değerleri tutman daha doğru olur. Nasıl tutacağınızı anlatan bir yazı

3. Yöntem — Network isteklerini release modda loglamayın

Birçoğumuz hala Retrofit logging kullanıyor ve canlıya çıkarken loggingi açık unutuyor. Ben telefonu usb ye takıp Google Play’den indirdiğim projelerin servis loglarını görmüşlüğüm var. Bu konuya kesinlikle dikkat edin.

4. Yöntem — Account Manager Kullanın (Eğer projede kullanıcılar için şifre kullanıyor isen)

Bu yöntem sayesinde kullanıcının bilgilerini mobil tarafta tutmak yerine Google’da tutuyorsunuz ve bu size ekstra güvenlik sağlıyor. Hatta farklı cihazlarda aynı Gmail hesabı ile login olmuş iseniz tek bir cihazdan uygulamanıza login olduğunuz zaman farklı cihazlarınızda eğer aynı Gmail hesabı ile login olmuş iseniz uygulamayı tekrar giriş yapmadan kullanabilirsiniz.

https://developer.android.com/reference/android/accounts/AccountManager

5. Yöntem — Mobil tarafta tuttuğunuz verileri şifreleyin

Artık EncryptedSharedPreferences diye bir API var ve bu api ile mobil tarafta tuttuğunuz verileri şifreleyebilirsiniz. Peki database tarafında verileri nasıl şifreleyeceğim?

Bu kütüphane ile database tarafındaki verileri şifreleyebilirsiniz
https://www.zetetic.net/sqlcipher/sqlcipher-for-android/

6. Yöntem — Root detection ve Clone App kontrol

Evet arkadaşlar kötü niyetli kişiler uygulamanızı hacklemek için cihazlarını rootluyor ve uygulamanızı bu şekilde hackliyor. Uygulamanız açılırken eğer cihaz rootlu ise uygulamayı kapatın.

Bazı uygulamalar ise sizin uygulamanızı klonlayabiliyor. Eğer uygulama açılırken uygulamanın açıldığı cihazda sizin uygulamanızın paket ismine ait başka bir uygulama var ise uygulamayı kapatın.

https://proandroiddev.com/preventing-android-app-cloning-e3194269bcfa

7. Yöntem — Network security config kullanın

Arkaşlar herkes manifeste “cleartextTrafficPermitted=true” değerini koyup öyle istek atıyor. Bunu yapmayın android size ekstra bir güvenlik önlemi alma şansı sunmuş bunu değerlendirin

8. Yöntem — Kullandığınız Google Console’ye projenin SHA-1 sertifikasını koyun

Bazen projede Google ürünlerinizi kullanmanız gerekebilir örneğin Google Maps. Böyle durumlarda Google’ye gelen istekler ile uygulamanızın SHA-1 keyini eşleştirin

9. Yöntem — Kütüphaneleri sürekli güncel tutun
Birçoğumuz güncellemesi gelen kütüphaneleri güncellemiyor “ya birşey bozulursa diye :) “ size hak veriyorum ama gelen güncellemede bir güvenlik açığı kapatılmış olabilir. Bu yüzden kütüpahanelerinizi güncel tutmaya dikkat edin.

Benim size tavsiye edeceğim yöntemler bu kadar. Bu yöntemleri kullandığınız zaman uygulamanızda birçok güvenlik önlemini almış olacaksınız. Daha fazla güvenlik önlemi almak için ücretli ürünler mevcut o tarafa yönlenebilirsiniz.

Size elimden geldiğince bedava güvenlik önlemlerinden bahsettim :)

Unutmayın güvenlik uygulama geliştirmek kadar önemli.

Not: Bunlar benim deneyimlerime istinaden verdiğim tavsiyelerdir herhangi bir sorumluluğu kabul etmiyorum

--

--