iOS Basics

AWS hacklemeyi sıfırdan kahraman olmak için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)öğrenin!

HackTricks'ı desteklemenin diğer yolları:

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.

# 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 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:

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 ö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:

  1. Xcode'da projeyi açma.

  2. Info.plist dosyasını bulma ve açma.

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

  1. IPA dosyasını açma.

  2. Payload/<uygulamaadı>.app/ içindeki Info.plist dosyasını bulma.

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

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

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:

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

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

AWS hacklemeyi sıfırdan kahraman olmak için öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'i desteklemenin diğer yolları:

Last updated