OWASP kategorisi: MASVS-PLATFORM: Platform Etkileşimi
Genel Bakış
Android izni, uygulamanın manifest dosyasında, kısıtlanmış verilere veya işlemlere erişim isteğinde bulunmak için beyan edilen bir dize tanımlayıcısıdır. Bu izin, çalışma zamanında Android çerçevesi tarafından zorunlu kılınır.
Android izin düzeyleri, izinle ilişkili olası riski gösterir:
- 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 kullanıcının açık onayı gerekir.
- İmza: Yalnızca izni bildiren 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ı, bir 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 ortaya çıkar:
- Bileşen,
Manifestiçindeki herhangi birandroid:permissionile ilişkilendirilmemişse; - Bileşen, kullanıcının daha önce onayladığı bir iznin bulunduğu hassas bir görev gerçekleştiriyor.
- Bileşen dışa aktarılır.
- Bileşen, herhangi bir manuel (bildiri veya kod düzeyinde) izin kontrolü gerçekleştirmez;
Bu durumda, kötü amaçlı bir uygulama, savunmasız bileşenin ayrıcalıklarını kötüye kullanarak hassas işlemler gerçekleştirebilir ve savunmasız uygulamanın ayrıcalıklarını kötü amaçlı uygulamaya vekil olarak atayabilir.
Etki
Güvenlik açığı olan bileşenlerin dışa aktarılması, hassas kaynaklara erişmek veya hassas işlemler gerçekleştirmek için kullanılabilir. Bu istenmeyen davranışın etkisi, savunmasız bileşenin bağlamına ve ayrıcalıklarına bağlıdır.
Çözümler
Hassas görevler için izin gerektir
Hassas izinlere sahip bir bileşeni dışa aktarırken gelen tüm istekler için aynı izinleri zorunlu kılın. Android Studio IDE, bu güvenlik açığını tespit etmek ve uygun izinlerin istenmesini önermek için alıcılar ve hizmetler ile ilgili lint kontrollerine sahiptir.
Geliştiriciler, gelen istekler için izinleri Manifest dosyasında veya hizmeti uygularken kod düzeyinde aşağıdaki örneklerde olduğu gibi bildirebilir.
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 aktarmayın. Bunun için Manifest dosyasındaki android:exported değerini bileşeniniz için false olarak ayarlamanız gerekir. API düzeyi 31 ve sonraki sürümlerde bu özellik varsayılan olarak false olarak ayarlanır.
Xml
<activity
android:name=".MyActivity"
android:exported="false"/>
İmza tabanlı izinleri uygulama
Kontrol ettiğiniz veya sahibi olduğunuz iki uygulama arasında veri paylaşırken imzaya dayalı izinleri kullanın. Bu izinler için kullanıcı onayı gerekmez. Bunun yerine, verilere erişen uygulamaların aynı imzalama anahtarı kullanılarak imzalandığı kontrol edilir. Bu kurulum, daha kolay ve güvenli bir kullanıcı deneyimi sunar. Özel izinler tanımlıyorsanı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ı İlgi Alanlarının Ayrılması tasarım ilkesine göre uygulayın. Her uç nokta, yalnızca belirli ayrıcalıklarla belirli görevlerden oluşan küçük bir grubu 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 takvime hem de kişilere hizmet veren tek bir uç nokta oluşturmaktan kaçının.
Kaynaklar
- Oversecured blogundaki uygulama korumalı bileşenlere Android erişimi
- İçerik Sağlayıcılarla İlgili En İyi Uygulamalar
- Çalışma Zamanı (Tehlikeli) İzinleri
- İlgi Alanlarını Ayırma tasarım ilkesi
- Android izinleri dokümanları
- Android yayın alıcılarının güvenliğiyle ilgili ipuçları
- Android hizmetlerinin güvenliğiyle ilgili ipuçları
- Android 12 (API 31) dışa aktarılan varsayılan küme "false" olarak ayarlandı
- Lint Check: Exported PreferenceActivity shouldn't be exported (Lint Kontrolü: Dışa aktarılan PreferenceActivity dışa aktarılmamalıdır)
- Lint Check: Exported Receiver doesn't require permission (Lint Kontrolü: Dışa aktarılan alıcı için izin gerekmiyor)
- Lint Check: Exported Service doesn't require permission (Lint Kontrolü: Dışa aktarılan hizmet için izin gerekmiyor)