Perbaikan untuk Kerentanan Intent Redirection

Informasi ini ditujukan bagi developer yang memiliki aplikasi dengan Kerentanan Intent Redirection.

Apa yang terjadi

Satu atau beberapa aplikasi Anda memiliki masalah Intent Redirection yang dapat memungkinkan aplikasi berbahaya mengakses komponen atau file aplikasi pribadi. Harap tinjau langkah-langkah detail di bawah ini untuk memperbaiki masalah pada aplikasi Anda. Setelah melewati batas waktu yang ditampilkan di Konsol Play Anda, aplikasi apa pun yang memiliki kerentanan keamanan yang belum diperbaiki akan dihapus dari Google Play.

Diperlukan tindakan​

  1. Login ke Konsol Play Anda, lalu buka bagian Peringatan untuk melihat apa saja aplikasi yang terpengaruh dan batas waktu untuk mengatasi masalah ini.
  2. Update aplikasi Anda yang terpengaruh sesuai dengan langkah-langkah yang dijelaskan di bawah ini.
  3. Kirimkan versi terupdate aplikasi Anda yang terpengaruh.

Setelah dikirim ulang, aplikasi Anda akan ditinjau kembali. Proses ini dapat memerlukan waktu beberapa jam. Jika aplikasi lolos dari proses peninjauan dan dipublikasikan, Anda tidak perlu melakukan tindakan lebih lanjut. Jika aplikasi gagal ditinjau, versi aplikasi baru tidak akan dipublikasikan dan Anda akan menerima pemberitahuan via email.

Detail tambahan

Menggunakan Intent yang tidak tepercaya untuk meluncurkan komponen (misalnya, dengan memanggil startActivity) atau untuk menampilkan data (misalnya, dengan memanggil setResult) akan membahayakan dan dapat memungkinkan aplikasi yang berbahaya menyebabkan masalah berikut: 

  1. Mencuri data sistem atau file yang sensitif (seperti pesan SMS) dari aplikasi Anda
  2. Meluncurkan komponen pribadi aplikasi Anda dengan argumen yang berbahaya.

Aplikasi Anda tidak boleh memanggil startActivity, startService, sendBroadcast, atau setResult pada Intent yang tidak tepercaya tanpa memvalidasi atau memastikan keamanan Intent tersebut.

Sebaiknya Anda mencegah kerentanan ini dengan salah satu cara berikut:

Opsi 1: Ubah komponen aplikasi yang terpengaruh, sebagai tempat Intent yang diekstrak akan dialihkan, menjadi pribadi.

Jika komponen aplikasi yang terpengaruh tidak perlu menerima Intent dari aplikasi lain, maka Anda dapat mengubah komponen aplikasi tersebut menjadi pribadi dengan menetapkan android:exported=”false” di Manifes Anda.

Opsi 2: Pastikan Intent yang diekstrak berasal dari sumber tepercaya.

Anda dapat memverifikasi apakah Aktivitas asli dapat dipercaya atau tidak menggunakan metode seperti getCallingActivity. Contoh:

 // check if the originating Activity is from trusted package
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // extract the nested Intent
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // redirect the nested Intent
   startActivity(forward);
 }

Catatan:

  • Memeriksa apakah getCallingActivity() mengembalikan nilai non-null tidak akan dapat mencegah kerentanan. Aplikasi berbahaya dapat menyediakan nilai null untuk fungsi ini.
  • Dalam kasus SMS Retriever Auth Layanan Google Play, melindungi penerima siaran dengan SEND_PERMISSION akan memastikan bahwa Intent memang berasal dari Layanan Play.

Opsi 3: Pastikan Intent yang akan dialihkan tidak berbahaya.

Anda harus memastikan bahwa Intent yang dialihkan

  1. tidak akan dikirimkan ke komponen pribadi apa pun di aplikasi Anda, dan
  2. tidak akan dikirimkan ke komponen aplikasi eksternal. Jika pengalihan ditujukan untuk menargetkan aplikasi eksternal, pastikan intent tidak akan memberikan izin URI ke salah satu penyedia konten pribadi atau data sistem aplikasi Anda.

Aplikasi dapat memeriksa komponen mana yang akan digunakan untuk menangani Intent sebelum mengalihkannya menggunakan metode seperti resolveActivity. Contoh:

 Intent intent = getIntent();
 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the component name
 ComponentName name = forward.resolveActivity(getPackageManager());
 // check that the package name and class name are as intended
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // redirect the nested Intent
   startActivity(forward);
 }

Aplikasi dapat memeriksa apakah Intent memberikan izin URI menggunakan metode seperti getFlags. Contoh:

 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the flags
 int flags = forward.getFlags();
 // check that the nested intent does not grant URI permissions
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
   // redirect the nested Intent
   startActivity(forward);
 }

Aplikasi juga dapat menghapus pemberian izin URI menggunakan removeFlags. Contoh:

 // untrusted Intent
 Intent intent = getIntent();
 // remove the grant URI permissions in the untrusted Intent
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // pass the untrusted Intent
 setResult(intent);

Memahami Peringatan dan Memilih Opsi Pencegahan 

Konsol Play akan mengirimkan laporan saat aplikasi Anda memanggil startActivity, startActivityForResult, startService, sendBroadcast, atau setResult menggunakan Intent yang tidak tepercaya. Untuk lebih memahami opsi pencegahan mana yang paling sesuai, lacak kembali dan periksa pemanggil metode untuk menemukan asal Intent yang tidak tepercaya. Misalnya, untuk Opsi 1, lacak kembali untuk menentukan komponen mana yang perlu diubah menjadi pribadi.

Kami siap membantu

Jika memiliki pertanyaan teknis terkait kerentanan, Anda dapat mempostingnya ke Stack Overflow dan gunakan tag “android-security”. Untuk memperoleh penjelasan tentang langkah-langkah yang perlu dilakukan guna mengatasi masalah ini, Anda dapat menghubungi tim dukungan developer kami.

Apakah ini membantu?

Bagaimana cara meningkatkannya?
false
Menu utama
16890467789840633809
true
Pusat Bantuan Penelusuran
true
true
true
true
true
5016068
false
false