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 kullanımına örnek olarak aşağıdakiler verilebilir:
- İki veya daha fazla uygulama arasında işlemler arası iletişimi (IPC) kontrol etme
- Üçüncü taraf hizmetlerine erişme
- Bir uygulamanın paylaşılan verilerine erişimi kısıtlama
Etki
Bu güvenlik açığından faydalanmak, kötü amaçlı bir uygulamanın aslında korunması amaçlanan kaynaklara erişmesini sağlayabilir. 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çığı olan bir uygulama, READ_CONTACTS
iznini kullanarak bir bileşeni korumak ister ancak
izini yanlışlıkla READ_CONACTS
olarak yanlış yazar. Kötü amaçlı bir uygulama, herhangi bir uygulamaya (veya sisteme) ait olmadığı için READ_CONACTS
üzerinde hak talep edebilir 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ına bakılmaksızın 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. Bunu 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ın daha kolay fark edilmesini sağlamak için tutarlı bir adlandırma kuralı 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ındaki karşılık gelen <permission>
etiketi tarafından tanımlanmayabilir. 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 bir uyumsuzluk olabilir
- İzinlere sahip APK derlemeye dahil edilmeyebilir veya yanlış sürüm dahil edilebilir
- 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ı uygulamayı meşru bir uygulama olarak algılayıp dosya veya içerik yüklemesine neden olabilecek bir durum da ortaya çıkabilir.
Çö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: Hatalı android:protectionLevel kullanımı
Bu özellik, izindeki potansiyel risk düzeyini tanımlar 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 protectionLevel
kullanırsanız çoğu uygulama izin isteyebilir ve alabilir:
- "normal" için yalnızca beyan edilmesi gerekir
- "tehlikeli" ibaresi birçok kullanıcı tarafından onaylanacaktır
Bu nedenle, bu protectionLevels
'ler çok fazla güvenlik sağlamaz.
İmza İzinlerini Kullanma (Android >= 10)
Mümkün olduğunca imza koruma düzeyleri 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 (yeniden kullanılmayan) bir imzalama sertifikası kullandığınızdan emin olun ve bunu bir anahtar deposunda güvenli bir şekilde saklayın.
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ğin erişimini, yalnızca bu özel izni verilen uygulamalarla kısıtlayın (örneğin, aşağıdaki gibi):
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 şekilde B
, A
uygulamasıyla aynı sertifikayla imzalanmasına gerek kalmadan X
uygulamalarında bu özel izin tarafından 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ın kullanabileceği 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