Kategori OWASP: MASVS-CODE: Kualitas Kode
Ringkasan
Menggunakan PendingIntent.getCreator*()
atau PendingIntent.getTarget*()
untuk menentukan apakah akan memercayai pengirim PendingIntent menimbulkan risiko eksploitasi.
PendingIntent.getCreator*()
atau
PendingIntent.getTarget*()
menampilkan pembuat
PendingIntent, yang tidak selalu cocok dengan pengirimnya. Pembuatnya mungkin tepercaya, tetapi
pengirimnya tidak boleh dipercaya, karena pengirimnya mungkin aplikasi berbahaya
yang mendapatkan PendingIntent aplikasi lain menggunakan berbagai mekanisme, misalnya:
- dari
NotificationListenerService
- kasus penggunaan yang sah yang merupakan bagian dari aplikasi rentan.
Contoh penggunaan PendingIntent.getCreator*()
atau PendingIntent.getTarget*()
yang sah adalah untuk menampilkan ikon aplikasi yang akan dimulai oleh PendingIntent.
Dampak
Memercayai pengirim PendingIntent karena Anda mengkueri (dan memercayai) kreator dapat menyebabkan kerentanan. Jika aplikasi memercayai pengirim PendingIntent berdasarkan pembuatnya, lalu membagikan logika autentikasi atau otorisasinya, maka setiap kali pengirim PendingIntent adalah aplikasi berbahaya, hal ini akan menyebabkan pengabaian autentikasi atau bahkan berpotensi eksekusi kode jarak jauh berdasarkan input yang tidak valid dan tidak tepercaya, bergantung pada penerapan kode aplikasi yang rentan.
Mitigasi
Membedakan pengirim dan kreator
Semua jenis logika autentikasi atau otorisasi yang dilakukan saat menerima
PendingIntent tidak boleh didasarkan pada asumsi terkait
pembuat PendingIntent yang diidentifikasi menggunakan PendingIntent.getCreator*()
atau PendingIntent.getTarget*()
.
Menggunakan cara alternatif untuk memvalidasi pemanggil
Jika Anda perlu mengautentikasi pemanggil, bukan menggunakan PendingIntent, Anda harus menggunakan Service atau ContentProvider – keduanya memungkinkan pengambilan UID pemanggil dengan Binder.getCallingUid() saat Anda berada dalam konteks pengiriman IPC masuk. UID dapat dikueri nanti menggunakan PackageManager.getPackagesForUid().
Pendekatan lain, yang tersedia dari level API 34, adalah menggunakan BroadcastReceiver.getSentFromUid() atau BroadcastReceiver.getSentFromPackage() jika pengirim memilih untuk membagikan identitas selama siaran menggunakan BroadcastOptions.isShareIdentityEnabled().
Anda harus selalu memeriksa apakah paket yang memanggil memiliki tanda tangan yang diharapkan, karena paket yang di-sideload dapat memiliki nama paket yang tumpang-tindih dengan nama paket dari Play Store.