OWASP kategorisi: MASVS-PLATFORM: Platform Etkileşimi
Genel Bakış
Bir saldırgan, güvenlik açığı bulunan bir uygulama bağlamında yeni bir bileşeni başlatmak için kullanılan intent'in içeriğini kısmen veya tamamen kontrol edebildiğinde intent yönlendirmesi gerçekleşir.
Yeni bileşeni başlatmak için kullanılan intent, çeşitli şekillerde sağlanabilir. En yaygın olarak bir extras
alanında serileştirilmiş intent olarak veya bir dizeye düzenlenip ayrıştırılmış olarak sağlanır. Parametrelerin kısmi kontrolü de aynı sonuca yol açabilir.
Etki
Etki değişiklik gösterebilir. Saldırganlar, güvenlik açığı bulunan uygulamadaki dahili özellikleri çalıştırabilir veya dışa aktarılmamış ContentProvider nesneleri gibi gizli bileşenlere erişebilir.
Çözümler
Genel olarak, iç içe yerleştirilmiş intent'leri yönlendirmeyle ilgili özellikleri göstermeyin. Kaçınılmaz olduğu durumlarda aşağıdaki azaltma yöntemlerini uygulayın:
- Paketlenmiş bilgileri uygun şekilde temizleyin. İşaretleri (
FLAG_GRANT_READ_URI_PERMISSION, FLAG_GRANT_WRITE_URI_PERMISSION, FLAG_GRANT_PERSISTABLE_URI_PERMISSION, and FLAG_GRANT_PREFIX_URI_PERMISSION
) kontrol etmeyi veya temizlemeyi ve intent'in nereye yönlendirildiğini kontrol etmeyi unutmayın.IntentSanitizer
bu süreçte size yardımcı olabilir. PendingIntent
nesnelerini kullanın. Bu, bileşeninizin dışa aktarılmasını engeller ve hedef işlem niyetini değiştirilemez hale getirir.
Uygulamalar, ResolveActivity
gibi yöntemler kullanarak bir intent'in nereye yönlendirildiğini kontrol edebilir:
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)
}
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);
}
Uygulamalar, aşağıdakine benzer bir mantık kullanarak IntentSanitizer
kullanabilir:
val intent = IntentSanitizer.Builder()
.allowComponent("com.example.ActivityA")
.allowData("com.example")
.allowType("text/plain")
.build()
.sanitizeByThrowing(intent)
Intent intent = new IntentSanitizer.Builder()
.allowComponent("com.example.ActivityA")
.allowData("com.example")
.allowType("text/plain")
.build()
.sanitizeByThrowing(intent);
Varsayılan koruma
- Android 16, Intent yönlendirme istismarlarına karşı varsayılan olarak güvenlik güçlendirme çözümü sunar.
Sık yapılan yanlışlar
getCallingActivity()
işlevinin null olmayan bir değer döndürüp döndürmediğini kontrol etme. Kötü amaçlı uygulamalar bu işlev için null değer sağlayabilir.checkCallingPermission()
işlevinin tüm bağlamlarda çalıştığı veya yöntemin aslında bir tam sayı döndürdüğü halde istisna oluşturduğu varsayılır.
Hata ayıklama özellikleri
Android 12 (API düzeyi 31) veya sonraki sürümleri hedefleyen uygulamalarda, bazı durumlarda uygulamanızın güvenli olmayan bir intent başlatıp başlatmadığını tespit etmenize yardımcı olan bir hata ayıklama özelliğini etkinleştirebilirsiniz.
Uygulamanız aşağıdaki işlemlerin ikisini de gerçekleştirirse sistem güvenli olmayan bir intent başlatma işlemi algılar ve StrictMode
ihlali meydana gelir:
- Uygulamanız, gönderilen bir intent'in ekstralarından iç içe yerleştirilmiş bir intent'i paketten çıkarıyor.
- Uygulamanız, bu iç içe yerleştirilmiş intent'i kullanarak hemen bir uygulama bileşenini başlatır (ör. intent'i
startActivity()
,startService()
veyabindService()
'ye iletme).