Kategori OWASP: MASVS-CODE: Kualitas Kode
Ringkasan
Risiko yang terkait dengan Izin Kustom muncul saat definisi izin kustom tidak ada atau salah eja, atau saat atribut android:protectionLevel yang sesuai disalahgunakan dalam Manifes.
Misalnya, risiko ini dapat dieksploitasi dengan membuat izin kustom dengan nama yang sama, tetapi ditentukan oleh aplikasi berbahaya dan dengan tingkat perlindungan yang berbeda.
Izin kustom dirancang untuk memungkinkan berbagi resource dan kemampuan dengan aplikasi lain. Contoh penggunaan izin kustom yang sah dapat berupa sebagai berikut:
- Mengontrol komunikasi antarproses (IPC) antara dua aplikasi atau lebih
- Mengakses layanan pihak ketiga
- Membatasi akses ke data bersama aplikasi
Dampak
Dampak dari pemanfaatan kerentanan ini adalah aplikasi berbahaya dapat memperoleh akses ke resource yang awalnya dimaksudkan untuk dilindungi. Implikasi kerentanan ini bergantung pada resource yang dilindungi dan izin terkait layanan aplikasi asli.
Risiko: Salah Ketik Izin Kustom
Izin kustom dapat dideklarasikan dalam Manifes, tetapi izin kustom lain digunakan untuk melindungi komponen Android yang diekspor, karena salah ketik. Aplikasi berbahaya dapat memanfaatkan aplikasi yang salah mengeja izin dengan:
- Mendaftarkan izin tersebut terlebih dahulu
- Memprediksi ejaan dalam aplikasi berikutnya
Hal ini dapat memungkinkan aplikasi mendapatkan akses tidak sah ke resource atau kontrol atas aplikasi korban.
Misalnya, aplikasi yang rentan ingin melindungi komponen dengan menggunakan izin
READ_CONTACTS, tetapi secara tidak sengaja salah mengeja izin sebagai READ_CONACTS. Aplikasi
berbahaya dapat mengklaim READ_CONACTS karena tidak dimiliki oleh aplikasi
(atau sistem) mana pun dan mendapatkan akses ke komponen yang dilindungi. Varian umum lain dari kerentanan ini adalah android:permission=True. Nilai seperti
true dan false, terlepas dari kapitalisasinya, adalah input yang tidak valid untuk
deklarasi izin dan diperlakukan sama dengan kesalahan ketik deklarasi izin kustom lainnya. Untuk memperbaikinya, nilai atribut android:permission
harus diubah menjadi string izin yang valid. Misalnya, jika aplikasi perlu
mengakses kontak pengguna, nilai atribut android:permission
harus android.permission.READ_CONTACTS.
Mitigasi
Pemeriksaan Lint Android
Saat mendeklarasikan izin kustom, gunakan pemeriksaan lint Android untuk membantu Anda menemukan salah ketik dan potensi kesalahan lainnya dalam kode Anda.
Konvensi Penamaan
Gunakan konvensi penamaan yang konsisten untuk membuat kesalahan ketik lebih terlihat. Periksa dengan cermat deklarasi izin kustom di Manifes aplikasi Anda untuk menemukan salah ketik.
Risiko: Izin yang Tidak Terkait
Izin digunakan untuk melindungi resource aplikasi. Ada dua lokasi berbeda tempat aplikasi dapat mendeklarasikan izin yang diperlukan untuk mengakses resource:
- AndroidManifest.xml: Ditentukan sebelumnya dalam file AndroidManifest.xml (jika tidak ditentukan, izin
<application>akan digunakan), misalnya, provider permission, receiver permission, activity permission, service permission; - Kode: Terdaftar dalam kode runtime, misalnya,
registerReceiver().
Namun, terkadang izin ini tidak ditentukan oleh tag
<permission> yang sesuai dalam Manifes APK di perangkat. Dalam hal ini, izin tersebut disebut izin tidak terkait. Situasi ini dapat terjadi karena sejumlah alasan, seperti:
- Mungkin ada desinkronisasi antara update pada Manifes dan kode dengan pemeriksaan izin
- APK dengan izin mungkin tidak disertakan dalam build, atau versi yang salah dapat disertakan
- Nama izin dalam pemeriksaan atau Manifes mungkin salah eja
Aplikasi berbahaya dapat menentukan izin yang tidak terkait dan memperolehnya. Jika hal ini terjadi, aplikasi istimewa yang memercayai izin yang tidak memiliki induk untuk melindungi komponen dapat terganggu.
Jika aplikasi istimewa menggunakan izin untuk melindungi atau membatasi komponen apa pun, hal ini dapat memberikan akses aplikasi berbahaya ke komponen tersebut. Contohnya mencakup meluncurkan aktivitas yang dilindungi oleh izin, mengakses penyedia konten, atau menyiarkan ke penerima siaran yang dilindungi oleh izin yang tidak memiliki pemilik.
Hal ini juga dapat menciptakan situasi di mana aplikasi yang memiliki hak istimewa ditipu sehingga mengira aplikasi berbahaya adalah aplikasi yang sah dan oleh karena itu memuat file atau konten.
Mitigasi
Pastikan semua izin kustom yang digunakan aplikasi Anda untuk melindungi komponen juga ditentukan dalam Manifes Anda.
Aplikasi menggunakan izin kustom my.app.provider.READ dan
my.app.provider.WRITE untuk melindungi akses ke penyedia konten:
Xml
<provider android:name="my.app.database.CommonContentProvider" android:readPermission="my.app.provider.READ" android:writePermission="my.app.provider.WRITE" android:exported="true" android:process=":myappservice" android:authorities="my.app.database.contentprovider"/>
Aplikasi juga menentukan dan menggunakan izin kustom ini, sehingga mencegah aplikasi berbahaya lainnya melakukan hal yang sama:
Xml
<permission android:name="my.app.provider.READ"/>
<permission android:name="my.app.provider.WRITE"/>
<uses-permission android:name="my.app.provider.READ" />
<uses-permission android:name="my.app.provider.WRITE" />
Risiko: Salah menggunakan android:protectionLevel
Atribut ini menjelaskan tingkat potensi risiko dalam izin dan menunjukkan prosedur yang harus diikuti sistem saat memutuskan apakah akan memberikan izin atau tidak.
Mitigasi
Menghindari Tingkat Perlindungan Normal atau Berbahaya
Menggunakan protectionLevel normal atau berbahaya pada izin Anda berarti
sebagian besar aplikasi dapat meminta dan mendapatkan izin:
- "normal" hanya memerlukan deklarasi
- "berbahaya" akan disetujui oleh banyak pengguna
Oleh karena itu, protectionLevels ini tidak memberikan keamanan yang memadai.
Menggunakan Izin Tanda Tangan (Android >= 10)
Gunakan tingkat perlindungan tanda tangan jika memungkinkan. Dengan menggunakan kemampuan ini, hanya aplikasi lain yang ditandatangani dengan sertifikat yang sama seperti aplikasi yang membuat izin yang dapat mengakses fitur yang dilindungi tersebut. Pastikan Anda menggunakan sertifikat penandatanganan khusus (tidak digunakan ulang) dan menyimpannya dengan aman di keystore.
Tentukan izin kustom sebagai berikut dalam Manifes Anda:
Xml
<permission
android:name="my.custom.permission.MY_PERMISSION"
android:protectionLevel="signature"/>
Membatasi akses ke, misalnya, aktivitas, hanya untuk aplikasi yang telah diberi izin kustom ini, sebagai berikut:
Xml
<activity android:name=".MyActivity" android:permission="my.custom.permission.MY_PERMISSION"/>
Aplikasi lain yang ditandatangani dengan sertifikat yang sama seperti aplikasi yang menyatakan izin kustom ini akan diberi akses ke aktivitas .MyActivity dan harus menyatakannya sebagai berikut dalam Manifesnya:
Xml
<uses-permission android:name="my.custom.permission.MY_PERMISSION" />
Waspadai Izin Kustom Tanda Tangan (Android < 10)
Jika aplikasi Anda menargetkan Android < 10, maka setiap kali izin kustom aplikasi Anda dihapus karena uninstal atau update, aplikasi berbahaya dapat terus menggunakan izin kustom tersebut dan dengan demikian melewati pemeriksaan. Hal ini disebabkan oleh kerentanan eskalasi hak istimewa (CVE-2019-2200) yang telah diperbaiki di Android 10.
Inilah salah satu alasan (bersama dengan risiko kondisi persaingan) mengapa pemeriksaan tanda tangan direkomendasikan daripada izin kustom.
Risiko: Kondisi Race
Jika aplikasi yang sah A menentukan izin kustom tanda tangan yang digunakan oleh
aplikasi X lain, tetapi kemudian di-uninstal, aplikasi berbahaya B dapat
menentukan izin kustom yang sama dengan protectionLevel yang berbeda, misalnya,
normal. Dengan cara ini, B mendapatkan akses ke semua komponen yang dilindungi oleh izin kustom tersebut di aplikasi X tanpa perlu ditandatangani dengan sertifikat yang sama seperti aplikasi A.
Hal yang sama terjadi jika B diinstal sebelum A.
Mitigasi
Jika ingin membuat komponen hanya tersedia untuk aplikasi yang ditandatangani dengan tanda tangan yang sama seperti aplikasi penyedia, Anda mungkin dapat menghindari penetapan izin kustom untuk membatasi akses ke komponen tersebut. Dalam situasi ini, Anda dapat menggunakan pemeriksaan tanda tangan. Saat salah satu aplikasi Anda mengajukan permintaan untuk aplikasi Anda yang lain, aplikasi kedua dapat memverifikasi bahwa kedua aplikasi tersebut ditandatangani dengan sertifikat yang sama sebelum mematuhi permintaan tersebut.
Resource
- Meminimalkan permintaan izin
- Ringkasan Izin
- Deskripsi tingkat perlindungan
- Kesalahan Ketik CustomPermission Android Lint
- Cara menggunakan Android Lint
- Karya ilmiah dengan penjelasan mendalam tentang Izin Android dan temuan pengujian fuzz yang menarik