Merhaba arkadaşlar, iş yoğunluğundan dolayı bir şeyler karalamaya çok vakit bulamadım. Şu an için kısa bir vakit buldum ve sizlere bu yazımda IOS’un çalışma yapısını elimden geldiğince anlatmak istedim. Biliyoruz ki bir yapının güvenliğini sağlamak veya üzerinde çalışmak istiyorsak öncelikle yapının çalışma mantığını bilmek gereklidir. Şimdi ufaktan bazı kavramlara girelim:
Secure Boot Chain
Cihaz yazılımının başlatıldığı ve önyükleme sırasında IOS cihazlarına yüklendiği süreci açıklamak için kullanılan terimdir. Platformun güvenliği için ilk savunma katmanı olarak kabul edilir. Secure Boot Chain her adımında, Apple tarafından kriptografik olarak imzalanmış ilgili bileşenlerin her birinin değiştirilip değiştirilmediğini kontrol eder.
Bir IOS aygıtı açıldığında, işlemcinin içinde bulunan ve salt okunur bir bölüm olan önyükleme ROM’unu (Boot ROM) yürütür. Bu salt okunur bölüm cihaz üretilirken işlemci içerisine gömülür. Önyükleme ROM’u Secure Boot Chain bir sonraki adımı olan low-level booloader (LLB) ‘in bütünlüğünü doğrulamak için kullanılan Apple’in Root CA’sının public key’ini içerir.
LLB önyüklemeden önce iBoot gibi bir kaç rutin kurulum gerçekleştirir. LLB, iBoot image’nin imzasını doğrulayarak Secure Boot Chain’i devreye sokmaya çalışır ve imza beklenen değer ile eşleşmez ise cihaz kurtarma moduna geçer. İkinci aşama önyükleyici olan iBoot, IOS çekirdeğinin (kernel) doğrulanmasından ve işletim sisteminin yüklenmesinden sorumludur. Aşağıdaki ekran görüntüsü yapının kafanıza oluşmasına yardımcı olabilir.
Secure Enclave
Secure Enclave, fazladan bir güvenlik katmanı sağlamak amacıyla ana işlemciden ayrılmış, hardware-based bir anahtar yöneticisi içeren güvenli bir yardımcı işlemcidir. Bu işlemci, cihaz üzerindeki kriptografik işlemleri yani Data Protection API’ler (Veri Koruma API) ve Touch ID gibi kritik verilerin anahtar yönetimini yönetir. Enclave kendisini ana işlemciden ayırmak ve cihazın çekirdeği tehlikeye girse bile veri bütünlüğünü sağlamak için ARM TrustZone’un özelleştirilmiş bir sürümünü kullanır. Yani kısacası cihaz herhangi bir güvenliği ihlal eden bir hareket ile karşılaşırsa cihazdan parmak izi veya kriptografik verilerin çıkartılmasının zor olacağı anlamına gelir.
Code Sign
Burası IOS platformunun en önemli güvenlik kısımlarından biridir. Uygulamaların imzasının doğrulanarak yetkisiz uygulamaların cihaz üzerinde çalışmasını engelleyen bir runtime özelliktir.
Bir uygulamanın bir IOS cihazında çalışması için önce güvenilir bir sertifika ile imzalanması gereklidir. Geliştiriciler Apple tarafından imzalanmış bir ön hazırlık profili (Provisioning Profile) aracılığıyla bir cihaza güvenilir sertifika yükleyebilir. Provisioning Profili geliştiricinin uygulamalara yükleyebileceği embedded developer sertifikasını ve yetkiler kümesini içerir. Geliştirici tarafından hazırlanan uygulama store gönderilirken tüm kodun Apple tarafından imzalanması gereklidir. Bu süreç içerisinde uygulama içerisinde bulunan API ve fonksiyonlar Apple yetkilileri tarafından kontrol edilir. Eğer kod içerisinde risk olarak görülen bir yer bulunursa uygulama store yüklenmeyecektir.
Uygulamaların İzole Ortamda Çalıştırılması
Az çok Android ortamında çalışan arkadaşlar bilirler ki uygulamalar direkt işletim sistemi üzerinde değil sanal alan üzerinde çalışmaktadır. Aynı mantık IOS içinde geçerlidir. Tüm üçüncü parti uygulamaları, işletim sisteminden izole edilmiş sanal bir alanda çalışır. Buda örneğin zararlı yazılımların direkt olarak telefonu etkilemesinin büyük ölçüde önüne geçmektedir veya hasarını azaltmaktadır. Tüm uygulamalar varsayılan olarak mobil işletim sistemi kullanıcısı olarak çalışsa da her uygulama dosya sisteminde kendi benzersiz dizini içerisinde yer alır ve bu ayırma işlemi XNU Sandbox tarafından sağlanır. Seatbelt profile yani emniyet kemeri profili sanal alanda gerçekleştirilebilecek işlemleri yönetir. Üçüncü parti uygulamalarına genellikle sınırsız erişimi kısıtlayan container profile profili atanır. (Bu istisna olarak bazı uygulamalarda değişebilmektedir) IOS 7’den sonra bu profil geliştirildi ve bir uygulamanın medya, mikrofon ve kişi listesi gibi başka yerlere erişebilmesi için kullanıcıdan ilgili izinleri vermesi zorunluluğu getirildi. Bu şekilde yukarıda bahsettiğimiz Code Sign sürecini atlatan bir zararlı yazılım bu izinleri vermediğimiz taktirde kişilerimize veya fotoğraflarımıza erişim sağlayamayacak anlamına gelmektedir.(Siber güvenlik camiasında kesin bir şey yoktur, atlatılabilir)
Verilerin Şifrelenmesi
Varsayılan olarak IOS dosya sistemindeki tüm veriler ilk ön yüklemede oluşturulan ve NAND flash depolamasının 1. bloğunda saklanan dosya sistemi anahtarıyla block-based şifreleme (AES) kullanılarak şifrelenir. Cihaz, başlatma işlemi sırasında partion tablo ve sistem tablo şifresini çözmek için bu anahtarı kullanır. Dosya sistemi yalnızca beklemede şifrelenir, aygıt açıldığında ise hardware-based şifreleme hızlandırıcı (hardware-based crypto accelerator) dosya sisteminin kilidini açar. Eğer bu anahtar zarar görür veya silinirse dosya sistemi okunamaz hale gelir.
Donanım şifrelemesine ek olarak dosyalar cihaz parolasından türetilen bir anahtar kullanan Data Protection API kullanılarak da şifrelenebilir. Cihaz kilitlendiğinde Data Protection API’si ile şifrelenen verilere erişmek için şifrenin girilmesi gereklidir ve cihazın kilidi açıldığında içerik kullanılabilir duruma gelir. Tabi burada dikkat edilmesi gereken kısımlar var. Cihazın kilitlenmesinden dolayı bazı dosyalar kullanılamaz hale gelebilir ve bu arka planda çalışan süreçlerin düzgün çalışmamasına sebep olabilir.
Saldırılara Karşı Korunma Yöntemi
IOS, cihaza yönelik saldırıların önüne geçebilmek için bazı yöntemler/teknolojiler kullanmaktadır. Bu yöntemlerden en önemlisi bellek sayfalarının aynı anda hem yazılabilir hem de yürütülebilir olarak belirlenemeyeceğini belirten Write but not execute politikasını (W ^ X) uygular. Bu koruma mekanizması, ARM işlemcisinin Execute Never (XN) özelliğinden yararlanılarak uygulanır. Bu politikanın bir parçası olarak, yazılabilir olarak belirlenen çalıştırılabilir bellek sayfaları daha sonra yürütülebilir durumuna geri döndürülemez. Aslında bu yöntem yabancı değil Windows ve Linux gibi işletim sistemlerinde de karşımıza çıkan Data Execution Protection özelliğine benzer. Bu yöntem ise return-oriented programlama (ROP) kullanılarak atlatılabilmektedir.
Şimdilik çok fazla kafa karışılıklığına sebep olmamak adına yazımı burada sonlandırıyorum. Zaman bulursam bu yazıyı bir seri haline çevirmeyi düşünüyorum 🙂
Güvenli günler