Android platformu, uygulama kaynaklarını tanımlamak ve izole etmek için Linux'un kullanıcıya dayalı korumasından yararlanır. Bu sayede uygulamalar birbirinden izole edilir ve hem uygulamalar hem de sistem kötü amaçlı uygulamalardan korunur. Android bunu yapmak için her Android uygulamasına benzersiz bir kullanıcı kimliği (UID) atar ve uygulamayı kendi işleminde çalıştırır.
Android, çekirdek düzeyinde bir uygulama korumalı alanı oluşturmak için UID'yi kullanır. Çekirdek, uygulamalara atanan kullanıcı ve grup kimlikleri gibi standart Linux araçları aracılığıyla uygulamalar ile sistem arasındaki güvenliği işlem düzeyinde zorlar. Varsayılan olarak uygulamalar birbirleriyle etkileşime geçemez ve işletim sistemine sınırlı erişime sahiptir. A uygulaması, B uygulamasının verilerini okumak veya telefon araması yapmak gibi kötü amaçlı bir işlem yapmaya çalışırsa uygun varsayılan kullanıcı ayrıcalıklarına sahip olmadığı için bu işlem yapması engellenir. Korumalı alan basit, denetlenebilirdir ve on yıllardır kullanılan UNIX tarzı kullanıcı ayırma işlemlerine ve dosya izinlerine dayanır.
Uygulama Korumalı Alanı çekirdekte bulunduğundan bu güvenlik modeli hem yerel koda hem de işletim sistemi uygulamalarına uygulanır. İşletim sistemi kitaplıkları, uygulama çerçevesi, uygulama çalışma zamanı ve tüm uygulamalar gibi çekirdeğin üzerindeki tüm yazılımlar, uygulama korumalı alanında çalışır. Bazı platformlarda geliştiriciler belirli bir geliştirme çerçevesi, API grubu veya dil ile sınırlıdır. Android'de, güvenliğin uygulanması için bir uygulamanın nasıl yazılabileceğiyle ilgili herhangi bir kısıtlama yoktur. Bu açıdan yerel kod, yorumlanmış kod kadar korumalı bir alandadır.
Korumalar
Genellikle, düzgün şekilde yapılandırılmış bir cihazda Uygulama Korumalı Alanı'ndan çıkmak için Linux çekirdeğinin güvenliğinin ihlal edilmesi gerekir. Ancak diğer güvenlik özelliklerine benzer şekilde, uygulama korumalı alanını zorunlu kılan bireysel korumalar saldırılara karşı bağışık değildir. Bu nedenle, tek bir güvenlik açığının işletim sisteminin veya diğer uygulamaların güvenliğini ihlal etmesini önlemek için kapsamlı savunma önemlidir.
Android, uygulama korumalı alanını zorunlu kılmak için çeşitli korumalardan yararlanır. Bu yaptırımlar zaman içinde kullanıma sunuldu ve orijinal UID tabanlı isteğe bağlı erişim denetimi (DAC) korumalı alanını önemli ölçüde güçlendirdi. Önceki Android sürümleri aşağıdaki korumaları içeriyordu:
- Android 5.0'de SELinux, sistem ile uygulamalar arasında zorunlu erişim denetimi (MAC) ayrımı sağlıyordu. Ancak tüm üçüncü taraf uygulamaları aynı SELinux bağlamında çalıştığından uygulama içi izolasyon öncelikle UID DAC tarafından zorunlu kılınıyordu.
- Android 6.0'ta SELinux korumalı alanı, uygulamaları fiziksel kullanıcı başına sınırda izole edecek şekilde genişletildi. Ayrıca Android, uygulama verileri için daha güvenli varsayılan değerler de belirledi:
targetSdkVersion >= 24
içeren uygulamalarda, uygulamanın ana dizinindeki varsayılan DAC izinleri 751'den 700'e değiştirildi. Bu, gizli uygulama verileri için daha güvenli bir varsayılan ayar sağladı (uygulamalar bu varsayılan ayarları geçersiz kılabilse de). - Android 8.0'da tüm uygulamalar, uygulamaların kullanmasına izin verilen sistem çağrılarını sınırlayan bir
seccomp-bpf
filtresiyle çalışacak şekilde ayarlandı. Böylece uygulama/çekirdek sınırı güçlendirildi. - Android 9'da
targetSdkVersion >= 28
içeren ayrıcalıklı olmayan tüm uygulamalar, uygulama başına MAC sağlayarak ayrı SELinux korumalı alanlarında çalışmalıdır. Bu koruma, uygulama ayırımını iyileştirir, güvenli varsayılan ayarların geçersiz kılınmasını önler ve (en önemlisi) uygulamaların verilerini dünya genelinde erişilebilir hale getirmesini engeller. - Android 10'da uygulamalar, dosya sisteminin sınırlı bir ham görünümüne sahiptir ve /sdcard/DCIM gibi yollara doğrudan erişemez. Ancak uygulamalar, Context.getExternalFilesDir() gibi geçerli yöntemler tarafından döndürülen pakete özgü yollarına tam ham erişim elde eder.
Dosya paylaşma kuralları
Uygulama verilerini herkese açık olarak ayarlamak kötü bir güvenlik uygulamasıdır. Erişim herkese verilir ve erişimi yalnızca amaçlanan alıcılarla sınırlamak mümkün değildir. Bu uygulama, bilgi açıklama sızıntılarına ve kafa karıştırıcı yardımcı güvenlik açıklarına yol açmıştır. Ayrıca, hassas verileri olan uygulamaları (e-posta istemcileri gibi) hedefleyen kötü amaçlı yazılımlar için favori bir hedeftir. Android 9 ve sonraki sürümlerde, targetSdkVersion>=28
izni olan uygulamalarda bu şekilde dosya paylaşımına açıkça izin verilmez.
Uygulama verilerini dünya genelinde erişilebilir hale getirmek yerine, dosya paylaşırken aşağıdaki yönergeleri kullanın:
- Uygulamanızın başka bir uygulamayla dosya paylaşması gerekiyorsa bir içerik sağlayıcı kullanın. İçerik sağlayıcılar, verileri herkese açık UNIX izinlerinin birçok olumsuz yönünü ortadan kaldırarak uygun ayrıntı düzeyinde paylaşır (ayrıntılar için İçerik sağlayıcılarla ilgili temel bilgiler başlıklı makaleyi inceleyin).
- Uygulamanızda herkese açık olması gereken dosyalar (ör. fotoğraflar) varsa bu dosyalar medyaya özgü olmalı (yalnızca fotoğraflar, videolar ve ses dosyaları) ve MediaStore sınıfı kullanılarak depolanmalıdır. (Medya öğesi ekleme hakkında daha fazla bilgi için Paylaşılan depolama alanından medya dosyalarına erişme başlıklı makaleyi inceleyin.)
Depolama çalışma zamanındaki izni, MediaStore aracılığıyla güçlü şekilde yazılmış koleksiyonlara erişimi kontrol eder.
PDF'ler ve MediaStore.Downloads sınıfı gibi zayıf türülendirilmiş dosyalara erişmek için uygulamaların ACTION_OPEN_DOCUMENT
intent'i gibi intent'leri kullanması gerekir.
Android 10 davranışını etkinleştirmek için requestLegacyExternalStorage
manifest özelliğini kullanın ve uygulama izinleriyle ilgili en iyi uygulamaları uygulayın.
- Android 9'u (ve önceki sürümleri) hedefleyen uygulamalar için manifest işaretinin varsayılan değeri
true
'tür. - Android 10'u hedefleyen uygulamalar için varsayılan değer false (yanlış) değerini alır. Android 10'u hedefleyen uygulamalarda filtrelenmiş depolama görünümünü geçici olarak devre dışı bırakmak için manifest işaretinin değerini
true
olarak ayarlayın. - Yükleyici, kısıtlanmış izinleri kullanarak korumalı olmayan depolama için izin verilen uygulamaları izin verilenler listesine ekler. İzin verilenler listesine eklenmeyen uygulamalar korumalı alana alınır.