Siaran Melekat

Kategori OWASP: MASVS-PLATFORM: Interaksi Platform

Ringkasan

Aplikasi Android dan sistem Android dapat menggunakan siaran sebagai sistem pesan untuk memberi tahu aplikasi lain tentang peristiwa yang mungkin diminati aplikasi tersebut. Siaran melekat adalah jenis siaran khusus ketika objek intent yang dikirim tetap berada dalam cache setelah siaran selesai. Sistem dapat menyiarkan ulang intent melekat ke pendaftaran penerima nanti. Sayangnya, sticky broadcast API mengalami beberapa kekurangan terkait keamanan. Itulah sebabnya API ini tidak digunakan lagi di Android 5.0 (API level 21).

Siapa pun dapat mengakses siaran melekat

Siaran melekat tidak dapat dibatasi untuk penerima yang memiliki izin tertentu. Oleh karena itu, siaran melekat tidak cocok untuk menyiarkan informasi sensitif. Anda mungkin berpikir bahwa menentukan nama paket aplikasi di Intent siaran akan membatasi kumpulan BroadcastReceivers:

Kotlin

val intent = Intent("com.example.NOTIFY").apply {
    setPackage("com.example.myapp")
}
applicationContext.sendBroadcast(intent)

Java

Intent intent = new Intent("com.example.NOTIFY");
intent.setPackage("com.example.myapp");
getApplicationContext().sendBroadcast(intent);

Dalam contoh ini, hanya penerima dalam paket com.example.myapp yang akan menerima intent saat siaran dikirim. Namun, filter nama paket tidak diterapkan saat Intent disiarkan ulang dari cache melekat. Saat mendaftarkan penerima menggunakan metode registerReceiver(), semua intent dalam cache melekat yang cocok dengan filter yang ditentukan akan disiarkan ulang ke penerima, terlepas dari nama paket penerima.

Siapa pun dapat mengirim siaran melekat

Untuk mengirim siaran melekat, aplikasi hanya memerlukan izin android.permission.BROADCAST_STICKY, yang diberikan secara otomatis saat aplikasi diinstal. Oleh karena itu, penyerang dapat mengirim intent apa pun ke penerima, yang berpotensi mendapatkan akses yang tidak sah ke aplikasi lain. Penerima siaran dapat membatasi pengirim kepada mereka yang memiliki izin tertentu. Namun, dengan melakukannya, penerima tidak akan dapat menerima siaran dari cache melekat karena tidak dikirim dalam konteks identitas aplikasi apa pun dan tidak disiarkan dengan izin apa pun.

Siapa pun dapat mengubah siaran melekat

Jika intent adalah bagian dari siaran melekat, intent tersebut akan menggantikan instance sebelumnya yang memiliki tindakan, data, jenis, ID, class, dan kategori yang sama di cache melekat. Oleh karena itu, penyerang dapat dengan mudah menimpa data tambahan dalam intent melekat dari aplikasi yang sah, yang kemudian dapat disiarkan ulang ke penerima lain.

Siaran yang dikirim menggunakan metode sendStickyOrderedBroadcast() dikirim ke satu penerima dalam satu waktu agar penerima dengan prioritas yang lebih tinggi dapat memakai siaran sebelum dikirim ke penerima yang memiliki prioritas lebih rendah. Karena dijalankan secara bergantian, setiap penerima dapat menyebarkan hasil ke penerima berikutnya, seperti dengan memanggil setResultData(), atau dapat membatalkan siaran, sehingga penerima berikutnya tidak menerima siaran. Penyerang yang dapat menerima siaran yang dilakukan secara melekat dari aplikasi yang sah dapat membuat penerima berprioritas tinggi untuk memodifikasi data hasil siaran atau menghapus siaran sepenuhnya.

Dampak

Dampaknya bervariasi, bergantung pada cara siaran melekat digunakan dan data apa yang diteruskan ke penerima siaran. Secara umum, penggunaan siaran melekat dapat menyebabkan eksposur data sensitif, modifikasi data, akses tidak sah untuk menjalankan perilaku di aplikasi lain, dan denial of service.

Mitigasi

Siaran melekat tidak boleh digunakan. Pola yang direkomendasikan adalah menggunakan siaran tidak melekat dengan mekanisme lain, seperti database lokal, untuk mengambil nilai saat ini kapan pun diinginkan.

Developer dapat mengontrol siapa yang dapat menerima siaran tidak melekat menggunakan izin atau dengan menetapkan nama paket aplikasi pada intent. Selain itu, jika siaran tidak perlu dikirim ke komponen di luar aplikasi, gunakan LiveData, yang menerapkan pola pengamat.

Informasi selengkapnya tentang mengamankan siaran dapat ditemukan di halaman ringkasan siaran.