Pengirim Intent yang Tertunda

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:

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.

Referensi