Uygulama güvenliği

Bu sayfada, uygulama güvenliğinin çeşitli yönleri açıklanmaktadır.

Uygulamaların öğeleri

Android, mobil cihazlar için açık kaynaklı bir platform ve uygulama ortamı sunar. Temel işletim sistemi, Linux çekirdeğine dayanır. Android uygulamaları en sık Java programlama dilinde yazılır ve Android Çalışma Zamanı (ART) sanal makinesinde çalışır. Ancak uygulamalar yerel kodla da yazılabilir. Uygulamalar, APK dosyası uzantılı tek bir dosyadan yüklenir.

Android uygulamalarının temel yapı taşları şunlardır:

  • AndroidManifest.xml: AndroidManifest.xml dosyası, bir uygulamadaki tüm üst düzey bileşenlerle (özellikle aşağıda açıklanan etkinlikler, hizmetler, yayın alıcılar ve içerik sağlayıcılar) ilgili olarak sisteme ne yapması gerektiğini söyleyen kontrol dosyasıdır. Bu dosya, hangi izinlerin gerekli olduğunu da belirtir.

  • Etkinlikler: Etkinlik, genellikle Activity sınıfını kullanan tek bir kullanıcı odaklı görevin kodudur. Bir etkinlik genellikle kullanıcıya bir kullanıcı arayüzü göstermeyi içerir ancak bu zorunlu değildir. Bazı etkinlikler hiçbir zaman kullanıcı arayüzü göstermez. Genellikle, uygulamanın etkinliklerinden biri uygulamaya giriş noktasıdır.

  • Hizmetler: Hizmet, Service sınıfına göre arka planda çalışan bir kod gövdesidir. Kendi sürecinde veya başka bir uygulamanın süreci bağlamında çalışabilir. Diğer bileşenler bir hizmete bağlanır ve uzak prosedür çağrıları aracılığıyla hizmetteki yöntemleri çağırır. Örneğin, bir hizmet olarak medya oynatıcı: Kullanıcı, medya seçimi kullanıcı arayüzünden çıksa bile müziğin çalmaya devam etmesini isteyebilir. Bir hizmet, kullanıcı arayüzü tamamlandığında bile müziğin çalınmaya devam etmesini sağlar.

  • Yayın alıcı: Yayın alıcı, BroadcastReceiver sınıfının bir nesnesidir. Intent sınıfının bir örneği olan amaç olarak bilinen bir IPC mekanizması, işletim sistemi veya başka bir uygulama tarafından verildiğinde başlatılır. Örneğin, bir uygulama düşük pil mesajı için alıcı kaydedebilir ve davranışını bu bilgilere göre değiştirebilir.

Android izin modeli: Korunan API'lere erişim

Android'deki tüm uygulamalar Application Sandbox'ta çalışır. Varsayılan olarak, bir Android uygulaması yalnızca sınırlı bir sistem kaynağı aralığına erişebilir. Sistem, yanlış veya kötü amaçlı kullanılması durumunda kullanıcı deneyimini, ağı ya da cihazdaki verileri olumsuz etkileyebilecek kaynaklara Android uygulaması erişimini yönetir.

Bu kısıtlamalar çeşitli şekillerde uygulanır. Bazı özellikler, hassas işlevler için API'lerin kasıtlı olarak eksik bırakılması nedeniyle kısıtlanmıştır (ör. SIM kartı doğrudan değiştirmek için Android API'si yoktur). Bazı durumlarda, rollerin ayrılması, depolama alanının uygulama bazında yalıtılması gibi bir güvenlik önlemi sağlar. Diğer durumlarda ise hassas API'ler, güvenilir uygulamalar tarafından kullanılmak üzere tasarlanır ve izinler olarak bilinen bir güvenlik mekanizmasıyla korunur.

Bu korumalı API'ler şunlardır:

  • Kamera işlevleri
  • Konum verileri (GPS)
  • Bluetooth işlevleri
  • Telefon işlevleri
  • SMS/MMS işlevleri
  • Ağ/veri bağlantıları

Bu kaynaklara yalnızca işletim sistemi üzerinden erişilebilir. Bir uygulamanın cihazdaki korumalı API'leri kullanabilmesi için manifestinde ihtiyaç duyduğu özellikleri tanımlaması gerekir. Android 6.0 ve sonraki tüm sürümlerde çalışma zamanı izinleri modeli kullanılır. Bir kullanıcı, korumalı API gerektiren bir uygulamadan özellik isteğinde bulunursa sistem, kullanıcıya izni reddetmesini veya vermesini isteyen bir iletişim kutusu gösterir.

Verilen izinler, uygulama yüklü olduğu sürece geçerli olur. Kullanıcıların kafasını karıştırmamak için sistem, uygulamaya verilen izinleri kullanıcıya tekrar bildirmez. Ayrıca, temel işletim sistemine dahil edilen veya bir OEM tarafından paketlenen uygulamalar kullanıcıdan izin istemez. Uygulama kaldırılırsa izinler de kaldırılır. Bu nedenle, uygulamanın daha sonra yeniden yüklenmesi izinlerin tekrar gösterilmesine neden olur.

Kullanıcılar, cihaz ayarlarında daha önce yükledikleri uygulamaların izinlerini görüntüleyebilir. Kullanıcılar, istedikleri zaman bazı işlevleri (ör. GPS, radyo veya kablosuz bağlantıyı devre dışı bırakma) genel olarak da kapatabilir.

Bir uygulama, manifest dosyasında bildirilmemiş korumalı bir özelliği kullanmaya çalışırsa izin hatası genellikle uygulamaya geri gönderilen bir güvenlik istisnasıyla sonuçlanır. Korumalı API izin kontrolleri, atlatmayı önlemek için mümkün olan en düşük düzeyde uygulanır. Bir uygulama, korumalı API'lere erişim isteğinde bulunurken yüklendiğinde gösterilen kullanıcı mesajı örneği Şekil 2'de gösterilmektedir.

Varsayılan sistem izinleri Manifest.permission adresinde açıklanmıştır. Uygulamalar, diğer uygulamaların kullanması için kendi izinlerini beyan edebilir. Bu tür izinler yukarıdaki konumda listelenmez.

Bir izin tanımlanırken protectionLevel özelliği, kullanıcıya izni gerektiren uygulamalar hakkında nasıl bilgi verileceğini veya izni kimlerin alabileceğini sisteme bildirir. Uygulamaya özel izinler oluşturma ve kullanma hakkında ayrıntılı bilgiyi Güvenlik kontrol listesi başlıklı makalede bulabilirsiniz.

Üçüncü taraf uygulamalarının kullanamadığı ancak OEM tarafından önceden yüklenen uygulamaların kullanabildiği bazı cihaz özellikleri (ör. SMS yayın intent'leri gönderme) vardır. Bu izinler signatureOrSystem iznini kullanır.

Kullanıcılar üçüncü taraf uygulamalarını nasıl anlar?

Android, kullanıcıların üçüncü taraf uygulamalarıyla etkileşim kurarken bunu net bir şekilde anlamalarını ve bu uygulamaların sahip olduğu özellikler hakkında bilgilendirilmelerini sağlamaya çalışır. Kullanıcıya herhangi bir uygulama yüklenmeden önce, uygulamanın istediği farklı izinlerle ilgili net bir mesaj gösterilir. Yükleme işleminden sonra kullanıcıdan herhangi bir izni onaylaması tekrar istenmez.

İzinleri yükleme işleminden hemen önce göstermenin birçok nedeni vardır. Bu aşamada kullanıcı, uygulamanın, geliştiricinin ve işlevlerin ihtiyaç ve beklentilerini karşılayıp karşılamadığını belirlemek için bu bilgiler hakkında aktif olarak inceleme yapar. Ayrıca, bu kullanıcıların uygulamaya henüz zihinsel veya finansal olarak bağlı olmaması ve uygulamayı diğer alternatif uygulamalarla kolayca karşılaştırabilmesi de önemlidir.

Diğer bazı platformlar, kullanıcı bildirimleri için farklı bir yaklaşım kullanır ve her oturumun başında veya uygulamalar kullanılırken izin ister. Android'in vizyonu, kullanıcıların istedikleri zaman uygulamalar arasında sorunsuz bir şekilde geçiş yapabilmelerini sağlamaktır. Her seferinde onay istemek kullanıcıyı yavaşlatır ve Android'in mükemmel bir kullanıcı deneyimi sunmasını engeller. Kullanıcının yükleme sırasında izinleri incelemesi, rahatsızlık duyarsa uygulamayı yüklememe seçeneği sunar.

Ayrıca, birçok kullanıcı arayüzü çalışması, kullanıcıya çok fazla istem göstermenin, kullanıcının gösterilen tüm iletişim kutularında Tamam'ı tıklamasına neden olduğunu göstermiştir. Android'in güvenlik hedeflerinden biri, önemli güvenlik bilgilerini kullanıcıya etkili bir şekilde iletmektir. Bu, kullanıcının yok saymaya alıştığı iletişim kutuları kullanılarak yapılamaz. Önemli bilgileri yalnızca bir kez ve önemli olduklarında göstererek kullanıcının neyi kabul ettiğini düşünme olasılığı artar.

Bazı platformlar, uygulama işlevleri hakkında hiçbir bilgi göstermemeyi tercih eder. Bu yaklaşım, kullanıcıların uygulama özelliklerini kolayca anlamasını ve tartışmasını engeller. Tüm kullanıcıların her zaman tam olarak bilgilendirilmiş kararlar vermesi mümkün olmasa da Android izin modeli, uygulamalarla ilgili bilgilere çok çeşitli kullanıcıların kolayca erişmesini sağlar. Örneğin, beklenmedik izin istekleri, daha bilinçli kullanıcıların uygulama işlevselliğiyle ilgili önemli sorular sormasına ve endişelerini Google Play gibi tüm kullanıcılara görünür olan yerlerde paylaşmasına neden olabilir.

Uygulama yükleme sırasında izinler - Google Çeviri Yüklü bir uygulamanın izinleri: Gmail
Uygulama yükleme sırasında izinler - Google Çeviri Yüklü bir uygulamanın izinleri - Gmail

Şekil 1. Uygulamaların izinlerini görüntüleme

İşlemler arası iletişim

Süreçler, geleneksel Unix tipi mekanizmaların herhangi birini kullanarak iletişim kurabilir. Dosya sistemi, yerel soketler veya sinyaller buna örnek verilebilir. Ancak Linux izinleri geçerli olmaya devam eder.

Android ayrıca yeni IPC mekanizmaları da sunar:

  • Binder: İşlem içi ve işlemler arası çağrılar gerçekleştirilirken yüksek performans için tasarlanmış, yetkiye dayalı hafif bir uzak prosedür çağrısı mekanizmasıdır. Binder, özel bir Linux sürücüsü kullanılarak uygulanır. Sınıfın açıklaması için Dosya başlıklı makaleye bakın.

  • Hizmetler: Hizmetler, doğrudan bağlayıcı kullanılarak erişilebilen arayüzler sağlayabilir. Daha ayrıntılı açıklama için Uygulama öğeleri başlıklı makaleyi inceleyin.

  • Amaçlar: Amaç, bir şeyi yapma niyetini temsil eden basit bir mesaj nesnesidir. Örneğin, uygulamanız bir web sayfası görüntülemek istiyorsa bir intent örneği oluşturup bunu sisteme ileterek URL'yi görüntüleme amacını ifade eder. Sistem, bu amacı nasıl işleyeceğini bilen başka bir kod parçası (bu örnekte tarayıcı) bulur ve kodu çalıştırır. Niyetler, sistem genelinde ilginç etkinlikleri (ör. bildirim) yayınlamak için de kullanılabilir. Sınıfın açıklaması için Intent başlıklı makaleye bakın.

  • İçerik sağlayıcılar: İçerik sağlayıcı, cihazdaki verilere erişim sağlayan bir veri deposudur. Kullanıcının kişi listesine erişmek için kullanılan içerik sağlayıcı, klasik bir örnektir. Bir uygulama, diğer uygulamaların içerik sağlayıcıyla kullanıma sunduğu verilere erişebilir ve kendi verilerini kullanıma sunmak için kendi içerik sağlayıcısını da tanımlayabilir. Sınıfın açıklaması için ContentProvider'a bakın.

Ağ soketleri veya herkesin yazabileceği dosyalar gibi diğer mekanizmalar kullanılarak IPC'nin uygulanması mümkün olsa da önerilen Android IPC çerçeveleri bunlardır. Android geliştiricilerin, kullanıcı verilerinin güvenliğini sağlama ve güvenlik açıklarının oluşmasını önleme konusunda en iyi uygulamaları kullanması önerilir.

Maliyete duyarlı API'ler

Maliyete duyarlı API, kullanıcı veya ağ için maliyet oluşturabilecek tüm işlevlerdir. Android platformu, maliyet açısından hassas API'leri işletim sistemi tarafından kontrol edilen korumalı API'ler listesine yerleştirmiştir. Kullanıcının, maliyet açısından hassas API'lerin kullanılmasını isteyen üçüncü taraf uygulamalarına açıkça izin vermesi gerekir. Bu API'ler şunlardır:

  • Telefon
  • SMS/MMS
  • Ağ/Veri
  • Uygulama İçi Faturalandırma
  • NFC Erişimi

Android 4.2, SMS kullanımında daha fazla kontrol sağlar. Android, bir uygulama ek ücretlere neden olabilecek premium hizmetler kullanan kısa koda SMS göndermeye çalıştığında bildirim gösterir. Kullanıcı, uygulamaya mesaj gönderme izni vermeyi veya uygulamayı engellemeyi seçebilir.

SIM karta erişim

Üçüncü taraf uygulamaları, SIM karta düşük düzeyde erişemez. İşletim sistemi, SIM kart belleğindeki kişisel bilgilere (kişiler) erişim de dahil olmak üzere SIM kartla ilgili tüm iletişimi yönetir. Uygulamalar, yalnızca Radyo Arayüzü Katmanı (RIL) tarafından yönetildikleri için AT komutlarına da erişemez. RIL, bu komutlar için üst düzey API'ler sağlamaz.

Kişisel bilgiler

Android, kullanıcı verilerine erişim sağlayan API'leri korumalı API'ler arasına yerleştirdi. Normal kullanımda Android cihazlar, kullanıcılar tarafından yüklenen üçüncü taraf uygulamalarında da kullanıcı verileri biriktirir. Bu bilgileri paylaşmayı seçen uygulamalar, verileri üçüncü taraf uygulamalardan korumak için Android OS izin kontrollerini kullanabilir.

Hassas kullanıcı verilerine yalnızca korumalı API'ler üzerinden erişilebilir.

Şekil 2. Hassas kullanıcı verilerine erişim yalnızca korumalı API'ler aracılığıyla sağlanır.

Kişiler ve takvim gibi kişisel veya kimliği tanımlayabilecek bilgiler içermesi muhtemel sistem içerik sağlayıcıları, açıkça tanımlanmış izinlerle oluşturulmuştur. Bu ayrıntı düzeyi, kullanıcıya uygulamaya sağlanabilecek bilgi türleri hakkında net bir gösterge sunar. Üçüncü taraf uygulamaları, yükleme sırasında bu kaynaklara erişmek için izin isteyebilir. İzin verilirse uygulama yüklenebilir ve yüklendiği sürece istenen verilere istediği zaman erişebilir.

Kişisel bilgi toplayan tüm uygulamalarda bu veriler varsayılan olarak yalnızca ilgili uygulamayla sınırlıdır. Bir uygulama, IPC aracılığıyla verileri diğer uygulamaların kullanımına sunmayı seçerse erişim izni veren uygulama, işletim sistemi tarafından zorunlu kılınan IPC mekanizmasına izinler uygulayabilir.

Hassas veri giriş cihazları

Android cihazlar genellikle uygulamaların çevreyle etkileşime girmesine olanak tanıyan hassas veri giriş cihazları (ör. kamera, mikrofon veya GPS) sağlar. Üçüncü taraf bir uygulamanın bu cihazlara erişebilmesi için öncelikle kullanıcının Android OS İzinleri'ni kullanarak açıkça erişim izni vermesi gerekir. Yükleme sırasında yükleyici, kullanıcıdan sensöre ada göre izin vermesini ister.

Bir uygulama kullanıcının konumunu öğrenmek istiyorsa kullanıcının konumuna erişmek için izin gerekir. Yükleme sırasında yükleyici, kullanıcıya uygulamaya konumuna erişim izni verip vermeyeceğini sorar. Kullanıcı, istediği zaman hiçbir uygulamanın konumuna erişmesini istemiyorsa Ayarlar uygulamasını çalıştırabilir, Konum ve Güvenlik'e gidip Kablosuz ağları kullan ve GPS uydularını etkinleştir seçeneklerinin işaretini kaldırabilir. Bu işlem, kullanıcının cihazındaki tüm uygulamalar için konuma dayalı hizmetleri devre dışı bırakır.

Cihaz meta verileri

Android ayrıca, doğası gereği hassas olmayan ancak kullanıcı, kullanıcı tercihleri ve cihazı kullanma şekli hakkında dolaylı olarak özellikler ortaya çıkarabilecek verilere erişimi kısıtlamaya çalışır.

Uygulamalar varsayılan olarak işletim sistemi günlüklerine, tarayıcı geçmişine, telefon numarasına veya donanım ya da ağ tanımlama bilgilerine erişemez. Bir uygulama yükleme sırasında bu bilgilere erişim isteğinde bulunursa yükleyici, kullanıcıya uygulamanın bilgilere erişip erişemeyeceğini sorar. Kullanıcı erişim izni vermezse uygulama yüklenmez.

Sertifika yetkilileri

Android, sistem genelinde güvenilen bir dizi yüklü sistem sertifika yetkilisi içerir. Android 7.0'dan önce cihaz üreticileri, cihazlarıyla birlikte gönderilen CA'ları değiştirebiliyordu. Ancak Android 7.0 ve sonraki sürümleri çalıştıran cihazlarda, cihaz üreticileri tarafından değişiklik yapılmasına artık izin verilmediğinden tek tip bir sistem CA'ları grubu bulunur.

Android'in varsayılan sertifika kümesine yeni bir genel CA olarak eklenmek için CA'nın Mozilla CA Inclusion Process'i tamamlaması ve ardından Android'e karşı bir özellik isteği göndermesi ( https://code.google.com/p/android/issues/entry) gerekir. Bu sayede CA, Android Açık Kaynak Projesi (AOSP) kapsamındaki varsayılan Android CA kümesine eklenir.

Hâlâ cihaza özel olan ve AOSP CA'larının temel kümesine dahil edilmemesi gereken CA'lar vardır. Örneğin, operatörün altyapısının bileşenlerine (SMS/MMS ağ geçitleri gibi) güvenli bir şekilde erişmek için gerekebilecek operatörlerin özel CA'ları. Cihaz üreticilerinin, özel CA'ları yalnızca bu CA'lara güvenmesi gereken bileşenlere/uygulamalara dahil etmesi önerilir. Daha fazla bilgi için Ağ Güvenliği Yapılandırması başlıklı makaleyi inceleyin.

Uygulama imzalama

Kod imzalama, geliştiricilerin uygulamanın yazarını tanımlamasına ve karmaşık arayüzler ve izinler oluşturmadan uygulamalarını güncellemesine olanak tanır. Android platformunda çalıştırılan her uygulama geliştirici tarafından imzalanmalıdır. İmzalanmadan yüklenmeye çalışan uygulamalar, Google Play veya Android cihazdaki paket yükleyici tarafından reddedilir.

Google Play'de uygulama imzalama, Google'ın geliştiriciye duyduğu güven ile geliştiricinin uygulamasına duyduğu güven arasında bir köprü kurar. Geliştiriciler, uygulamalarının Android cihazlara değiştirilmeden sunulduğunu bilir ve uygulamalarının davranışından sorumlu tutulabilir.

Android'de uygulama imzalama, bir uygulamayı uygulama korumalı alanına yerleştirmenin ilk adımıdır. İmzalı uygulama sertifikası, hangi kullanıcı kimliğinin hangi uygulamayla ilişkilendirileceğini tanımlar. Farklı uygulamalar farklı kullanıcı kimlikleri altında çalışır. Uygulama imzalama, bir uygulamanın iyi tanımlanmış IPC dışında başka bir uygulamaya erişememesini sağlar.

Bir uygulama (APK dosyası) Android cihaza yüklendiğinde Paket Yöneticisi, APK'nın bu APK'da bulunan sertifikayla doğru şekilde imzalandığını doğrular. Sertifika (veya daha doğrusu sertifikadaki ortak anahtar), cihazdaki diğer APK'leri imzalamak için kullanılan anahtarla eşleşiyorsa yeni APK, manifestte benzer şekilde imzalanmış diğer APK'lerle UID paylaştığını belirtebilir.

Uygulamalar üçüncü taraflarca (OEM, operatör, alternatif pazar) veya kendileri tarafından imzalanabilir. Android, geliştiricilerin harici yardım veya izin olmadan oluşturabileceği kendinden imzalı sertifikalar kullanarak kod imzalamayı sağlar. Uygulamaların merkezi bir yetkili tarafından imzalanması gerekmez. Android şu anda uygulama sertifikaları için CA doğrulaması yapmamaktadır.

Uygulamalar, güvenlik izinlerini imza koruma düzeyinde de bildirebilir. Bu sayede, yalnızca aynı anahtarla imzalanan uygulamalara erişimi kısıtlayarak farklı UID'ler ve uygulama özel korumalı alanları korunur. Aynı geliştirici anahtarıyla imzalanmış iki veya daha fazla uygulamanın manifestlerinde paylaşılan bir UID beyan edebildiği paylaşılan UID özelliği aracılığıyla paylaşılan bir uygulama sanal alanı ile daha yakın bir ilişki kurulabilir.

Uygulama doğrulama

Android 4.2 ve sonraki sürümlerde uygulama doğrulama özelliği desteklenir. Kullanıcılar, Uygulama Doğrulama'yı etkinleştirmeyi ve uygulamaları yüklemeden önce bir uygulama doğrulayıcı tarafından değerlendirilmesini tercih edebilir. Uygulama doğrulama, kullanıcı zararlı olabilecek bir uygulamayı yüklemeye çalıştığında kullanıcıyı uyarabilir. Bir uygulama özellikle zararlıysa yükleme engellenebilir.

Dijital hak yönetimi

Android platformu, uygulamaların haklarla korunan içeriği, içerikle ilişkili lisans kısıtlamalarına göre yönetmesine olanak tanıyan genişletilebilir bir dijital hak yönetimi (DRM) çerçevesi sağlar. DRM çerçevesi birçok DRM şemasını destekler. Bir cihazın hangi DRM şemalarını desteklediği, cihaz üreticisine bağlıdır.

Android DRM çerçevesi iki mimari katmanda uygulanır (bkz. Şekil 3):

  • Android uygulama çerçevesi aracılığıyla uygulamalara sunulan ve standart uygulamalar için ART VM üzerinden çalışan bir DRM çerçevesi API'si.

  • DRM çerçevesini uygulayan ve çeşitli DRM şemaları için hak yönetimi ve şifre çözme işlemlerini gerçekleştirmek üzere DRM eklentilerinin (aracıları) kullanabileceği bir arayüz sunan yerel kod DRM yöneticisi

Android platformunda Dijital Hak Yönetimi'nin mimarisi

Şekil 3. Android platformunda DRM'nin mimarisi.