Kontrol akses berbasis izin ke komponen yang diekspor

Kategori OWASP: MASVS-PLATFORM: Interaksi Platform

Ringkasan

Izin Android adalah ID string yang dideklarasikan dalam manifes aplikasi untuk meminta akses ke data atau tindakan yang dibatasi, yang diterapkan saat runtime oleh framework Android.

Tingkat izin Android menunjukkan potensi risiko yang terkait dengan izin:

  • Normal: Izin berisiko rendah, yang otomatis diberikan saat penginstalan
  • Berbahaya: Izin berisiko tinggi yang dapat memberikan akses ke data pengguna sensitif, yang memerlukan persetujuan pengguna eksplisit saat runtime
  • Tanda tangan: Hanya diberikan ke aplikasi yang ditandatangani dengan sertifikat yang sama seperti aplikasi yang mendeklarasikan izin, biasanya digunakan untuk aplikasi sistem atau interaksi antara aplikasi dari developer yang sama

Kerentanan yang terkait dengan kontrol akses berbasis izin terjadi saat komponen aplikasi (seperti aktivitas, penerima, penyedia konten, atau layanan) memenuhi semua kriteria berikut:

  • Komponen tidak terkait dengan android:permission apa pun di Manifest;
  • Komponen melakukan tugas sensitif yang memiliki izin yang telah disetujui pengguna;
  • Komponen diekspor;
  • Komponen tidak melakukan pemeriksaan izin manual (tingkat manifes atau kode);

Jika hal ini terjadi, aplikasi berbahaya dapat melakukan tindakan sensitif dengan menyalahgunakan hak istimewa komponen yang rentan, yang memproksikan hak istimewa aplikasi yang rentan ke aplikasi berbahaya.

Dampak

Mengekspor komponen yang rentan dapat digunakan untuk mendapatkan akses ke resource sensitif atau melakukan tindakan sensitif. Dampak dari perilaku yang tidak diinginkan ini bergantung pada konteks komponen yang rentan dan hak istimewanya.

Mitigasi

Memerlukan izin untuk tugas sensitif

Saat mengekspor komponen dengan izin sensitif, memerlukan izin yang sama untuk setiap permintaan masuk. Android Studio IDE memiliki pemeriksaan lint untuk penerima dan layanan untuk menemukan kerentanan ini dan merekomendasikan untuk memerlukan izin yang sesuai.

Developer dapat memerlukan izin untuk permintaan masuk dengan mendeklarasikannya dalam file Manifest atau di tingkat kode saat menerapkan layanan, seperti dalam contoh berikut.

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

    }
}

Jangan mengekspor komponen

Hindari mengekspor komponen dengan akses ke resource sensitif kecuali jika benar-benar diperlukan. Anda dapat melakukannya dengan menetapkan android:exported dalam file Manifest ke false untuk komponen Anda. Mulai dari level API 31 dan yang lebih baru, atribut ini ditetapkan ke falsesecara default.

Xml

<activity
    android:name=".MyActivity"
    android:exported="false"/>

Menerapkan izin berbasis tanda tangan

Saat berbagi data antara dua aplikasi yang Anda kontrol atau miliki, gunakan izin berbasis tanda tangan. Izin ini tidak memerlukan konfirmasi pengguna dan, sebagai gantinya, memeriksa apakah aplikasi yang mengakses data ditandatangani menggunakan kunci penandatanganan yang sama. Penyiapan ini menawarkan pengalaman pengguna yang lebih efisien dan aman. Jika Anda mendeklarasikan izin kustom, pertimbangkan panduan keamanan yang sesuai.

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" />

Endpoint tugas tunggal

Implementasikan aplikasi Anda dengan mengikuti prinsip desain Pemisahan Fokus. Setiap endpoint hanya boleh melakukan sekumpulan kecil tugas tertentu dengan hak istimewa tertentu. Praktik desain yang baik ini juga memungkinkan developer menerapkan izin terperinci untuk setiap endpoint. Misalnya, hindari membuat satu endpoint yang melayani kalender dan kontak.

Resource