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()
, ataubindService()
.
Referensi
Direkomendasikan untuk Anda
- Catatan: teks link ditampilkan saat JavaScript nonaktif
- Intent tertunda