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.IntentSanitizerbu süreçte size yardımcı olabilir. PendingIntentnesnelerini 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()veyabindService()'ye iletiyor.