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. Yapışkan yayınlar, gönderilen intent nesnelerinin yayın tamamlandıktan sonra önbellekte kalması için özel bir yayın türüdür. Sistem, yapışkan intent'leri daha sonraki alıcı kayıtlarına yeniden yayınlayabilir. Maalesef yapışkan yayınlar API'si güvenlikle ilgili çeşitli eksikliklere sahip olduğundan Android 5.0'de (API düzeyi 21) desteği sonlandırılmıştır.
Herkes yapışkan yayınlara erişebilir
Yapışkan yayınlar, belirli izinlere sahip alıcılarla kısıtlanamaz. Bu nedenle, hassas bilgileri yayınlamak için uygun değildir. Intent
yayınında uygulama paket adının belirtilmesinin BroadcastReceivers
grubunu sınırlandırdığını düşünmek cazip gelebilir:
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 intent'i alır. Ancak Intent, yapışkan önbellekten yeniden yayınlandığında paket adı filtresi uygulanmaz. registerReceiver()
yöntemi kullanılarak bir alıcı kaydedilirken, yapışkan önbellekte belirtilen filtreyle eşleşen tüm intent'ler, 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ınlar 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 intent 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ı, herhangi bir uygulamanın kimliği bağlamında gönderilmediği ve herhangi bir izinle yayınlanmadığı için yapışkan önbellekten yayın alamaz.
Sabit yayınlar herkes tarafından değiştirilebilir.
Bir intent, yapışkan bir yayının parçası olduğunda, 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, saldırganlar, geçerli 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 kullanmasına olanak tanımak için tek seferde bir alıcıya teslim edilir. Her alıcı sırayla yürütülürken setResultData()
çağrısı yaparak bir sonucu bir sonraki alıcıya iletebilir veya sonraki alıcıların yayını almasını engelleyerek yayını iptal edebilir. Meşru bir uygulamadan sabit sıralı yayınlar alabilen bir saldırgan, yayın sonucu verilerini bozmak 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 aktarıldığına bağlı olarak değişir. Genel olarak, yapışkan yayınların kullanılması hassas verilerin açığa çıkmasına, verilerle oynanmasına, başka bir uygulamada davranış yürütmek için yetkisiz erişime ve hizmetin reddedilmesine neden olabilir.
Çözümler
Sabit yayınlar kullanılmamalıdır. Önerilen kalıp, istenen zaman 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 intent'te 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
'i kullanın.
Yayınların güvenliğini sağlama hakkında daha fazla bilgiyi yayınlar hakkında genel bilgiler sayfasında bulabilirsiniz.