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 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 typo dan potensi error lainnya dalam kode Anda.
Konvensi Penamaan
Gunakan konvensi penamaan yang konsisten agar kesalahan ketik lebih terlihat. Periksa dengan cermat deklarasi izin kustom di Manifes aplikasi Anda untuk menemukan kesalahan ketik.
Risiko: Izin yang Terlantar
Izin digunakan untuk menjaga resource aplikasi. Ada dua lokasi yang berbeda tempat aplikasi dapat mendeklarasikan izin yang diperlukan untuk mengakses resource:
- AndroidManifest.xml: Didefinisikan sebelumnya dalam file AndroidManifest.xml (jika tidak
ditentukan, izin
<application>
akan digunakan), misalnya, izin penyedia, izin penerima, izin aktivitas, izin layanan; - 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 yatim. 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 ejaannya
Aplikasi berbahaya dapat menentukan izin yang tidak digunakan lagi dan memperolehnya. 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.
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 kembali) 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"/>
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 yang ditandatangani dengan sertifikat yang sama seperti aplikasi yang mendeklarasikan
izin kustom ini kemudian akan diberi akses ke aktivitas .MyActivity
dan perlu mendeklarasikannya 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, setiap kali izin kustom aplikasi Anda
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 dengan 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
- Meminimalkan permintaan izin
- Ringkasan Izin
- Deskripsi tingkat perlindungan
- CustomPermissionTypo Android Lint
- Cara menggunakan Android Lint
- Makalah riset dengan penjelasan mendalam tentang Izin Android dan temuan pengujian fuzz yang menarik