Ö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 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:

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