OWASP kategorisi: MASVS-CODE: Kod Kalitesi
Genel Bakış
Özel izinlerle ilişkili riskler, özel izin tanımı eksik olduğunda veya yanlış yazıldığında ya da karşılık gelen android:protectionLevel özelliği Manifest'te yanlış kullanıldığında ortaya çıkar.
Örneğin, bu riskler aynı ada sahip ancak kötü amaçlı bir uygulama tarafından tanımlanan ve farklı koruma düzeyleri uygulanan özel bir izin oluşturularak kullanılabilir.
Özel izinler, kaynakların ve özelliklerin diğer uygulamalarla paylaşılmasını sağlamak için tasarlanmıştır. Özel izinlerin meşru kullanımına örnek olarak aşağıdakiler verilebilir:
- İki veya daha fazla uygulama arasındaki süreçler arası iletişimi (IPC) kontrol etme
- Üçüncü taraf hizmetlerine erişme
- Uygulamanın paylaşılan verilerine erişimi kısıtlama
Etki
Bu güvenlik açığının kötüye kullanılması, kötü amaçlı bir uygulamanın başlangıçta korunması amaçlanan kaynaklara erişmesine neden olabilir. Güvenlik açığının etkileri, korunan kaynağa ve orijinal uygulama hizmetinin ilişkili izinlerine bağlıdır.
Risk: Özel İzinlerdeki Yazım Hataları
Manifest'te özel bir izin beyan edilmiş olabilir ancak yazım hatası nedeniyle dışa aktarılan Android bileşenlerini korumak için farklı bir özel izin kullanılır. Kötü amaçlı bir uygulama, izinleri yanlış yazılmış uygulamalardan yararlanarak şunları yapabilir:
- Önce bu izni kaydetme
- Sonraki uygulamalarda yazımı tahmin etme
Bu durum, bir uygulamanın kaynaklara yetkisiz erişmesine veya saldırıya uğrayan uygulamayı kontrol etmesine olanak tanıyabilir.
Örneğin, güvenlik açığı olan bir uygulama, bir bileşeni izin kullanarak korumak istiyor
READ_CONTACTS ancak izni yanlışlıkla READ_CONACTS olarak yazıyor. Kötü amaçlı bir uygulama, herhangi bir uygulamaya (veya sisteme) ait olmadığından READ_CONACTS için hak talebinde bulunabilir ve korunan bileşene erişebilir. Bu güvenlik açığının sık karşılaşılan bir diğer varyantı da android:permission=True'dır. Büyük/küçük harf kullanımından bağımsız olarak true ve false gibi değerler, izin bildirimi için geçersiz girişlerdir ve diğer özel izin bildirimi yazım hatalarıyla benzer şekilde ele alınır. Bu sorunu düzeltmek için android:permission özelliğinin değeri geçerli bir izin dizesiyle değiştirilmelidir. Örneğin, uygulamanın kullanıcının kişilerine erişmesi gerekiyorsa android:permission özelliğinin değeri android.permission.READ_CONTACTS olmalıdır.
Çözümler
Android Lint Kontrolleri
Özel izinleri beyan ederken kodunuzdaki yazım hatalarını ve diğer olası hataları bulmanıza yardımcı olması için Android lint kontrollerini kullanın.
Adlandırma kuralı
Yazım hatalarını daha belirgin hale getirmek için tutarlı bir adlandırma kuralı kullanın. Uygulamanızın manifest dosyasındaki özel izin beyanlarını yazım hataları açısından dikkatlice kontrol edin.
Risk: Sahipsiz İzinler
İzinler, uygulamaların kaynaklarını korumak için kullanılır. Bir uygulamanın kaynaklara erişmek için gereken izinleri bildirebileceği iki farklı konum vardır:
- AndroidManifest.xml: AndroidManifest.xml dosyasında önceden tanımlanır (belirtilmemişse
<application>izinleri kullanılır). Örneğin, provider permission, receiver permission, activity permission, service permission; - Kod: Çalışma zamanı koduna kaydedilir. Örneğin,
registerReceiver().
Ancak bazen bu izinler, cihazdaki bir APK'nın manifest dosyasında ilgili bir <permission> etiketiyle tanımlanmaz. Bu durumda, bu izinlere üst öğesi olmayan izinler adı verilir. Bu durum, aşağıdakiler gibi çeşitli nedenlerden kaynaklanabilir:
- Manifest'teki güncellemeler ile izin kontrolü içeren kod arasında senkronizasyon sorunu olabilir.
- İzinleri içeren APK, derlemeye dahil edilmemiş olabilir veya yanlış sürüm dahil edilmiş olabilir.
- Kontroldeki veya manifest dosyasındaki izin adı yanlış yazılmış olabilir.
Kötü amaçlı bir uygulama, yetim bir izin tanımlayıp bu izni alabilir. Bu durumda, bir bileşeni korumak için yetim izne güvenen ayrıcalıklı uygulamalar tehlikeye girebilir.
Ayrıcalıklı uygulamanın, herhangi bir bileşeni korumak veya kısıtlamak için izni kullandığı durumlarda bu, kötü amaçlı uygulamaya söz konusu bileşene erişim izni verebilir. İzinle korunan etkinlikleri başlatma, içerik sağlayıcıya erişme veya yetkisiz izinle korunan yayın alıcısına yayın yapma bu durumlara örnek verilebilir.
Ayrıca, ayrıcalıklı uygulamanın kötü amaçlı uygulamayı meşru bir uygulama olarak algılayıp dosyaları veya içeriği yüklemesine neden olabilir.
Çözümler
Uygulamanızın bileşenleri korumak için kullandığı tüm özel izinlerin manifest dosyanızda da tanımlandığından emin olun.
Uygulama, içerik sağlayıcıya erişimi korumak için my.app.provider.READ ve my.app.provider.WRITE özel izinlerini kullanıyor:
Xml
<provider android:name="my.app.database.CommonContentProvider" android:readPermission="my.app.provider.READ" android:writePermission="my.app.provider.WRITE" android:exported="true" android:process=":myappservice" android:authorities="my.app.database.contentprovider"/>
Uygulama, bu özel izinleri tanımlayıp kullanarak diğer kötü amaçlı uygulamaların bu izinleri kullanmasını da engeller:
Xml
<permission android:name="my.app.provider.READ"/>
<permission android:name="my.app.provider.WRITE"/>
<uses-permission android:name="my.app.provider.READ" />
<uses-permission android:name="my.app.provider.WRITE" />
Risk: android:protectionLevel yanlış kullanılıyor
Bu özellik, izindeki potansiyel risk düzeyini açıklar ve sistemin izni verip vermeyeceğine karar verirken hangi prosedürleri izlemesi gerektiğini belirtir.
Çözümler
Normal veya Tehlikeli Koruma Düzeyinden Kaçının
İzinlerinizde normal veya tehlikeli protectionLevel kullanmak, çoğu uygulamanın izni isteyebileceği ve alabileceği anlamına gelir:
- "normal" yalnızca beyan edilmesini gerektirir
- "tehlikeli" birçok kullanıcı tarafından onaylanacak
Bu nedenle, bu protectionLevels'ler çok az güvenlik sağlar.
İmza İzinlerini Kullanma (Android >= 10)
Mümkün olduğunda imza koruma seviyelerini kullanın. Bu özelliği kullanmak, yalnızca izni oluşturan uygulamayla aynı sertifikayla imzalanmış diğer uygulamaların bu korumalı özelliklere erişebilmesini sağlar. Özel (yeniden kullanılmayan) bir imzalama sertifikası kullandığınızdan ve bunu anahtar deposunda güvenli bir şekilde sakladığınızdan emin olun.
Manifest dosyanızda özel bir izni aşağıdaki şekilde tanımlayın:
Xml
<permission
android:name="my.custom.permission.MY_PERMISSION"
android:protectionLevel="signature"/>
Örneğin, bir etkinliğe erişimi yalnızca bu özel iznin verildiği uygulamalarla kısıtlayın.
Xml
<activity android:name=".MyActivity" android:permission="my.custom.permission.MY_PERMISSION"/>
Bu özel izni beyan eden uygulamayla aynı sertifikayla imzalanan diğer tüm uygulamalara .MyActivity etkinliğine erişim izni verilir ve bu uygulamaların, manifest dosyalarında bu izni aşağıdaki şekilde beyan etmesi gerekir:
Xml
<uses-permission android:name="my.custom.permission.MY_PERMISSION" />
İmza özel izinlerine karşı dikkatli olun (Android < 10)
Uygulamanız Android 10'dan önceki sürümleri hedefliyorsa uygulamanızın özel izinleri, kaldırma veya güncelleme işlemleri nedeniyle kaldırıldığında kötü amaçlı uygulamalar bu özel izinleri kullanmaya devam edebilir ve böylece kontrolleri atlayabilir. Bu durum, Android 10'da düzeltilen bir ayrıcalık artırma güvenlik açığından (CVE-2019-2200) kaynaklanmaktadır.
Bu, yarış koşulları riskinin yanı sıra imza kontrollerinin özel izinlere göre önerilmesinin nedenlerinden biridir.
Risk: Yarışma Durumu
Yasal bir uygulama A, diğer X uygulamalar tarafından kullanılan bir imza özel izni tanımlarsa ancak daha sonra kaldırılırsa kötü amaçlı bir uygulama B aynı özel izni farklı bir protectionLevel ile tanımlayabilir (ör. normal). Bu şekilde, B, A uygulamasıyla aynı sertifikayla imzalanmasına gerek kalmadan X uygulamalarındaki söz konusu özel izinle korunan tüm bileşenlere erişebilir.
B, A'den önce yüklenirse de aynı durum yaşanır.
Çözümler
Bir bileşeni yalnızca sağlayan uygulamayla aynı imzayla imzalanmış uygulamalara sunmak istiyorsanız bu bileşene erişimi kısıtlamak için özel izinler tanımlamaktan kaçınabilirsiniz. Bu durumda imza kontrollerini kullanabilirsiniz. Uygulamalarınızdan biri diğer uygulamanız için istekte bulunduğunda ikinci uygulama, isteği yerine getirmeden önce her iki uygulamanın da aynı sertifikayla imzalandığını doğrulayabilir.
Kaynaklar
- İzin isteklerinizi en aza indirin
- İzinlere Genel Bakış
- Koruma seviyelerinin açıklaması
- CustomPermissionTypo Android Lint
- Android Lint'i kullanma
- Android izinlerinin ayrıntılı açıklaması ve ilginç bulanıklaştırma testi bulgularını içeren araştırma makalesi