OWASP kategorisi: MASVS-CODE: Kod Kalitesi
Genel Bakış
Özel izinlerle ilgili riskler, özel izin tanımı eksik olduğunda veya yanlış yazıldığında ya da ilgili android:protectionLevel
özelliği Manifest'te yanlış kullanıldığında ortaya çıkar.
Örneğin, aynı ada sahip ancak kötü amaçlı bir uygulama tarafından tanımlanan ve farklı koruma düzeyleri uygulanan özel bir izin oluşturarak bu risklerden yararlanılabilir.
Özel izinler, kaynakları ve özellikleri diğer uygulamalarla paylaşmayı sağlamak için tasarlanmıştır. Özel izinlerin meşru bir şekilde kullanılmasına örnek olarak aşağıdakiler verilebilir:
- İki veya daha fazla uygulama arasındaki işlemler arası iletişimi (IPC) kontrol etme
- Üçüncü taraf hizmetlerine erişim
- Bir uygulamanın paylaşılan verilerine erişimi kısıtlama
Etki
Bu güvenlik açığının kötüye kullanılmasının etkisi, kötü amaçlı bir uygulamanın başlangıçta korunması amaçlanan kaynaklara erişebilmesidir. Güvenlik açığının sonuçları, korunan kaynağa ve orijinal uygulama hizmetinin ilişkili izinlerine bağlıdır.
Risk: Özel izinlerdeki yazım hataları
Manifest'te bir özel izin beyan edilmiş olabilir ancak bir yazım hatası nedeniyle dışa aktarılan Android bileşenlerini korumak için farklı bir özel izin kullanılıyor. Kötü amaçlı uygulamalar, izinlerin yanlış yazıldığı uygulamalardan yararlanabilir. Bunun için aşağıdakilerden birini yapabilir:
- Önce bu izni kaydetme
- Sonraki uygulamalarda yazımı tahmin etme
Bu durum, bir uygulamanın kaynaklara yetkisiz erişmesine veya kurban uygulamayı kontrol etmesine olanak tanıyabilir.
Örneğin, güvenlik açığı bulunan bir uygulama READ_CONTACTS
iznini kullanarak bir bileşeni korumak ister ancak izni yanlışlıkla READ_CONACTS
olarak yazar. Kötü amaçlı bir uygulama, herhangi bir uygulamaya (veya sisteme) ait olmadığı için READ_CONACTS
için hak talebinde bulunabilir ve korunan bileşene erişim elde edebilir. Bu güvenlik açığının yaygın bir başka varyantı da android:permission=True
'tür. Büyük/küçük harf kullanımından bağımsız olarak true
ve false
gibi değerler, izin beyanı için geçersiz girişlerdir ve diğer özel izin beyanı yazım hatalarına benzer şekilde ele alınır. Bu sorunu düzeltmek için android:permission
özelliğinin değeri geçerli bir izin dizesi olarak 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 sistemi kullanın. Uygulamanızın manifest dosyasında yazım hatası olup olmadığını dikkatlice kontrol edin.
Risk: Yetim İ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ı yer vardır:
- AndroidManifest.xml: AndroidManifest.xml dosyasında önceden tanımlanmış (belirtilmemişse
<application>
izinleri kullanılır) sağlayıcı izni, alıcı izni, etkinlik izni, hizmet izni gibi izinler; - Kod: Çalışma zamanı koduna kaydedilir (ör.
registerReceiver()
.
Ancak bazen bu izinler, cihazdaki bir APK'nın manifest dosyasında ilgili bir <permission>
etiketiyle tanımlanmaz. Bu durumda, bu izinlere öksüz izinler denir. Bu durum aşağıdaki gibi çeşitli nedenlerden kaynaklanabilir:
- Manifest'teki güncellemeler ile izin kontrolü içeren kod arasında senkronizasyon sorunu olabilir
- İzinlerin bulunduğu APK derlemeye dahil edilmemiş veya yanlış sürüm dahil edilmiş olabilir
- Kontrolde veya manifest dosyasında izin adı yanlış yazılmış olabilir.
Kötü amaçlı bir uygulama, ebeveyni olmayan bir izin tanımlayabilir ve bu izni edinebilir. Bu durumda, bir bileşeni korumak için öksüz izne güvenen ayrıcalıklı uygulamaların güvenliği ihlal edilebilir.
Ayrıcalıklı uygulamanın herhangi bir bileşeni korumak veya kısıtlamak için izni kullandığı durumlarda, bu durum kötü amaçlı uygulamaya söz konusu bileşene erişim izni verebilir. Örnekler arasında bir izinle korunan etkinlikleri başlatma, bir içerik sağlayıcıya erişme veya öksüz izinle korunan bir yayın alıcısına yayın yapma yer alır.
Ayrıca, ayrıcalıklı uygulamanın kötü amaçlı uygulamanın meşru bir uygulama olduğuna inandırılarak dosya veya içerik yüklemesi sağlanabilir.
Çö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ır:
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 kullanır ve böylece diğer kötü amaçlı uygulamaların bunu yapmasını 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 izin verilip verilmeyeceğine karar verirken sistemin hangi prosedürleri uygulaması gerektiğini belirtir.
Çözümler
Normal veya Tehlikeli Koruma Seviyesinden Kaçınma
İzinlerinizde normal veya tehlikeli bir protectionLevel
kullanmak, çoğu uygulamanın izni isteyip alabileceği anlamına gelir:
- "normal" için yalnızca beyan edilmesi gerekir
- "tehlikeli" ifadesi birçok kullanıcı tarafından onaylanır.
Bu nedenle, bu protectionLevels
'ler çok fazla güvenlik sağlamaz.
İmza izinlerini kullanma (Android >= 10)
Mümkün olduğunda imza koruma seviyelerini kullanın. Bu özelliğin kullanılması, yalnızca izni oluşturan uygulamayla aynı sertifikayla imzalanan diğer uygulamaların bu korumalı özelliklere erişebilmesini sağlar. Özel bir imzalama sertifikası kullandığınızdan ve bu sertifikayı anahtar deposunda güvenli bir şekilde depoladığınızdan emin olun.
Manifest dosyanızda özel izinleri aşağıdaki gibi 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ıtlayabilirsiniz. Bunun için:
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 iznin Manifest dosyasında aşağıdaki şekilde beyan edilmesi gerekir:
Xml
<uses-permission android:name="my.custom.permission.MY_PERMISSION" />
İmza Özel İzinleri'ne karşı dikkatli olun (Android 10'dan eski sürümler)
Uygulamanız Android 10'dan eski sürümleri hedefliyorsa uygulamanızın özel izinleri, kaldırma veya güncelleme nedeniyle kaldırıldığında bu özel izinleri kullanmaya devam edip kontrolleri atlayabilecek kötü amaçlı uygulamalar olabilir. Bu durum, Android 10'da düzeltilen ayrıcalık yükseltme güvenlik açığından (CVE-2019-2200
) kaynaklanmaktadır.
Özel izinler yerine imza denetimlerinin önerilmesinin nedenlerinden biri de yarış koşulları riskidir.
Risk: Yarışma Durumu
Meşru bir uygulama (A
), diğer X
uygulamaları tarafından kullanılan bir imza özel izni tanımlar 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 sayede B
, A
uygulamasıyla aynı sertifikayla imzalanmasına gerek kalmadan X
uygulamalarında bu özel izinle korunan tüm bileşenlere erişebilir.
B
, A
'ten önce yüklenirse de aynı durum geçerli olur.
Çözümler
Bir bileşeni yalnızca sağlayıcı uygulamayla aynı imzayla imzalanan uygulamalar tarafından kullanılabilir hale getirmek istiyorsanız söz konusu bileşene erişimi kısıtlamak için özel izinler tanımlamaktan kaçınabilirsiniz. Bu durumda imza denetimlerini kullanabilirsiniz. Uygulamalarınızdan biri diğerine istek gönderdiğinde ikinci uygulama, isteğe uymadan önce her iki uygulamanın da aynı sertifikayla imzalandığını doğrulayabilir.
Kaynaklar
- İzin isteklerinizi en aza indirin
- İzinlere Genel Bakış
- Koruma seviyeleri açıklaması
- CustomPermissionTypo Android Lint
- Android Lint'i kullanma
- Android izinlerinin ayrıntılı açıklamasını ve ilginç fuzz testi bulgularını içeren araştırma makalesi