Izin Khusus

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:

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