Özel İzinler

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:

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