iOS Basics
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
iOS'ta, kullanıcı erişimine açık uygulamalar ile sistemin temel süreçleri arasında bir ayrıcalık ayrımı vardır. Uygulamalar mobile
kullanıcı kimliği altında çalışırken, kritik sistem süreçleri root
olarak çalışır. Bu ayrım, uygulamaların gerçekleştirebileceği eylemler üzerinde katı sınırlamalar getiren bir sandbox mekanizması ile güçlendirilmiştir. Örneğin, uygulamalar aynı kullanıcı kimliğini paylaşsalar bile, birbirlerinin verilerine erişmeleri veya bunları değiştirmeleri yasaktır.
Uygulamalar belirli bir dizine (private/var/mobile/Applications/{random ID}
) yüklenir ve SMS ve telefon görüşmeleri gibi belirli sistem alanlarına ve işlevlerine sınırlı okuma erişimine sahiptir. Korunan alanlara erişim, kullanıcı izni için bir pop-up isteği tetikler.
iOS, geliştiricilere Veri Koruma API'leri sunar; bu API'ler, kriptografik işlemler ve anahtar yönetimi için özel bir yardımcı işlemci olan Secure Enclave Processor (SEP) üzerine inşa edilmiştir. SEP, içinde yer alan cihaz UID'si ile birlikte, cihaz koruma bütünlüğünü sağlar.
Dosya oluşturulduğunda, dosyanın içeriğini şifreleyen benzersiz bir 256-bit AES şifreleme anahtarı üretilir. Bu şifreleme anahtarı, bir sınıf kimliği ile birlikte, bir sınıf anahtarı kullanılarak şifrelenir ve dosyanın meta verileri içinde saklanır. Bir dosyayı şifre çözmek, sistemin anahtarını kullanarak meta verilere erişmeyi, sınıf kimliği ile sınıf anahtarını almayı ve ardından dosyanın benzersiz şifreleme anahtarını çözmeyi içerir.
iOS, veri güvenliği için dört koruma sınıfı tanımlar; bu sınıflar, verilerin ne zaman ve nasıl erişilebileceğini belirler:
Tam Koruma (NSFileProtectionComplete): Veri, cihaz kullanıcının şifresi ile kilidi açılana kadar erişilemez.
Açık Olmadıkça Koruma (NSFileProtectionCompleteUnlessOpen): Cihaz kilitli olsa bile, dosya açıldığında erişime izin verir.
İlk Kullanıcı Kimlik Doğrulamasına Kadar Koruma (NSFileProtectionCompleteUntilFirstUserAuthentication): Veri, cihazın ilk açılışından sonra erişilebilir, cihaz tekrar kilitlense bile erişim devam eder.
Koruma Yok (NSFileProtectionNone): Veri yalnızca cihaz UID'si ile korunur, hızlı uzaktan veri silmeyi kolaylaştırır.
NSFileProtectionNone
dışındaki tüm sınıfların şifrelemesi, hem cihaz UID'sinden hem de kullanıcının şifresinden türetilen bir anahtar içerir; bu, şifre çözmenin yalnızca doğru şifreye sahip cihazda mümkün olmasını sağlar. iOS 7'den itibaren, varsayılan koruma sınıfı "İlk Kullanıcı Kimlik Doğrulamasına Kadar Koruma"dır.
Geliştiriciler, bir iPhone'daki dosyaların veri koruma sınıfını incelemek için FileDP adlı aracı kullanabilirler.
iOS'ta, bir Anahtar Zinciri, yalnızca onu depolayan uygulama veya açıkça yetkilendirilmiş olanlar tarafından erişilebilen hassas bilgileri depolamak için güvenli bir şifreli konteyner olarak hizmet eder. Bu şifreleme, iOS tarafından üretilen benzersiz bir şifre ile güçlendirilmiştir ve bu şifre AES ile şifrelenmiştir. Bu şifreleme süreci, kullanıcının şifresini bir cihazın UID'sinden türetilen bir tuz ile birleştiren bir PBKDF2 fonksiyonu kullanır; bu bileşen yalnızca güvenli enclave yongası tarafından erişilebilir. Sonuç olarak, kullanıcının şifresi bilinse bile, Anahtar Zinciri içeriği yalnızca orijinal olarak şifrelendiği cihaz dışında herhangi bir cihazda erişilemez durumda kalır.
Anahtar Zinciri verilerine yönetim ve erişim, Keychain-access-groups
ve application-identifier
gibi belirli uygulama yetkilerine dayanan securityd
daemon tarafından yönetilmektedir.
Anahtar Zinciri API'si, Apple'ın Anahtar Zinciri Hizmetleri belgelerinde detaylandırılmıştır ve güvenli depolama yönetimi için temel işlevler sunar:
SecItemAdd
: Anahtar Zincirine yeni bir öğe ekler.
SecItemUpdate
: Anahtar Zincirindeki mevcut bir öğeyi günceller.
SecItemCopyMatching
: Anahtar Zincirinden bir öğe alır.
SecItemDelete
: Anahtar Zincirinden bir öğeyi kaldırır.
Anahtar Zinciri şifresini zorlamak, ya şifrelenmiş anahtara doğrudan saldırmayı ya da cihazda şifreyi tahmin etmeyi içerir; bu, güvenli enclave'in başarısız denemeler arasında bir gecikme uygulamasıyla önemli ölçüde engellenir.
Anahtar Zinciri öğeleri için veri koruma seviyeleri, öğe oluşturma veya güncelleme sırasında kSecAttrAccessible
niteliği kullanılarak ayarlanır. Bu seviyeler, Apple tarafından belirtilen Anahtar Zinciri öğelerinin ne zaman ve nasıl erişilebilir olduğunu belirler:
kSecAttrAccessibleAlways
: Cihaz kilit durumu ne olursa olsun her zaman erişilebilir.
kSecAttrAccessibleAlwaysThisDeviceOnly
: Her zaman erişilebilir, ancak yedeklemelere dahil edilmez.
kSecAttrAccessibleAfterFirstUnlock
: Yeniden başlatmadan sonra ilk açılışta erişilebilir.
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
: Yukarıdakiyle aynı, ancak yeni cihazlara aktarılmaz.
kSecAttrAccessibleWhenUnlocked
: Cihaz açıkken yalnızca erişilebilir.
kSecAttrAccessibleWhenUnlockedThisDeviceOnly
: Açıkken erişilebilir, yedeklemelere dahil edilmez.
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
: Cihaz şifresi gerektirir, yedeklemelere dahil edilmez.
AccessControlFlags
erişim yöntemlerini daha da rafine eder, biyometrik kimlik doğrulama veya şifre kullanımı sağlar.
Jailbroken cihazlarda, Anahtar Zinciri'nin korumaları tehlikeye girer ve önemli bir güvenlik riski oluşturur.
Uygulama kaldırıldığında silinen uygulama özel verilerinin aksine, Anahtar Zinciri verileri cihazda kalır. Bu özellik, ikinci el bir cihazın yeni sahiplerinin, uygulamaları yeniden yükleyerek önceki sahibin uygulama verilerine erişim sağlamasına olanak tanıyabilir. Geliştiricilerin, bu riski azaltmak için uygulama kurulumu sırasında veya çıkış yaparken Anahtar Zinciri verilerini proaktif olarak temizlemeleri önerilir. İşte ilk uygulama açılışında Anahtar Zinciri verilerini temizlemeyi gösteren bir Swift kod örneği:
Uygulama geliştirme alanında, sandboxing güvenliği artırmada kritik bir rol oynamaktadır. Bu süreç, her uygulamanın kendi benzersiz ana dizininde çalışmasını sağlar ve böylece sistem dosyalarına veya diğer uygulamalara ait verilere erişimini 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 Data Protection veya Keychain Sharing gibi belirli yetenekler veya izinler yapılandırma yeteneğine sahiptir. Bu izinler, uygulama yüklendikten hemen sonra uygulanır. Ancak, belirli korunan kaynaklara erişim için uygulamanın, ilk deneme sırasında kullanıcıdan açık onay alması gerekmektedir. Bu, kullanıcılara bir izin talep uyarısında sunulan amaç dizeleri veya kullanım açıklama dizeleri aracılığıyla gerçekleştirilir.
Kaynak koduna erişimi olanlar için, Info.plist
dosyasındaki izinlerin doğrulanması şu şekilde yapılabilir:
Projeyi Xcode'da açın.
Info.plist
dosyasını bulun ve açın.
Açıklık için "Privacy -"
ile başlayan anahtarları arayın ve ham anahtar/değerleri görüntüleme seçeneğini kullanın.
Bir IPA dosyası ile çalışırken, aşağıdaki adımlar izlenebilir:
IPA dosyasını açın.
Payload/<appname>.app/
içinde Info.plist
dosyasını bulun.
Gerekirse, dosyayı daha kolay inceleme için XML formatına dönüştürün.
Örneğin, Info.plist
dosyasındaki amaç dizeleri şu şekilde görünebilir:
Bir uygulamanın Info.plist
dosyası, App Store'un uygulamaları cihaz uyumluluğu için filtrelemesine yardımcı olan cihaz yeteneklerini belirtir. Bunlar UIRequiredDeviceCapabilities
anahtarı altında tanımlanır. Örneğin:
Bu örnek, uygulamanın armv7 talimat seti ile uyumlu olduğunu göstermektedir. Geliştiriciler, uygulamalarının yalnızca NFC'yi destekleyen cihazlarda kullanılabilir olmasını sağlamak için nfc gibi yetenekleri de belirtebilirler.
Yetkiler, iOS uygulama geliştirmesinin bir diğer kritik yönüdür ve uygulamalara çalışma zamanı kontrollerinin ötesinde belirli işlemleri gerçekleştirme izni veren anahtar-değer çiftleri olarak hizmet eder. Örneğin, bir uygulamada Veri Korumasını etkinleştirmek, Xcode projesine belirli bir yetki eklemeyi içerir; bu, uygulamanın yetki dosyasında veya IPA'lar için gömülü mobil sağlama dosyasında yansıtılır.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)