Beklemedeki Intent'lerin Göndereni

OWASP kategorisi: MASVS-CODE: Kod Kalitesi

Genel Bakış

Bir PendingIntent'in gönderenine güvenilip güvenilmeyeceğini belirlemek için PendingIntent.getCreator*() veya PendingIntent.getTarget*() kullanmak, kötüye kullanım riski oluşturur.

PendingIntent.getCreator*() veya PendingIntent.getTarget*(), PendingIntent'in oluşturucusunu döndürür. Bu, her zaman göndereniyle eşleşmez. Oluşturucuya güvenilebilir ancak gönderene asla güvenilmemelidir. Çünkü gönderen, çeşitli mekanizmalar kullanarak başka bir uygulamanın PendingIntent'ini elde etmiş kötü amaçlı bir uygulama olabilir. Örneğin:

PendingIntent.getCreator*() veya PendingIntent.getTarget*() için meşru kullanım örneği, PendingIntent tarafından başlatılacak uygulamanın simgesini göstermektir.

Etki

Oluşturucuya sorgu gönderdiğiniz (ve güvendiğiniz) için PendingIntent'in gönderenine güvenmek güvenlik açıklarına yol açabilir. Bir uygulama, PendingIntent'in gönderenine oluşturucusuna göre güveniyorsa ve ardından kimlik doğrulama veya yetkilendirme mantığını paylaşıyorsa PendingIntent'in göndereni kötü amaçlı bir uygulama olduğunda, bu durum kimlik doğrulama atlamasına veya savunmasız uygulamanın kodunun uygulanmasına bağlı olarak geçersiz kılınmış, güvenilmeyen girişe dayalı olarak uzaktan kod yürütmeye yol açabilir.

Risk azaltma önlemleri

Gönderen ve içerik üretici arasındaki farkı açıklama

Bir PendingIntent alınırken gerçekleştirilen herhangi bir kimlik doğrulama veya yetkilendirme mantığı, PendingIntent'in PendingIntent.getCreator*() veya PendingIntent.getTarget*() kullanılarak tanımlanan oluşturucusuyla ilgili varsayımlara dayanmamalıdır.

Arayanları doğrulamak için alternatif yöntemler kullanma

Arayanı doğrulamanız gerekiyorsa PendingIntent yerine bir Service veya ContentProvider kullanmanız gerekir. Her ikisi de gelen bir IPC'yi gönderirken Binder.getCallingUid() ile arayanın UID'sini getirmenize olanak tanır. UID, daha sonra PackageManager.getPackagesForUid() kullanılarak sorgulanabilir.

API düzeyi 34'ten itibaren kullanılabilen başka bir yaklaşım da gönderenin BroadcastOptions.isShareIdentityEnabled() kullanarak yayın sırasında kimlik paylaşmayı etkinleştirmesi durumunda BroadcastReceiver.getSentFromUid() veya BroadcastReceiver.getSentFromPackage()'i kullanmaktır.

Yan yüklenen paketlerin, Play Store'daki paketlerle çakışan paket adları olabileceğinden, arayan paketin beklenen imzaya sahip olup olmadığını her zaman kontrol etmeniz gerekir.

Kaynaklar