Hoş geldiniz, Ziyaretçi
Kullanııcı Adı: Parola: Bilgilerim hatırlansın
  • Sayfa:
  • 1

KONU:

iOS Data Protection API 5 yıl 2 ay önce #210

Bir önceki yazıda iOS güvenlik özelliklerinden bahsetmiştim. Bu yazıda ise iOS Data Protection API kullanılarak dosya sisteminde ve Keychain adı verilen hassas verilerin saklandığı mekanizmada nasıl bir güvenlik inşa edilmiş bunlardan bahsetmeye çalışacağım.

iOS'daki Data Protection API sayesinde geliştiriciler dosya veya keychain elemanlarının hangilerinin hassas olduğunu ve hangi durumda erişilebilir olduğunu belirleyebiliyorlar. Örneğin bir dosya için "hassas ve sadece cihaz kilidi açıkken erişilebilir" olsun diyebiliyorlar. Bunu da kodlama esnasında hassas verileri "hassas veri class tipi"nde seçerek yapıyorlar.

img_0004-2.jpg
Data protection API'de 2 önemli etmen vardır. Bunlardan birincisi herbir iOS cihazına özel UID numarası, diğeri de kullanıcının girdiği cihaz parolasıdır. Kabaca bahsetmek gerekirse;
Dosyaların şifrelenmesi için kullanılan ve her dosya için farklı olarak üretilen File Key'ler vardır. File Key'ler, Class Key'ler tarafından şifrelenerek her dosyanın metadata bölümünde saklanmaktadır. Class key'ler de, UID ve bazı durumlarda (protection class'ın türüne bağlı olarak) kullanıcının parolası kullanılarak üretilen bir anahtar ile korunmaktadır.

Dosya sistemi File System Key adı verilen bir anahtar ile şifrelenmektedir. File System Key ise UID ile üretilen rastgele bir anahtardır. Bu anahtar, işletim sistemi ilk kurulduğunda veya cihaz komple sıfırlandığında üretilmektedir.Bu File System Key'in silinmesi durumunda tüm dosya sistemi erişlemez hale gelmektedir. iOS cihazlar sıfırlandığında yapılan işlem de aslında File System Key'in silinmesi ve geçmiş verilen bu sayede erişelemez hale gelmesidir.

Data Protection API'ye gelecek olursak elimizde en temelde 3 adet anahtar olduğunu söyleyebiliriz: File System Key, Class Key ve File Key.
ios_key.png
Dosya Sistemi Koruma Sınıfları (Protection Class):
iOS işletim sisteminde bir dosya oluşturulduğu zaman, bu dosyayı oluşturan uygulama o dosyayı bir koruma sınıfı (protection class) ile ilişkilendirmekte ve bu ilişki o dosyanın hangi durumlarda erişilebilir olduğunu belirlemektedir

Dosyanın NSFileProtectionComplete sınıfı ile ilişkilendirilmesi durumunda dosyanın erişilebilir olması için kullanıcının parolasını girmesi gerekmektedir. Çünkü bu durumda dosyanın şifrelemesi için kullanılan File Key'i şifreyen Class Key oluşturulurken, UID ve kullanıcı parolası birlikte kullanılmış olacaktır. NSFileProtectionComplete sınıfı ile korunan bir dosya, cihaz kilitlendiği zaman erişilemez hale gelecektir. Çünkü File Key'in çözülmesi için kullanılacak ve belleğe alınan Class Key, bellekten silinecektir.

Dosyanın NSFileProtectionCompleteUntilFirstUserAuthentication sınıfı ile ilişkilendirilmesi durumunda ise kullanıcının parolayı girip cihaz kilidini açması ile birlikte erişilebilirlik başlayacaktır. Burada farklı olarak cihaz tekrar kilitlense dahi dosya erişilebilir durumda olacaktır. Çünkü dosyanın şifrelenmesi için kullanılan File Key'in çözülmesi için gerekli Class Key bellekten silinmeyecektir. Bu durum, bilgisayarlardaki disk şifrelemeye benzer bir şekildedir. Bilgisayar yeniden başlatılana kadar içerisindeki veriler nasıl erişilebiliyor ise NSFileProtectionCompleteUntilFirstUserAuthentication sınıfı ile korunan dosyalar da cihaz yeniden başlatılana kadar erişilebilir olacaktır.

Eğer dosyamız NSFileProtectionNone koruma sınıfı ile ilişkilendirilmişse bu durumda Class Key, sadece UID değerinden üretilecektir. Kullanıcıdan alınan parola, şifre çözme işleminde rol almayacağı için cihaz kilidinin açık olup olmaması dosyaya erişim için bir kısıt getirmeyecektir.

Burada önemli noktalardan biri UID numarasının direkt olarak erişilip görülebilen bir numara olmamasıdır. UID için sadece şifreleme ve şifre çözme işlemleri sırasında girdi verilip çıktı alınıyor gibi düşünülebilir. UID'nin cihaz dışına çıkartılamadığı ve direkt olarak erişilemediği göz önüne alındığında kullanıcının parolası bilinse dahi cihaz dışında herhangi bir şifre çözme işleminin gerçekleştirilemeyeceği anlaşılabilir.
Keychain Koruma Sınıfları (Protection Class):
keychain.png
Keychain erişimleri de dosya sistemi erişimlerine benzer bir yapıda tanımlanmıştır.

Cihaz kilidi açıldığında Keychain'e erişim sağlanabilmesi için keychain elemanının kSecAttrAccessibleWhenUnlocked sınıf tipinde tanımlanması gerekmektedir. Dosya sistemindeki NSFileProtectionComplete ile aynı anlamdadır. Cihaz kilidi bir kere açıldıktan sonra erişimin sürekli kalması için ise Keychain elemanının kSecAttrAccessibleAfterFirstUnlock sınıf tipinde tanımlanması gerekmektedir. Her durumda erişilebilir olması için ise kSecAttrAccessibleAlways sınıf tipinde tanımlanmalıdır. Bu tipler aşağıdaki tabloda görülebilmektedir.
tablo.png
Keychain korumalarının her biri için ayırca ThisDeviceOnly ekinin geldiği sınıflar da bulunmaktadır. Bu durumda Keychain elemanları UID değerinden elde edilen bir anahtar ile şifrelenmektedir. Bu durumda Keychain, cihaz dışına çıkartıldığında Keychain elemanları şifreli olarak kalmakta ve erişilemez olmaktadır. Hangi Keychain elemanının hangi sınıf tipinde olduğu sqlite veritabanında bir kolon içerisinde kısatlmalı olarak ifade edilmektedir.
tablo2.png

Lütfen sohbete katılmak için Giriş ya da Hesap açın.

  • Sayfa:
  • 1
Sayfa oluşturma süresi: 0.200 saniye

NDK Hoş Geldin

Ders Kafe Anketi

Uzaktan Eğitim sistemini hangi cihazlardan takip ediyorsunuz?

loader
Bu anket sona erdi Oca 04 2021 at 08:00 PM
Tüm anketleri görüntüleyin