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.

İ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çbir android: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