OWASP kategorisi: MASVS-PLATFORM: Platform Interaction (Platform Etkileşimi)
Genel Bakış
PendingIntent, sistem tarafından tutulan bir jetona yapılan referanstır. A uygulaması, B uygulamasının A uygulaması adına önceden tanımlanmış işlemleri yürütmesine izin vermek için B uygulamasına bir PendingIntent geçirebilir. Bu, A uygulaması hala çalışıyor olsun veya olmasın geçerlidir.
Risk: Değiştirilebilir Beklemedeki Intent'ler
PendingIntent'ler değişken olabilir. Bu durumda, işlemi belirten iç amaç, fillIn() dokümanında açıklanan mantık uyarınca B uygulaması tarafından güncellenebilir. Diğer bir deyişle, bir PendingIntent'in doldurulmamış alanları kötü amaçlı bir uygulama tarafından değiştirilebilir ve savunmasız uygulamanın normalde dışa aktarılmayan bileşenlerine erişime izin verilebilir.
Etki
Bu güvenlik açığının etkisi, uygulamanın dışa aktarılmayan hedef işlevinin uygulanmasına bağlı olarak değişir.
Çözümler
Genel
En kötü güvenlik açıklarından kaçınmak için işlem, bileşen ve paketin ayarlandığından emin olun:
Kotlin
val intent = Intent(intentAction)
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className)
PendingIntent pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
intent, /* flags = */ PendingIntent.FLAG_IMMUTABLE
)
Java
Intent intent = new Intent(intentAction);
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className);
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
intent, /* flags= */ 0);
IMMUTABLE bayrağı
Uygulamanız Android 6'yı (API düzeyi 23) veya sonraki sürümleri hedefliyorsa değişkenliği belirtin. Örneğin, doldurulmamış alanların kötü amaçlı bir uygulama tarafından doldurulmasını önlemek için FLAG_IMMUTABLE kullanılarak yapılabilir:
Kotlin
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE)
Java
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE);
Android 11 (API düzeyi 30) ve sonraki sürümlerde, hangi alanların değiştirilebilir olacağını belirtmeniz gerekir. Bu sayede, bu türden kazara oluşan güvenlik açıkları azaltılır.
Kaynaklar
Risk: Bekleyen Niyetleri Tekrar Oynatma
FLAG_ONE_SHOT işareti ayarlanmadığı sürece PendingIntent yeniden oynatılabilir. Tekrarlama saldırılarını (tekrarlanmaması gereken işlemlerin gerçekleştirilmesi) önlemek için FLAG_ONE_SHOT kullanmak önemlidir.
Etki
Bu güvenlik açığının etkisi, amaç alıcısının uygulamasının şekline göre değişir. FLAG_ONE_SHOT işareti ayarlanmadan oluşturulan bir PendingIntent'i kötüye kullanan kötü amaçlı bir uygulama, yalnızca bir kez yapılması gereken işlemleri tekrarlamak için niyeti yakalayıp yeniden kullanabilir.
Çözümler
Birden fazla kez tetiklenmesi amaçlanmayan bekleyen amaçlar, yeniden oynatma saldırılarını önlemek için FLAG_ONE_SHOT işaretini kullanmalıdır.
Kotlin
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT)
Java
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
Kaynaklar
Kaynaklar
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir.
- Niyet yönlendirme