Sisteminizde sürekliliğin sağlanması, sorunsuz çalışmaya devam etmesi, bilgilerin çalınmaması vb. sorunların yaşanmaması için yazılım güvenliğinin sağlanması temel gereksinimdir.
Bu makale OWASP Foundation tarafından belirlenen Top 10 Mobil güvenlik tehdidinden ilk olan Improper Platform Usage konusunu açıklayacaktır.
Improper Platform Usage Anlamı Nedir?
Improper Platform Usage, mobil uygulamalarımızın güvenliğine yönelik asıl tehdidi yazılım geliştiricilerin oluşturduğunu ifade etmektedir. Genellikle bir geliştiricinin eksik bilgisi, ihmali veya Android platformunu basit bir nedenle yanlış kullanması en ciddi güvenlik sorunlarını yol açar.
Hiç kimseden tüm platformu baştan sona bilmesini ve geliştiricilerin hatasız olmasını bekleyemeyiz. Fakat geliştiricilerin en yaygın güvenlik açıklarını bilmesi önemlidir. Makale bu konuda size yol gösterecektir.
Güvenlik Açığına Nasıl Sebep Olunur
Android platformunda güvenlik açığına neden olan kodlamanın ilk yaygın örneği, kullandığımız bileşene ya da activity sınıfına dışardan erişebilir olmasını sağlamamızdır.
Diğer uygulamanın sizin uygulamanızdaki ilgili bileşen veya activity sınıfı ile iletişime geçmesine sağlayabilirsiniz. Örneğin, Twitter uygulamasındaki bazı özellikler diğer uygulamalar tarafından kullanılabilmesi için dışarıya iletişime açılmıştır. Böylelikle uygulamamızda Twitter kullanıcısının tweet’lerini listeleyebiliyoruz.
İlgili bileşen veya activity sınıfına dışardan erişilmesi, AndroidManifest.xml dosyasında bu sınıfların tanımlamalarına android:exported=true özelliği ekleyerek sağlanır.
1 2 3 4 5 |
<receiver android:exported="true" android:name="com.smality.QueryReceiver"> <intent-filter> <action android:name="com.android.vending.INSTALL_REFERRER" /> </intent-filter> </receiver> |
Üstteki kodda QueryReceiver adlı yayın alıcı(BroadcastReceiver) bileşenimizi diğer uygulamaların erişimine açtık. Bunun anlamı QueryReceiver yayın alıcısına başka herhangi bir uygulama erişip kullanabilir.
Ek olarak intent-filter yapısını kullanıyorsanız, ilgili bileşene exported özelliğini tanımlamaya gerek kalmadan otomatik olarak dışarıya açık haldedir.
Dışarıya açılan bileşenler hangi saldırılara neden olur?
Kötü niyetli kişiler, ters mühendislik yapılan uygulamalar üzerinden manuel olarak güvenlik açığı arayabilir veya dışarıya açılmış Android bileşenlerini drozer veya adb komutları ile tespit edebilirler.
Belirttiğim güvenlik açığına örnek olarak Mehtab Zafar adlı Security Researcher bir makalesinde Github’ın Android uygulamasında bir XSS hatasını bulduğunu belirtmiştir. Güvenlik açığı içeren kod;
1 2 3 4 5 6 7 8 9 10 11 |
<activity android:theme="@style/NoDisplayTheme" android:name="com.github.android.activities.DeepLinkActivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="http"/> <data android:scheme="https"/> <data android:host="github.com"/> <data android:pathPattern="/.*"/> </intent-filter> </activity> |
Aşağıda belirttiğim adb komutları ile DeepLinkActivity sınıfına erişip, javascript alert kullanarak ekrana “mzfr” gibi bir yazı yazdırmış. İşin özünde Github uygulamasını da sızabildiğimizi görmüş olduk.
1 2 3 4 5 |
#!/bin/bash path="$(printf '%s' 'javascript://github.com/%0aalert\(\"mzfr\"\)')" adb shell am start -a android.intent.action.VIEW -n com.github.android/.activities.DeepLinkActivity -d $path |
Oluşabilecek diğer saldırılardan bazıları:
- Yakaladıkları aktivity sınıfında dosya indirme işlemi varsa virüs içeren dosyalar indirilmesi sağlanabilir. Dosya okuma işlemi varsa uygulamanın dahili hassas verilerini (user token vb.) okumak mümkün olabilir.
- Uygulama Android Webview kullanıyorsa, uygulama içi tarayıcıda bazı kötü amaçlı sitelere yönlendirmeler yapabilirler.
- Sunucu tarafında yeterli güvenlik alınmadıysa, web servis kullanan sınıflar üzerinden sunucu taraflı kötü veriler gönderme, veri silme vb. birçok saldırı yapılabilir.
Üstte bahsettiğim ilk aklıma gelen saldırı olasılıklarıdır. Çok farklı kötü senaryolarla karşı karşıya da kalabilirsiniz.
Saldırılardan Korunma Yöntemi
İlk öncelikle uygulamanızdaki bileşenleri dışarıya açma ihtiyacı duymadığınız sürece AndroidManifest.xml dosyasında exported özelliğini false olarak tanımlamanızı öneriyorum.
Bileşenimizi dışarıya açmak zorunda kaldığımız durumlarda uygulamamızı güvenlik altına alabilmekteyiz. Peki nasıl?
Android platformu, bir uygulamanın açıkta kalan bileşenleriyle etkileşimleri kısıtlamak için “custom permission” (özel izin) tanımlamasına olanak tanır. Özelleştirilmiş izin ve imzalama sertifikasıyla tanımlanan uygulamanıza dışardan saldıran yazılımlarda bu izinin aynısı yoksa saldırı yapamaz. Bu konuyu kimlik doğrulama gibi düşünebilirsiniz.
AndroidManifest.xml dosyanıza aşağıda gibi özelleştirilmiş izin ekleyerek güvenlik kalkanı oluşturmalısınız.
1 2 3 4 5 |
<permission android:name="com.smality.MY_PERMISSION" android:protectionLevel="signature" android:label="A custom permission" /> <uses-permission android:name="com.smality.MY_PERMISSION"/> |
Kaynaklar
https://owasp.org/www-project-mobile-top-10/
https://proandroiddev.com/unpicking-android-security-part-1-improper-platform-usage-ac677a9443b2
https://blog.mzfr.me/posts/2020-11-07-exported-activities/