Kategori OWASP: MASVS-PLATFORM: Interaksi Platform
Ringkasan
Penerima siaran yang diterapkan dengan tidak benar dapat memungkinkan penyerang mengirim intent berbahaya untuk membuat aplikasi yang rentan melakukan tindakan yang tidak dimaksudkan untuk pemanggil eksternal.
Kerentanan umumnya mengacu pada instance saat penerima siaran di
ekspor secara tidak sengaja, baik dengan menetapkan android:exported="true" di
AndroidManifest atau dengan membuat penerima siaran secara terprogram yang
membuat penerima menjadi publik secara default. Jika penerima tidak berisi filter intent
, nilai default-nya adalah "false", tetapi jika penerima berisi minimal satu
filter intent, nilai default android:exported adalah "true".
Penerima siaran yang diekspor secara sengaja tanpa kontrol akses yang tepat dapat disalahgunakan jika developer tidak ingin penerima siaran dipanggil oleh semua aplikasi.
Dampak
Penerima siaran yang diterapkan dengan tidak aman dapat disalahgunakan oleh penyerang untuk mendapatkan akses tidak sah untuk menjalankan perilaku di aplikasi yang tidak dimaksudkan oleh developer untuk diekspos ke pihak ketiga.
Mitigasi
Menghindari masalah sepenuhnya
Untuk mengatasi dilema sepenuhnya, tetapkan exported ke false:
<receiver android:name=".MyReceiver" android:exported="false">
<intent-filter>
<action android:name="com.example.myapp.MY_ACTION" />
</intent-filter>
</receiver>
Menggunakan panggilan dan callback
Jika Anda menggunakan penerima siaran untuk tujuan aplikasi internal (misalnya, notifikasi penyelesaian peristiwa), Anda dapat menyusun ulang kode untuk meneruskan callback yang akan diaktifkan setelah penyelesaian peristiwa.
Pemroses penyelesaian peristiwa
Kotlin
interface EventCompletionListener {
fun onEventComplete(data: String)
}
Java
public interface EventCompletionListener {
public void onEventComplete(String data);
}
Tugas yang aman
Kotlin
class SecureTask(private val listener: EventCompletionListener?) {
fun executeTask() {
// Do some work...
// Notify that the event is complete
listener?.onEventComplete("Some secure data")
}
}
Java
public class SecureTask {
final private EventCompletionListener listener;
public SecureTask(EventCompletionListener listener) {
this.listener = listener;
}
public void executeTask() {
// Do some work...
// Notify that the event is complete
if (listener != null) {
listener.onEventComplete("Some secure data");
}
}
}
Aktivitas utama
Kotlin
class MainActivity : AppCompatActivity(), EventCompletionListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val secureTask = SecureTask(this)
secureTask.executeTask()
}
override fun onEventComplete(data: String) {
// Handle event completion securely
// ...
}
}
Java
public class MainActivity extends AppCompatActivity implements EventCompletionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SecureTask secureTask = new SecureTask(this);
secureTask.executeTask();
}
@Override
public void onEventComplete(String data) {
// Handle event completion securely
// ...
}
}
Mengamankan penerima siaran dengan izin
Hanya daftarkan penerima dinamis untuk siaran yang dilindungi (siaran yang hanya dapat dikirim oleh aplikasi tingkat sistem) atau dengan izin tingkat tanda tangan yang dideklarasikan sendiri.