iOS Basics
Ayrıcalık Ayrımı ve Kum Sandığı
iOS'ta, kullanıcı erişilebilir uygulamalar ile sistem çekirdeğinin temel işlemleri arasında bir ayrıcalık ayrımı bulunur. Uygulamalar mobile
kullanıcı kimliği altında çalışırken, önemli sistem işlemleri root
olarak çalışır. Bu ayrım, uygulamaların hangi eylemleri gerçekleştirebileceği konusunda sıkı kısıtlamalar getiren bir kum sandığı mekanizması tarafından güçlendirilir. Örneğin, uygulamalar aynı kullanıcı kimliğini paylaşsalar bile, birbirlerinin verilerine erişmeleri veya değiştirmeleri yasaktır.
Uygulamalar belirli bir dizine (private/var/mobile/Applications/{rastgele ID}
) kurulur ve SMS ve telefon görüşmeleri gibi belirli sistem alanlarına ve işlevlere sınırlı okuma erişimi vardır. Korunan alanlara erişim, kullanıcı izni için bir açılır pencere isteği tetikler.
Veri Koruma
iOS, veri koruma bütünlüğünü sağlamak için Secure Enclave Processor (SEP) üzerine inşa edilen Veri Koruma API'leri sunar - şifreleme işlemleri ve anahtar yönetimi için ayrılmış bir yardımcı işlemci. SEP, içine gömülü olan cihaza özgü bir anahtar olan cihaz UID'si aracılığıyla veri koruması bütünlüğünü sağlar.
Bir dosya oluşturulduğunda, dosyanın içeriğini şifreleyen benzersiz bir 256-bit AES şifreleme anahtarı oluşturulur. Bu şifreleme anahtarı, bir sınıf anahtarıyla şifrelenir ve dosyanın meta verilerine depolanır. Bir dosyanın şifresini çözmek için, sistemin anahtarını kullanarak meta verilere erişilir, sınıf kimliğiyle sınıf anahtarını alınır ve ardından dosyanın benzersiz şifreleme anahtarı çözülür.
iOS, veri güvenliği için dört koruma sınıfı tanımlar, verinin ne zaman ve nasıl erişilebileceğini belirler:
Tam Koruma (NSFileProtectionComplete): Veri, kullanıcının şifresini kullanarak cihazın kilidini açana kadar erişilemez.
Açık Olmadıkça Korunan (NSFileProtectionCompleteUnlessOpen): Dosya, cihaz kilitlendiğinde bile erişilebilir, ancak dosya cihaz kilidini açıldığında açıldıysa.
İlk Kullanıcı Kimlik Doğrulamasına Kadar Korunan (NSFileProtectionCompleteUntilFirstUserAuthentication): Veri, ilk kullanıcı açılışından sonra yapılan ilk kullanıcı kimlik doğrulamasından sonra erişilebilir hale gelir ve cihaz tekrar kilitlense bile erişilebilir kalır.
Koruma Yok (NSFileProtectionNone): Veri, cihaz UID'si tarafından korunur ve hızlı uzaktan veri silmeyi kolaylaştırır.
NSFileProtectionNone
hariç tüm sınıfların şifrelemesi, cihaz UID'si ve kullanıcının şifresinden türetilen bir anahtarla yapılır, böylece doğru şifreyle sadece cihazda çözme mümkün olur. iOS 7'den itibaren, varsayılan koruma sınıfı "İlk Kullanıcı Kimlik Doğrulamasına Kadar Korunan" olarak belirlenmiştir.
Geliştiriciler, bir iPhone'daki dosyaların veri koruma sınıfını incelemek için FileDP adlı bir araç kullanabilirler.
Anahtar Zinciri
iOS'ta, bir Anahtar Zinciri, yalnızca onu depolayan uygulama veya açıkça yetkilendirilenler tarafından erişilebilen hassas bilgilerin güvenli bir şifrelenmiş konteyner olarak hizmet eder. Bu şifreleme, iOS tarafından oluşturulan benzersiz bir şifre tarafından güçlendirilir ve kendisi AES ile şifrelenir. Bu şifreleme işlemi, kullanıcının parolasını cihazın UID'den türetilen bir tuzla birleştiren bir PBKDF2 işlevi kullanır ve yalnızca güvenli kripto birimi yongası'nın erişebileceği bir bileşendir. Sonuç olarak, kullanıcının parolası bilinse bile, Anahtar Zinciri içeriği yalnızca orijinal olarak şifrelendiği cihaz dışında hiçbir cihazda erişilemez kalır.
Anahtar Zinciri verilerinin yönetimi ve erişimi, Keychain-access-groups
ve application-identifier
gibi belirli uygulama yetkilendirmelerine dayalı olarak securityd
hizmeti tarafından ele alınır.
Anahtar Zinciri API İşlemleri
Anahtar Zinciri API'si, Apple'ın Anahtar Zinciri Hizmetleri belgelerinde ayrıntılı olarak açıklanan güvenli depolama yönetimi için temel işlevleri sağlar:
SecItemAdd
: Anahtar Zinciri'ne yeni bir öğe ekler.SecItemUpdate
: Anahtar Zinciri'ndeki mevcut bir öğeyi günceller.SecItemCopyMatching
: Anahtar Zinciri'nden bir öğe alır.SecItemDelete
: Anahtar Zinciri'nden bir öğeyi kaldırır.
Anahtar Zinciri parolasını kaba kuvvet saldırısıyla çözmek, şifrelenmiş anahtara doğrudan saldırmak veya cihazdaki parolayı tahmin etmeye çalışmak anlamına gelir, ancak güvenli kripto birimi yongasının başarısız denemeler arasında bir gecikme uygulaması nedeniyle önemli ölçüde zorlaşır.
Anahtar Zinciri Öğe Veri Korumasını Yapılandırma
Anahtar Zinciri öğelerinin veri koruma seviyeleri, öğe oluşturma veya güncelleme sırasında kSecAttrAccessible
özniteliği kullanılarak ayarlanır. Bu seviyeler, Apple tarafından belirtilen şekilde, Anahtar Zinciri öğelerinin ne zaman ve nasıl erişilebilir olduğunu belirler:
kSecAttrAccessibleAlways
: Her zaman erişilebilir, cihaz kilidi durumundan bağımsız olarak.kSecAttrAccessibleAlwaysThisDeviceOnly
: Her zaman erişilebilir, ancak yedeklemelere dahil edilmez.kSecAttrAccessibleAfterFirstUnlock
: İlk yeniden başlatmadan sonra erişilebilir.kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
: Yukarıdakiyle aynı, ancak yeni cihazlara aktarılamaz.kSecAttrAccessibleWhenUnlocked
: Yalnızca cihaz kilidinin açık olduğu durumlarda erişilebilir.kSecAttrAccessibleWhenUnlockedThisDeviceOnly
: Kilidi açık olduğunda erişilebilir, yedeklemelere dahil edilmez.kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
: Cihaz parolası gerektirir, yedeklemelere dahil edilmez.
AccessControlFlags
, biyometrik kimlik doğrulama veya parola kullanımına izin vererek erişim yöntemlerini daha da geliştirir.
Jailbreakli Cihaz Uyarısı
Jailbreakli cihazlarda, Anahtar Zinciri'nin korumaları tehlikeye girer ve önemli bir güvenlik riski oluşturur.
Anahtar Zinciri Verilerinin Kalıcılığı
Uygulama kaldırıldığında uygulama özel verilerinin silinmesinin aksine, Anahtar Zinciri verileri cihazda kalıcıdır. Bu özellik, ikinci el bir cihazın yeni sahiplerinin uygulama verilerine önceki sahibin sadece uygulamaları yeniden yükleyerek erişmesine olanak tanıyabilir. Geliştiricilere, bu riski azaltmak için uygulama yükleme sırasında veya oturumu kapatma sırasında proaktif olarak Anahtar Zinciri verilerini temizlemeleri önerilir. İşte Anahtar Zinciri verilerini ilk uygulama başlatmasında nasıl temizleyeceğinizi gösteren bir Swift kodu örneği:
Uygulama Yetenekleri
Uygulama geliştirme alanında, sandboxing güvenliği artırmada önemli bir rol oynar. Bu süreç, her uygulamanın kendi benzersiz ana dizininde çalışmasını sağlayarak, sistem dosyalarına veya diğer uygulamalara ait verilere erişmesini engeller. Bu kısıtlamaların uygulanması, Trusted BSD (MAC) Mandatory Access Control Framework'ün bir parçası olan sandbox politikaları aracılığıyla gerçekleştirilir.
Geliştiriciler, uygulamaları için Veri Koruma veya Anahtar Zinciri Paylaşımı gibi belirli yetenekler veya izinler yapılandırma yeteneğine sahiptir. Bu izinler, uygulama yüklendikten hemen sonra uygulanır. Bununla birlikte, belirli korumalı kaynaklara erişmek için uygulamanın ilk denemede kullanıcıdan açık onay alması gerekmektedir. Bu, kullanıcılara izin isteği uyarısında sunulan amaç dizeleri veya kullanım açıklama dizeleri kullanılarak gerçekleştirilir.
Kaynak koduna erişimi olanlar için, Info.plist
dosyasında bulunan izinlerin doğrulanması şu adımlarla yapılabilir:
Xcode'da projeyi açma.
Info.plist
dosyasını bulma ve açma.Netlik için,
"Privacy -"
ile başlayan anahtarları/değerleri görüntüleme seçeneğiyle arama.
IPA dosyasıyla uğraşırken, aşağıdaki adımlar izlenebilir:
IPA dosyasını açma.
Payload/<uygulamaadı>.app/
içindekiInfo.plist
dosyasını bulma.İncelemeyi kolaylaştırmak için dosyayı XML formatına dönüştürme gerekiyorsa dönüştürme.
Örneğin, Info.plist
dosyasındaki amaç dizeleri şu şekilde olabilir:
Cihaz Yetenekleri
Bir uygulamanın Info.plist
dosyası, App Store'un cihaz uyumluluğuna göre uygulamaları filtrelemesine yardımcı olan cihaz yeteneklerini belirtir. Bunlar UIRequiredDeviceCapabilities
anahtarı altında tanımlanır. Örneğin:
Bu örnek, uygulamanın armv7 komut kümesiyle uyumlu olduğunu göstermektedir. Geliştiriciler, NFC'yi destekleyen cihazlara sadece uygulamanın erişilebilir olmasını sağlamak için nfc gibi yetenekleri de belirtebilirler.
Yetkilendirmeler
Yetkilendirmeler, iOS uygulama geliştirmede başka bir önemli unsurdur ve çalışma zamanı denetimlerinin ötesinde uygulamalara belirli işlemleri gerçekleştirme izni veren anahtar-değer çiftleri olarak hizmet eder. Örneğin, bir uygulamada Veri Koruma'yı etkinleştirmek, Xcode projesine belirli bir yetkilendirme eklemeyi gerektirir ve bu daha sonra uygulamanın yetkilendirme dosyasında veya IPAlar için gömülü mobil sağlama dosyasında yansıtılır.
Referanslar
Last updated