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 paket nama
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.