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:permissionapa pun diManifest; - 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
- Akses Android ke komponen yang dilindungi aplikasi dari blog Oversecured
- Praktik Terbaik Penyedia Konten
- Izin Runtime (Berbahaya)
- Prinsip desain Pemisahan Fokus
- Dokumentasi izin Android
- Tips keamanan penerima siaran Android
- Tips keamanan layanan Android
- Android 12 (API 31) diekspor dengan setelan default "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