Pengalihan intent

Kategori OWASP: MASVS-PLATFORM: Interaksi Platform

Ringkasan

Pengalihan intent terjadi saat penyerang dapat mengontrol sebagian atau seluruh konten intent yang digunakan untuk meluncurkan komponen baru dalam konteks aplikasi yang rentan.

Intent yang digunakan untuk meluncurkan komponen baru dapat diberikan dalam beberapa cara, paling sering sebagai intent serial di kolom extras, atau disusun ke string dan diuraikan. Kontrol parameter sebagian juga dapat memberikan hasil yang sama.

Dampak

Dampaknya dapat berbeda-beda. Penyerang mungkin mengeksekusi fungsi internal di aplikasi yang rentan, atau mungkin mengakses komponen pribadi seperti objek ContentProvider yang tidak diekspor.

Mitigasi

Umum

Secara umum, jangan mengekspos fungsi yang terkait dengan pengalihan intent bertingkat. Jika tidak dapat dihindari, terapkan metode mitigasi berikut:

  • Bersihkan informasi paket dengan benar. Jangan lupa untuk memeriksa atau menghapus flag (GRANT_URI_PERMISSIONS), dan memeriksa tempat intent dialihkan. IntentSanitizer dapat membantu proses ini.
  • Gunakan objek PendingIntent. Hal ini mencegah komponen Anda diekspor dan membuat intent tindakan target tidak dapat diubah.

Aplikasi dapat memeriksa tempat intent dialihkan menggunakan metode seperti ResolveActivity:

Kotlin

val intent = getIntent()
// Get the component name of the nested intent.
val forward = intent.getParcelableExtra<Parcelable>("key") as Intent
val name: ComponentName = forward.resolveActivity(packageManager)
// Check that the package name and class name contain the expected values.
if (name.packagename == "safe_package" && name.className == "safe_class") {
    // Redirect the nested intent.
    startActivity(forward)
}

Java

Intent intent = getIntent()
// Get the component name of the nested intent.
Intent forward = (Intent) intent.getParcelableExtra("key");
ComponentName name = forward.resolveActivity(getPackageManager());
// Check that the package name and class name contain the expected values.
if (name.getPackageName().equals("safe_package") &&
        name.getClassName().equals("safe_class")) {
    // Redirect the nested intent.
    startActivity(forward);
}

Aplikasi dapat memanfaatkan IntentSanitizer menggunakan logika yang mirip dengan yang berikut ini:

Kotlin

val intent = IntentSanitizer.Builder()
     .allowComponent("com.example.ActivityA")
     .allowData("com.example")
     .allowType("text/plain")
     .build()
     .sanitizeByThrowing(intent)

Java

Intent intent = new  IntentSanitizer.Builder()
     .allowComponent("com.example.ActivityA")
     .allowData("com.example")
     .allowType("text/plain")
     .build()
     .sanitizeByThrowing(intent);

Kesalahan umum

  • Memeriksa apakah getCallingActivity() menampilkan nilai non-null. Aplikasi berbahaya dapat menyediakan nilai null untuk fungsi ini.
  • Dengan asumsi bahwa checkCallingPermission() berfungsi di semua konteks, atau bahwa metode menampilkan pengecualian saat benar-benar menampilkan bilangan bulat.

Fitur proses debug

Untuk aplikasi yang menargetkan Android 12 (API level 31) atau yang lebih tinggi, Anda dapat mengaktifkan fitur proses debug yang, dalam beberapa kasus, membantu Anda mendeteksi apakah aplikasi melakukan peluncuran intent yang tidak aman.

Jika aplikasi Anda melakukan kedua tindakan berikut, sistem akan mendeteksi peluncuran intent yang tidak aman, dan pelanggaran StrictMode akan terjadi:

  • Aplikasi Anda memisahkan intent bertingkat dari tambahan intent yang dikirim.
  • Aplikasi Anda akan segera memulai komponen aplikasi menggunakan intent bertingkat tersebut, seperti meneruskan intent ke startActivity(), startService(), atau bindService().

Referensi