OWASP kategorisi: MASVS-PLATFORM: Platform Etkileşimi
Genel Bakış
Android izni, kısıtlanmış verilere veya işlemlere erişim isteğinde bulunmak için uygulamanın manifest'inde beyan edilen ve Android çerçevesi tarafından çalışma zamanında uygulanan bir dize tanımlayıcısıdır.
Android izin düzeyleri, izinle ilişkili potansiyel riski belirtir:
- Normal: Düşük riskli izinler, yükleme sırasında otomatik olarak verilir
- Tehlikeli: Hassas kullanıcı verilerine erişime izin verebilecek yüksek riskli izinler. Çalışma zamanında açık kullanıcı onayı gerektirir.
- İmza: Yalnızca izni açıklayan uygulamayla aynı sertifikayla imzalanan uygulamalara verilir. Genellikle sistem uygulamaları veya aynı geliştiricinin uygulamaları arasındaki etkileşimler için kullanılır.
İzne dayalı erişim kontrolleriyle ilgili güvenlik açıkları, uygulamanın bileşeni (ör. etkinlik, alıcı, içerik sağlayıcı veya hizmet) aşağıdaki ölçütlerin tümünü karşıladığında oluşur:
- Bileşen,
Manifest
içindeki hiçbirandroid:permission
ile ilişkili değilse; - Bileşen, kullanıcının önceden onayladığı bir iznin bulunduğu hassas bir görevi gerçekleştirir;
- Bileşen dışa aktarılır;
- Bileşen herhangi bir manuel (manifest veya kod düzeyinde) izin kontrolü gerçekleştirmez;
Böyle bir durumda kötü amaçlı bir uygulama, güvenlik açığına sahip bileşenin ayrıcalıklarını kötüye kullanarak hassas işlemler gerçekleştirebilir ve güvenlik açığına sahip uygulamanın ayrıcalıklarını kötü amaçlı uygulamaya yönlendirebilir.
Etki
Hassas kaynaklara erişmek veya hassas işlemler gerçekleştirmek için güvenlik açığı bulunan bileşenleri dışa aktarabilirsiniz. Bu istenmeyen davranışın etkisi, güvenlik açığı bulunan bileşenin bağlamına ve ayrıcalıklarına bağlıdır.
Çözümler
Hassas görevler için izinler gerekli kılma
Hassas izinlere sahip bir bileşeni dışa aktarırken gelen tüm istekler için aynı izinleri gerekli kılın. Android Studio IDE'de, bu güvenlik açığını tespit etmek ve uygun izinlerin gerekli olduğunu önermek için alıcılar ve hizmetler için dil bilgisi denetimleri bulunur.
Geliştiriciler, aşağıdaki örneklerde gösterildiği gibi, gelen istekler için izinleri Manifest
dosyasında veya hizmeti uygularken kod düzeyinde tanımlayarak isteyebilir.
Xml
<manifest ...>
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application ...>
<service android:name=".MyExportService"
android:exported="true"
android:permission="android.permission.READ_CONTACTS" />
</application>
</manifest>
Kotlin
class MyExportService : Service() {
private val binder = MyExportBinder()
override fun onBind(intent: Intent): IBinder? {
// Enforce calling app has the required permission
enforceCallingPermission(Manifest.permission.READ_CONTACTS, "Calling app doesn't have READ_CONTACTS permission.")
// Permission is enforced, proceed with export logic
return binder
}
// Inner class for your Binder implementation
private inner class MyExportBinder : Binder() {
// Permission is enforced, proceed with export logic
}
}
Java
public class MyExportService extends Service {
@Override
public IBinder onBind(Intent intent) {
// Enforce calling app has the required permission
enforceCallingPermission(Manifest.permission.READ_CONTACTS, "Calling app doesn't have READ_CONTACTS permission.");
return binder;
}
// Inner class for your Binder implementation
private class MyExportBinder extends Binder {
// Permission is enforced, proceed with export logic
}
}
Bileşeni dışa aktarmayın
Kesinlikle gerekli olmadığı sürece hassas kaynaklara erişimi olan bileşenleri dışa aktarmaktan kaçının. Bunu, Manifest
dosyasındaki android:exported
değerini bileşeniniz için false
olarak ayarlayarak yapabilirsiniz. Bu özellik, API düzeyi 31 ve sonrası için varsayılan olarak false
değerine ayarlanır.
Xml
<activity
android:name=".MyActivity"
android:exported="false"/>
İmzaya dayalı izinler uygulama
Kontrol ettiğiniz veya sahibi olduğunuz iki uygulama arasında veri paylaşırken imza tabanlı izinler kullanın. Bu izinler kullanıcı onayı gerektirmez ve verilere erişen uygulamaların aynı imzalama anahtarıyla imzalanıp imzalanmadığını kontrol eder. Bu kurulum, daha kolay ve güvenli bir kullanıcı deneyimi sunar. Özel izinler belirtiyorsanız ilgili güvenlik kurallarını göz önünde bulundurun.
XML
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<permission android:name="my_custom_permission_name"
android:protectionLevel="signature" />
Tek görevli uç noktalar
Uygulamanızı Sorun Ayrıştırma tasarım ilkesine uygun şekilde uygulayın. Her uç nokta, belirli ayrıcalıklarla yalnızca belirli bir dizi görevi gerçekleştirmelidir. Bu iyi tasarım uygulaması, geliştiricinin her uç nokta için ayrıntılı izinler uygulamasını da sağlar. Örneğin, hem takvim hem de kişiler için tek bir uç nokta oluşturmaktan kaçının.
Kaynaklar
- Oversecured blog'dan Android Access to app protected components
- İçerik Sağlayıcılar İçin En İyi Uygulamalar
- Çalışma Zamanı (Tehlikeli) İzinleri
- Endişelerin Ayırılması tasarım ilkesi
- Android izinleriyle ilgili dokümanlar
- Android yayın alıcılarıyla ilgili güvenlik ipuçları
- Android hizmetlerinin güvenliğiyle ilgili ipuçları
- Android 12 (API 31) dışa aktarıldığında varsayılan olarak "false" (yanlış) olarak ayarlandı
- Lint Kontrolü: Dışa aktarılan PreferenceActivity kullanımı dışa aktarılmamalıdır
- Lint Kontrolü: Dışa aktarılan alıcı için izin gerekmiyor
- Lint Kontrolü: Dışa aktarılan hizmet için izin gerekmiyor