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 diberlakukan saat runtime oleh framework Android.

Tingkat izin Android menunjukkan potensi risiko yang terkait dengan izin:

  • Normal: Izin berisiko rendah, otomatis diberikan pada saat penginstalan
  • Berbahaya: Izin berisiko tinggi yang dapat mengizinkan akses ke data pengguna sensitif, yang memerlukan persetujuan eksplisit dari pengguna 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 ini tidak terkait dengan android:permission apa pun di Manifest;
  • Komponen melakukan tugas sensitif yang izinnya sudah disetujui oleh pengguna;
  • Komponen diekspor;
  • Komponen tidak melakukan pemeriksaan izin manual (manifes atau tingkat kode) apa pun;

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

Dampak

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

Mitigasi

Mewajibkan izin untuk tugas sensitif

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

Developer dapat mewajibkan 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 ekspor 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. Dari API level 31 dan seterusnya, atribut ini ditetapkan ke false secara 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, periksa apakah aplikasi yang mengakses data ditandatangani menggunakan kunci penandatanganan yang sama. Penyiapan ini menawarkan pengalaman pengguna yang lebih aman dan sederhana. 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 satu tugas

Implementasikan aplikasi Anda dengan mengikuti prinsip desain Pemisahan Masalah. 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 menayangkan kalender dan kontak.

Referensi