Intent yönlendirme

OWASP kategorisi: MASVS-PLATFORM: Platform Etkileşimi

Genel Bakış

Bir saldırganın, savunmasız bir uygulama bağlamında yeni bir bileşeni başlatmak için kullanılan bir amaçın içeriğini kısmen veya tamamen kontrol edebildiği durumlarda amaç yönlendirmesi gerçekleşir.

Yeni bileşeni başlatmak için kullanılan amaç, birkaç şekilde sağlanabilir. En yaygın olarak, extras alanında serileştirilmiş bir amaç olarak veya bir dizeye dönüştürülüp ayrıştırılarak sağlanır. Parametrelerin kısmi kontrolü de aynı sonuca yol açabilir.

Etki

Etkisi değişebilir. Saldırgan, güvenlik açığı olan uygulamada dahili özellikleri yürütebilir veya dışa aktarılmamış ContentProvider nesneleri gibi özel bileşenlere erişebilir.

Çözümler

Genel olarak, iç içe yerleştirilmiş amaçları yönlendirmeyle ilgili özellikleri kullanıma sunmayın. Kaçınılmaz 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 amacın 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 amacını değiştirilemez hale getirir.

Uygulamalar, bir amaçın nereye yönlendirildiğini ResolveActivity gibi yöntemlerle kontrol edebilir:

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);
}

Uygulamalar, aşağıdaki mantığa benzer bir mantıkla IntentSanitizer kullanabilir:

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);

Varsayılan koruma

Android 16, yönlendirme saldırılarına karşı varsayılan olarak güvenlik güçlendirme çözümü sunar.Intent Çoğu durumda, normalde amaçları kullanan uygulamalarda herhangi bir uyumluluk sorunu yaşanmaz.

Intent yönlendirme işleme özelliğini devre dışı bırakma

Android 16, uygulamaların başlatma güvenliği korumalarını devre dışı bırakmasına olanak tanıyan yeni bir API sunuyor. Bu, varsayılan güvenlik davranışının meşru uygulama kullanım alanlarını engellediği belirli durumlarda gerekli olabilir.

Android 16'da, removeLaunchSecurityProtection() nesnesinde Intent yöntemini kullanarak güvenlik korumalarını devre dışı bırakabilirsiniz. Örneğin:

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }

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()'nın tüm bağlamlarda çalıştığını veya yöntemin aslında bir tam sayı döndürürken istisna oluşturduğunu varsayalım.

Hata ayıklama özellikleri

Android 12'yi (API düzeyi 31) veya daha yeni sürümleri hedefleyen uygulamalarda, bazı durumlarda uygulamanızın intent'i güvenli olmayan şekilde başlatıp başlatmadığını algılamanıza yardımcı olan bir hata ayıklama özelliğini etkinleştirebilirsiniz.

Uygulamanız aşağıdaki işlemlerin her ikisini de gerçekleştiriyorsa sistem güvenli olmayan bir amaç başlatma işlemi algılar ve StrictMode ihlali gerçekleşir:

  • Uygulamanız, teslim edilen bir intent'in ekstralarından iç içe yerleştirilmiş bir intent'i paketinden çıkarıyor.
  • Uygulamanız, bu iç içe yerleştirilmiş amaçla hemen bir uygulama bileşeni başlatıyor. Örneğin, amacı startActivity(), startService() veya bindService()'ye iletiyor.

Kaynaklar