Dışa aktarılan bileşenlere izne dayalı erişim denetimi

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.

İzin tabanlı 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, Manifest içindeki hiçbir android:permission ile ilişkili değilse;
  • Bileşen, kullanıcının daha önce onayladığı bir izin kapsamında hassas bir görev gerçekleştiriyor;
  • Bileşen dışa aktarılır;
  • Bileşen manuel (manifest veya kod düzeyinde) izin kontrolleri gerçekleştirmez;

Bu durumda, kötü amaçlı bir uygulama, güvenlik açığı olan bileşenin ayrıcalıklarını kötüye kullanarak ve güvenlik açığı olan uygulamanın ayrıcalıklarını kötü amaçlı uygulamaya proxy yaparak hassas işlemler gerçekleştirebilir.

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 zorunlu 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

Hassas kaynaklara erişimi olan bileşenleri, kesinlikle gerekli olmadığı sürece dışa aktarmayın. Bunu, Manifest dosyasında android:exported değerini bileşeniniz için false olarak ayarlayarak yapabilirsiniz. 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"/>

İmzaya dayalı izinler uygulama

Kontrol ettiğiniz veya sahibi olduğunuz iki uygulama arasında veri paylaşırken imza tabanlı izinleri kullanın. Bu izinler için kullanıcı onayı gerekmez. Bunun yerine, verilere erişen uygulamaların aynı imzalama anahtarı kullanılarak imzalanıp imzalanmadığı kontrol edilir. Bu kurulum, daha basit 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