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 diManifest
; - 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
- Akses Android ke komponen yang dilindungi aplikasi dari blog Oversecured
- Praktik Terbaik Penyedia Konten
- Izin Runtime (Berbahaya)
- Prinsip desain Pemisahan Kekhawatiran
- Dokumentasi izin Android
- Tips keamanan penerima siaran Android
- Tips keamanan layanan Android
- Default yang diekspor Android 12 (API 31) ditetapkan ke "false"
- Pemeriksaan Lint: PreferenceActivity yang diekspor tidak boleh diekspor
- Pemeriksaan Lint: Penerima yang Diekspor tidak memerlukan izin
- Pemeriksaan Lint: Layanan yang Diekspor tidak memerlukan izin