iOS Uygulama Güvenliği
Apple, kötü amaçlı yazılımları App Store’dan uzak tutmada oldukça başarılı. Ancak başvuru inceleme süreci, geliştiriciler için sinir bozucu bir kara kutu olabilir. Uygulamaları gözden geçiren ekibin kullanılan süreçleri kamuya açık bir şekilde belgelenmemiştir ve bazen hangi işlevlere izin verilip verilmediği net değildir ve bu süreç kendi başına uygulamanızı korumaz. Bu nedenle her geliştiricinin kendi önlemlerini alması kritiktir.
Açıklardan yararlanmaları önlemek ve verileri korumak için iOS’un uyguladığı temel güvenlik bileşenlerine göz atalım.
Secure Boot
Bir iOS aygıtını açtığınızda, sistemi önyükleyen salt okunur önyükleme ROM’undan ilk yönergelerini okur. Apple’ın sertifika anahtarını da içeren Boot ROM, daha sonra düşük seviyeli önyükleyicinin (low-level bootloader) Apple tarafından imzalandığını doğrular ve başlatır. LLB birkaç temel görevi gerçekleştirir ve ardından ikinci aşama önyükleyici iBoot’u doğrular. iBoot başlatıldığında, cihaz kurtarma moduna geçebilir veya çekirdeği önyükleyebilir. iBoot, çekirdeğin Apple tarafından da imzalandığını doğruladıktan sonra, önyükleme işlemi başlar: sürücüler yüklenir, aygıtlar incelenir ve sistem arka plan programlarını başlatır.
Sandboxing
Dosya erişimi açısından, işlemler genellikle kendi uygulama paketi dizinleriyle sınırlıdır; sadece orada saklanan dosyaları okuyabilir ve yazabilirler.
Disk Encryption
Veriler bir saldırgan tarafından çalınabileceği için disk şifreleme yapılır. Sistemde kimlik doğrulaması yapabilen bir saldırgan, mevcut tüm dosyaları engellenmeden okuyabilir. Saldırgan, kimlik doğrulaması yapmadan bir cihazdan hassas verileri okumak isterse, doğrudan depolamayı okumak için cihazı tamamen parçalarına ayırması ve depolamayı özel bir arayüze bağlaması gerekir.
Keychain API
Bu API, şifreleme anahtarları ve hassas kullanıcı verileri gibi bilgileri diğer uygulamaların erişemeyeceği güvenli bir yerde saklamasına olanak tanır.
Data Protection API
Bu API, bir cihaz kilitlendiğinde verileri erişilemez hale getirmek için kullanılır.
ASLR, XN
iOS, saldırıları önlemeye yardımcı olmak için iki standart mekanizma uygular: adres alanı düzeni rastgeleleştirmesi (ASLR) ve XN ( eXecute Never). Başlangıçta her uygulama için atanan bellek bölgelerini rastgele ayarlar. Bu, bellek bozulması hatalarından yararlanma olasılığını çok daha düşük hale getirir. Ayrıca, kötü amaçlı kodların yürütülmesini durdurmak için Execute Never (XN) özelliğiyle bellek sayfaları yürütülemez olarak işaretlenir.
(XN, bir bellek sayfasının aynı anda hem yazılabilir hem de yürütülebilir olamayacağını zorunlu kılar.)
Jailbreak Detection
Kısaca iOS’un kod imzalama mekanizmalarını devre dışı bırakan ve bir cihazın doğrudan Apple tarafından onaylananlar dışındaki uygulamaları çalıştırmasına izin vermeyen bir prosedürdür ve bu kontrol, tersine mühendislik vb. araçları engeller ve birçok güvenlik açığının önlemesine yardımcı olur.
Diğer mobil işletim sistemlerinden farklı olarak, iOS, emulator yerine bir simülatör kullanır. Bu, sanallaştırılmış bir ARM ortamı gerektireceğinden, iOS aygıtının tam muadili olmadığı anlamına gelir.
Apple’ın Xcode’ u üzerinde simülatörler x64 mimarisi için derlenir ve geliştirme makinenizde yerel olarak çalışırlar, bu da süreci önemli ölçüde daha hızlı ve kolay hale getirir. Fakat, bazı özellikler gerçek bir cihazda olduğu gibi çalışmaz. (Kamera, SMS, hücresel, hafıza, büyük küçük harf duyarlılığı)
Diğer farkların tahmin edilebileceğinden harf duyarlılığını açıklamak isterim.OS X sistemleri büyük/küçük harfe duyarlı olmayan HFS+ dosya sistemleriyle çalışır, iOS ise büyük/küçük harfe duyarlı değişkeni kullanır. Bu çoğunlukla güvenlikle ilgili değildir, yalnızca çalışma sorunlarına neden olabilir.
Siber güvenlikte, statik analiz genellikle bir kod tabanını analiz etmek ve güvenlik kusurlarını belirlemek için araçların kullanılması anlamına gelir. Xcode 3.2'den başlayarak, clang’ın statik analizörü Xcode ile entegre gelmektedir. Kullanıcılara kodlama kusurlarını ve APInin kötüye kullanımını izlemek için bir UI sağlar. Son Xcode sürümleri Address Sanitizer ile birlikte gelmektedir ve bu araç önemli güvenlik açıklarınızı izlemeye yardımcı olur. Performansa kötü etkisi vardır, bu nedenle standart versiyon alımlarında etkisiz hale getirilmelidir.

Uygulama üzerinde kontrollerini sağlamanız gereken alanlardan bahsedelim.
Swift, code obfuscation yapmaz , yalnızca name mangling yapar. Yani saldırganlar sınıf ve fonskiyon isimlerine erişebilir. Swift sheild benzeri kütüphalelerle obfuscation yapabiliriz.
API keyleri, SSH keyleri vb. hassas bilgiler uygulama üzerinde tutulmamalıdırlar.
print fonksiyonu çoğu kişinin inandığı gibi, yalnızca Xcode konsoluna çıktı yazmaz. Amacı, Apple System Log (ASL)’a bir hata mesajı kaydetmektir. Sunucu tarafından alınan mesajlar bir veri deposuna kaydedilir. Bu API, istemcilerin sorgular oluşturmasına ve eşleşen mesajlar için mesaj veri deposunda arama yapmasına izin verir. Ve bu logları okumak için özel bir araca ihtiyacınız yoktur. Her ne kadar uygulamalar kendi günlüklerine ulaşabilir olsada loglama yaparken dikkat edilebilir ya da release alırken pasif duruma getirilebilir.
Clipboard, uygulamalar içinde veya arasında rastgele veri paylaşımı için esnek bir mekanizmadır. Bilgi sızıntısı riskini en aza indirmek için kısıtlı bir kullanım sağlanabilir.
iOS’ta önbellek yönetimi biraz karmaşıktır. Önbellek üzerinde birçok yapılandırma ayarı vardır. Bunun da ötesinde, iOS, kullanıcı deneyimini iyileştirmeye çalışmak için elde edebileceği her şeyi agresif bir şekilde önbelleğe almaya çalışır. Bu nedenle önbellek yönetimine dikkat etmeniz uygulama güvenliği açısından yararlı olacaktır.
Otomatik kelime tamamlama sisteminin basında dikkat çeken bir yönü, otomatik tamamlama mekanizmasının, bir kullanıcının yazdığı metnin bölümlerini, gelecekteki tamamlamalara yardımcı olmak için temelde bir düz metin dosyasına kaydederek, yanlışlıkla bir keylogger görevi görmesidir ve saldırgan daha sonra bu tamamlama veritabanını alabilir. Bu nedenle devre dışı olması tavsiye edilmektedir.
Cross-site scripting (XSS), web uygulamalarında en sık rastlanan bir saldırı şeklidir. Uygulamanız bir UIWebView kullanıyorsa, XSS güvenlik açığından kaçınmak için, sunucudan sağlanan veriyi almamaya ve bunları kullanıcı arayüzüne entegre etmeye özellikle dikkat edin. Ek olarak, veri çıkışlarında da encryption yapılmalıdır.
iOS 4.3'te Apple, adres alanı düzeni rastgeleleştirmesini (ASLR) tanıttı. İşlevinden daha önce bahsetmiştik. Ek olarak, ASLR’nin tam etkili olması için uygulamanın, derleyiciye bellekteki konumundan bağımsız olarak çalışabilen makine kodu oluşturma talimatı veren position-independent executable (PIE) olarak oluşturulması gerekir.
Kullanıcılar cihazlarının tam yedeklemesini yaparken güvenlikle ilgili iki seçeneğe sahiptir: Şifrelenmemiş ve Şifreli. Şifrelenmemiş yedeklemeler yalnızca alındıkları cihaza geri yüklenebilir. Şifreli yedeklemeler, kullanıcının yedek verilerini şifrelemek için bir parola seçmesine olanak tanır. Bu, yedeğin herhangi bir cihaza geri yüklenmesine izin verir (ThisDeviceOnly ile işaretlenmiş olanlar hariç) ve Anahtar Zincirinin tüm içeriğini de yedekler. Anahtarlık öğenizin yedeklerde saklanmasını istemiyorsanız Anahtar Zincirinin veri koruma özelliklerini kullanabilirsiniz.
Fingerprint ne kadar donanım üzerinde kontrol edilse de parmak izimizi her yere bıraktığımızdan ve fiziksel olarak kopyalanabileceğinden dolayı fingerprint’a ek olarak bir şifre koruması gerekli olabilir.
Son olarak bu ve benzeri araçlar ile anti-tampering işlemlerini zahmetsizce yapabiliriz.
Biraz da saldırgan rolünde yazımıza devam edelim.
Bir iOS uygulamasına etkin bir şekilde güvenlik testi yapmak için jailbreak yapılmış bir cihaz edinmeniz gerekir. Jailbreak konusu aktif olarak güncellendiğinden bu konuda araştırma yapmanız yararlı olacaktır.
Bir iOS uygulamasını test etmenin ilk adımı, onu bir proxy üzerinden çalıştırmaktır, böylece cihazdan remote endpointe giden trafiği inceleyebilir ve potansiyel olarak değiştirebilirsiniz.
iOS, sunucu sertifikasının kimliğini doğrulayamadığında TLS/SSL bağlantılarına devam etmeyi reddediyor. Proxy sertifikanızın kimliğini doğrulayamazsa, proxy tabanlı testiniz durur. Bu nedenle BurpSuite v.b. araçlar ile kullanarak TLS doğrulamasını atlatmamız gerekiyor.
Çoğu ağ iletişimi, bir istemci ve bir sunucu arasındaki HTTP protokolü üzerinden yapılır. Varsayılan olarak, HTTP bağlantıları şifrelenmez. Sistem sertifikası güven doğrulaması, sertifikanın(SSL) güvenilir bir sertifika tarafından imzalanıp imzalanmadığını kontrol eder. Saldırı yapabilmek için bu sertifika kontrollerini aşmak gerekir ve daha sonrasında istemci ve sunucu arasında gönderilen tüm mesajları okuyabiliriz. (man-in-the-middle)
Forensic amaçlar için fiziksel veya veri yedekleri üzerinde bu ve benzeri araçlarla inceleme yapılabilir.
Son olarak bilinen açıklara ve istismarlara linkten ulaşabilirsiniz.