Yapışkan Yayınlar

OWASP kategorisi: MASVS-PLATFORM: Platform Etkileşimi

Genel Bakış

Android uygulamaları ve Android sistemi, diğer uygulamaları ilgilenebilecekleri etkinlikler hakkında bilgilendirmek için yayınları mesajlaşma sistemi olarak kullanabilir. Sabit yayınlar, gönderilen amaç nesnelerinin yayın tamamlandıktan sonra önbellekte kaldığı özel bir yayın türüdür. Sistem, yapışkan amaçları daha sonraki alıcı kayıtlarına yeniden yayınlayabilir. Maalesef, yapışkan yayınlar API'si bir dizi güvenlik sorunuyla karşı karşıya olduğundan Android 5.0'da (API düzeyi 21) desteği sonlandırılmıştır.

Sabitlenmiş yayınlara herkes erişebilir

Sabit yayınlar, belirli izinlere sahip alıcılarla sınırlandırılamaz. Bu nedenle, hassas bilgilerin yayınlanması için uygun değildirler. Yayın Intent üzerinde uygulama paketi adının belirtilmesinin BroadcastReceivers kümesini sınırladığı düşünülebilir:

Kotlin

val intent = Intent("com.example.NOTIFY").apply {
    setPackage("com.example.myapp")
}
applicationContext.sendBroadcast(intent)

Java

Intent intent = new Intent("com.example.NOTIFY");
intent.setPackage("com.example.myapp");
getApplicationContext().sendBroadcast(intent);

Örnekte, yayın gönderildiğinde yalnızca com.example.myapp paketindeki alıcılar amaçlı iletiyi alır. Ancak, Intent yapışkan önbellekten yeniden yayınlandığında paket adı filtresi uygulanmaz. registerReceiver() yöntemiyle bir alıcı kaydedilirken, belirtilen filtreyle eşleşen yapışkan önbellekteki tüm amaçlar, alıcının bulunduğu paket adından bağımsız olarak alıcıya yeniden yayınlanır.

Herkes sabit yayın gönderebilir

Uygulamaların yapışkan yayın gönderebilmesi için yalnızca android.permission.BROADCAST_STICKY izni gerekir. Bu izin, uygulama yüklendiğinde otomatik olarak verilir. Bu nedenle, saldırganlar herhangi bir alıcıya herhangi bir amaç gönderebilir ve başka bir uygulamaya yetkisiz erişim elde edebilir. Yayın alıcılar, gönderenleri belirli bir izne sahip olanlarla kısıtlayabilir. Ancak bu durumda, alıcı, kalıcı önbellekten yayın alamaz. Bunun nedeni, bu yayınların herhangi bir uygulamanın kimliği bağlamında gönderilmemesi ve herhangi bir izinle yayınlanmamasıdır.

Sabitlenmiş yayınları herkes değiştirebilir

Bir amaç, yapışkan yayın kapsamında olduğunda bu amaç, yapışkan önbellekte aynı işleme, verilere, türe, tanımlayıcıya, sınıfa ve kategorilere sahip önceki tüm örneklerin yerini alır. Bu nedenle, bir saldırgan, meşru bir uygulamadan gelen yapışkan bir intent'teki ek verilerin üzerine kolayca yazabilir. Bu veriler daha sonra diğer alıcılara yeniden yayınlanabilir.

sendStickyOrderedBroadcast() yöntemi kullanılarak gönderilen yayınlar, daha yüksek önceliğe sahip alıcıların yayını daha düşük önceliğe sahip alıcılara teslim edilmeden önce kullanabilmesi için her seferinde bir alıcıya teslim edilir. Her alıcı sırayla yürütülürken setResultData() çağrısı yaparak sonucu bir sonraki alıcıya yayabilir veya yayını durdurarak sonraki alıcıların yayını almasını engelleyebilir. Meşru bir uygulamadan sabit sıralı yayınlar alabilen bir saldırgan, yayın sonucu verilerini kurcalamak veya yayınları tamamen bırakmak için yüksek öncelikli bir alıcı oluşturabilir.

Etki

Etki, yapışkan yayınların nasıl kullanıldığına ve yayın alıcılarına hangi verilerin iletildiğine bağlı olarak değişir. Genel olarak, yapışkan yayınların kullanılması hassas verilerin açığa çıkmasına, verilerin kurcalanmasına, başka bir uygulamada davranış yürütmek için yetkisiz erişime ve hizmet reddine yol açabilir.

Çözümler

Sabit yayınlar kullanılmamalıdır. Önerilen yöntem, istenen zamanlarda geçerli değeri almak için yerel veritabanı gibi başka bir mekanizmayla birlikte yapışkan olmayan yayınları kullanmaktır.

Geliştiriciler, izinleri kullanarak veya niyet üzerinde uygulama paketi adını ayarlayarak yapışkan olmayan yayınları kimlerin alabileceğini kontrol edebilir. Ayrıca, bir yayının uygulama dışındaki bileşenlere gönderilmesi gerekmiyorsa gözlemci kalıbını uygulayan LiveData öğesini kullanın.

Yayınların güvenliğini sağlama hakkında daha fazla bilgiyi Yayınlara genel bakış sayfasında bulabilirsiniz.