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 diterapkan.

Izin kustom dirancang untuk memungkinkan berbagi resource dan kemampuan dengan aplikasi lain. Contoh penggunaan izin kustom yang sah dapat berupa hal 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 kelemahan bergantung pada resource yang dilindungi dan izin terkait layanan aplikasi asli.

Risiko: Salah Tulis Izin Kustom

Izin kustom dapat dideklarasikan dalam Manifes, tetapi izin kustom yang berbeda digunakan untuk melindungi komponen Android yang diekspor, karena kesalahan ketik. Aplikasi berbahaya dapat memanfaatkan aplikasi yang salah mengeja izin dengan:

  • Mendaftarkan izin tersebut terlebih dahulu
  • Mengantisipasi ejaan dalam aplikasi berikutnya

Hal ini dapat memungkinkan aplikasi mengakses resource atau mengontrol aplikasi korban tanpa izin.

Misalnya, aplikasi yang rentan ingin melindungi komponen dengan menggunakan izin READ_CONTACTS, tetapi tidak sengaja salah mengeja izin tersebut sebagai READ_CONACTS. Aplikasi jahat dapat mengklaim READ_CONACTS karena tidak dimiliki oleh aplikasi apa pun (atau sistem) dan mendapatkan akses ke komponen yang dilindungi. Varian umum lain dari kerentanan ini adalah android:permission=True. Nilai seperti true dan false, terlepas dari kapitalisasi, adalah input yang tidak valid untuk deklarasi izin dan diperlakukan sama dengan kesalahan ketik deklarasi izin kustom lainnya. Untuk memperbaiki masalah ini, 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 typo dan potensi error lainnya dalam kode Anda.

Konvensi Penamaan

Gunakan konvensi penamaan yang konsisten agar kesalahan ketik lebih terlihat. Periksa deklarasi izin kustom dengan cermat di Manifes aplikasi Anda untuk menemukan kesalahan ketik.


Risiko: Izin yang Terlantar

Izin digunakan untuk menjaga 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 usang. Situasi ini dapat terjadi karena sejumlah alasan, seperti:

  • Mungkin ada pembatalan sinkronisasi 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 salah dieja

Aplikasi berbahaya dapat menentukan izin yang tidak digunakan lagi dan mendapatkannya. Jika hal ini terjadi, aplikasi dengan hak istimewa yang memercayai izin yang tidak digunakan lagi untuk melindungi komponen dapat disusupi.

Jika aplikasi dengan hak istimewa menggunakan izin untuk melindungi atau membatasi komponen apa pun, hal ini dapat memberi aplikasi berbahaya akses ke komponen tersebut. Contohnya meliputi meluncurkan aktivitas yang dilindungi oleh izin, mengakses penyedia konten, atau menyiarkan ke penerima siaran yang dilindungi oleh izin yang tidak digunakan lagi.

Hal ini juga dapat menciptakan situasi saat aplikasi dengan hak istimewa tertipu untuk meyakini bahwa aplikasi berbahaya adalah aplikasi yang sah sehingga memuat file atau konten.

Mitigasi

Pastikan semua izin kustom yang digunakan aplikasi Anda untuk melindungi komponen juga ditentukan dalam Manifes.

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 melakukannya:

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: android:protectionLevel disalahgunakan

Atribut ini menjelaskan tingkat risiko potensial 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 memberikan sedikit keamanan.

Gunakan 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 kembali) dan simpan dengan aman di keystore.

Tentukan izin kustom sebagai berikut dalam Manifes Anda:

Xml

<permission
    android:name="my.custom.permission.MY_PERMISSION"
    android:protectionLevel="signature"/>

Batasi akses ke, misalnya, aktivitas, hanya ke aplikasi yang memiliki izin kustom ini yang diberikan, sebagai berikut:

Xml

<activity android:name=".MyActivity" android:permission="my.custom.permission.MY_PERMISSION"/>

Aplikasi lain apa pun yang ditandatangani menggunakan sertifikat yang sama seperti aplikasi yang mendeklarasikan izin kustom ini kemudian akan diberi akses ke aktivitas .MyActivity dan perlu mendeklarasikannya seperti 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, setiap kali izin kustom aplikasi dihapus karena uninstal atau update, mungkin ada aplikasi berbahaya yang masih dapat menggunakan izin kustom tersebut sehingga mengabaikan pemeriksaan. Hal ini disebabkan oleh kerentanan eskalasi hak istimewa (CVE-2019-2200) yang diperbaiki di Android 10.

Ini adalah salah satu alasan (beserta risiko kondisi perlombaan) mengapa pemeriksaan tanda tangan direkomendasikan daripada izin kustom.


Risiko: Kondisi Race

Jika aplikasi 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 lainnya, aplikasi kedua dapat memverifikasi bahwa kedua aplikasi tersebut ditandatangani dengan sertifikat yang sama sebelum mematuhi permintaan tersebut.


Referensi