Beklemedeki amaçlar

OWASP kategorisi: MASVS-PLATFORM: Platform Etkileşimi

Genel Bakış

PendingIntent, sistem tarafından yönetilen bir jetona referanstır. A uygulaması, A uygulamasının hâlâ etkin olup olmadığına bakılmaksızın B uygulamasının A uygulaması adına önceden tanımlanmış işlemleri gerçekleştirmesine izin vermek için B uygulamasına bir PendingIntent iletebilir.

Risk: Değiştirilebilir Beklemede İstekler

PendingIntent değişken olabilir. Diğer bir deyişle, işlemi belirten iç intent, fillIn() dokümanlarında açıklanan mantığı izleyerek B uygulaması tarafından güncellenebilir. Diğer bir deyişle, PendingIntent'in doldurulmamış alanları kötü amaçlı bir uygulama tarafından değiştirilebilir ve güvenlik açığı olan uygulamanın normalde dışa aktarılmayan bileşenlerine erişim izni verebilir.

Etki

Bu güvenlik açığının etkisi, uygulamanın hedeflenen dışa aktarılmamış 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 işareti

Uygulamanız Android 6 (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 bu işlem 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 hale getirileceğini belirtmeniz gerekir. Bu, bu türden yanlışlıkla ortaya çıkan güvenlik açıklarını azaltır.

Kaynaklar


Risk: Beklemedeki Intent'leri yeniden oynatma

FLAG_ONE_SHOT işareti ayarlanmadığı sürece PendingIntent yeniden oynatılabilir. Tekrar oynatma saldırılarını (tekrarlanmaması gereken işlemlerin yapılması) önlemek için FLAG_ONE_SHOT değerini kullanmanız önemlidir.

Etki

Bu güvenlik açığının etkisi, intent'in alıcı tarafının uygulanmasına bağlı olarak değişir. FLAG_ONE_SHOT işareti ayarlanmadan oluşturulan bir PendingIntent'ten yararlanan kötü amaçlı bir uygulama, yalnızca bir kez yapılması gereken işlemleri tekrarlamak için intent'i yakalayıp yeniden kullanabilir.

Çözümler

Birden çok kez tetiklenmesi amaçlanmayan bekleyen intent'ler, 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