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

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, Manifest içindeki herhangi bir android:permission ile 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