iOS Basics

Support HackTricks

Ayrıcalık Ayrımı ve Sandbox

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.

Veri Koruma

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.

# Example code to use FileDP for checking file protection class
# Note: Ensure your device is jailbroken and has Python installed to use FileDP.
# Installation and usage of FileDP:
git clone https://github.com/abjurato/FileDp-Source
cd FileDp-Source
python filedp.py /path/to/check

Anahtar Zinciri

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 İşlemleri

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 Öğesi Veri Koruma Yapılandırması

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 Cihazlar Uyarısı

Jailbroken cihazlarda, Anahtar Zinciri'nin korumaları tehlikeye girer ve önemli bir güvenlik riski oluşturur.

Anahtar Zinciri Verilerinin Sürekliliği

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:

let userDefaults = UserDefaults.standard

if userDefaults.bool(forKey: "hasRunBefore") == false {
// Remove Keychain items here

// Update the flag indicator
userDefaults.set(true, forKey: "hasRunBefore")
userDefaults.synchronize() // Forces the app to update UserDefaults
}

Uygulama Yetenekleri

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:

  1. Projeyi Xcode'da açın.

  2. Info.plist dosyasını bulun ve açın.

  3. 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:

  1. IPA dosyasını açın.

  2. Payload/<appname>.app/ içinde Info.plist dosyasını bulun.

  3. 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:

<plist version="1.0">
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Your location is used to provide turn-by-turn directions to your destination.</string>

Device Capabilities

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:

<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>

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

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.

Referanslar

Support HackTricks

Last updated