Beklemedeki amaçlar

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