iOS Tabanlı Mobil Uygulama Güvenlik Testleri – II

iOS ortamlardaki uygulamalara yönelik sızma testleri ile ilgili ikinci makalemizde sunucu tarafı testlerinden ziyade mobil uygulama clientı üzerindeki testlere değinilecektir. Konuyla ilgili ilk makaleye buradan erişebilirsiniz.
İlk olarak mobil cihazlar üzerinde tutulan veya uygulamalar aracılığı kullanılan, mahremiyet açısından sıkıntılara sebep olabilecek hassas bilgilerin olup olmadığı tespit edilebilir. Ve bunlar çeşitli risk seviyesinde raporlanabilir. Örneğin UDID(Uniq  device idendifier) üzerinden bir örnek verilecek olursa; herhangi bir uygulama tarafından her cihaza ait uniq değer olan UDID
değerleri ele geçirilerek bu cihazların mevcut coğrafi konumları takip
edilebilir. 

Bu durum büyük bir privacy concern(mahremiyet gizliliği) sorununa sebep olacaktır. Geçmiş yıllarda sosyal oyun oynama ağı olan openfient dünya üzerinde milyonlarca
cihaza ait UDID bilgisini alarak bunu kötüye kullandığı ortaya çıkmıştır. İlgili durum ile saldırganlar elde ettikleri UDID’lere karşılık gelen gerçek kişi kimliklerini (facebook,eposta vs.) belirleyip bunları internetten paylaştılar.  Bu da büyük bir mahrumiyet ihlali ile sonuçlandı.  İlgili durumdan korunmak için belki UDID Faker uygulaması işe yarıyabilir, bu uygulama ile UDID değer kalıcı olmasa da geçici olarak spoof edilebilir. 

Bu açıdan bakıldığında uygulamaya yönelik tanımlayıcı değerlerin cihazı değil sadece kurulu o uygulamayı tanımlayacak olmasında fayda var. UDID’den ayrı olarak uygulamalar kullanıcıların kimliklerini belirleyen yaş,isim,adres,lokasyon gibi bilgileri 3. parti analiz uygulamalarına gönderebilir veya loglarında tutarak bu loglara erişim sağlayan uygulamaların erişimine açık bırakabilir. Bu sebeple uygulama testinde mevcut trafik iyi analiz edilmeli loglanan bilgilerde de hassas veri araştırılabilir. İlgili durumlar uygulama kurulumu esnasında detaylı olarak kullanıcıya bildirilmeden yapılması durumunda hak mahrumiyetlerine sebibiyet verecektir ve ilgili durumlara pentest raporlarında yer verilebilir.
İkinci bir önemli husus ise mobil uygulamalar üzerinde çeşitli kimlik bilgileri,kredi kartı bilgisi vs. gibi hassas verilerin hiç bir maskeleme yöntemi kullanılmadan açık olarak tutulması. Geliştiriciler, genellikle mobil uygulamaların daha performanslı çalışması amacıyla veya sürekli erişim ihtiyacı olan temel bilgilere kolay erişim için bu tarz kritik bilgileri çoğu zaman local mobil cihaz üzerinde tutarlar. Bu gibi durumlarda mobil cihazların fiziksel olarak çalınmasıyla ciddi riskleri beraberinde getirecegi aşikar.  BGA olarak gerçekleştirdiğimiz mobil uygulama testlerinde uygulamaların ortalama %80’nin  kullanıcı bilgileri gibi hassas verileri mobil cihazlarda tuttugu görülmüştür. Çoğunluğu ise bu hassas bilgileri açık olarak tutmaktadır.
Cihazlarda tutulan hassas veriler saldırganlar tarafından çeşitli yollar kullanılarak elde edilebilir;
1. Backup dosyalarından ; Bir iphone cihaz bilgisayardaki itunne ‘a bağlandığı zaman itune otomatik olarak mobil uygulamanın tüm yedeğini alır. Saldırganlar bu yedeklerin bulunduğu bilgisayarları ele geçirmesi durumunda doğrudan bu verilerede erişecektir.
2. Cihaza fiziksel erişim; mobil aygıtlar kaybedilerek veya çaldırılarak saldırganların eline geçebilir ve bu şekilde fiziksel erişim elde eden saldırgan ilgili cihazlara saldırı gerçekleştirebilir ve hassas verileri ele geçirebilir.Parola korumasıda bir güvenlik onlemi olmayacaktır. Çogu basit olan mobile uygulama parolası çok süre almadan kırılabilir.
3.Zararlı Yazılım ; IOS’de çıkabilecek bir güvenlik açıklığını kullanan saldırgan bir malware bulaştırarak cihazdaki dosyaları ele geçirebilir.
Iphone Uygulama Dizin Yapısı;
IOS’de uygulamalar bir dizin içerisindeki bir paketi temsil ettiği kabul edilir. Paket, tüm uygulama kaynaklarını, binary’leri ve ilişkili tüm dosyaları bu şekilde gruplar. Iphone cihazlarda uygulamalar mobile kullanıcı hakları ile sandbox veya seatbelt adı verilen hapsedilmiş bir ortamda çalıştırılırlar. 
iOS uygulamaları bir kullanıcı ile çalıştırıldığından dolayı Android UID ayrımından farklıdır.  Apple sandbox’ların çeşitli kaynaklara (network, hardware reseource. vs. vs.) erişim limitlerini kontrol eden güzel bir çözüm olduğunu söylemekte. Böylece her uygulama kendi sandbox’ının içeriğine erişebilir, diğer uygulamaların sandbox’larına erişemez. Bir uygulama iphone cihaza ilk kez kurulduğunda bu uygulama için sistem bir home dizini, bazı anahtar alt dizinler ve güvenlik ayrıcalıklarını ilgili uygulama sandbox’ı için oluşturur. Her sandbox yetkisiz ortamlara erişimleri kısıtlanmıştır. Fakat her ne kadar Apple bu durumun çok güvenli olduğunu söylesede Iphone cihazlarda jailbreakin işlemi yapıldığınd bu koruma (sandbox koruması) devre dışı bırakılmış olunuyor. 
Bir uygulama iphone cihaza kurulduğu zaman, bu uygulama için /var/mobile/Applications dizininde uniq bir kimlik değeri ile bir dizin oluşturulur ve tüm uygulama dosyaları bu alt dizinlerde tutulur. Buradaki kimlik değerini bulmak zor olabilmektedir. Bunun için uygulamanın kurulduğu tarihi bakmak faydalı olacaktır. Bunun için ls -lah komutu ile tarihten kimlik değeri bulunup bu dizine girilebilir. 
Bir uygulamanın çalışması için gerekli tüm dosaylar bu dizin altındadır.
Genel Iphone uygulama dizin yapısı aşağıdaki gibidir;
  • Appname.app ; Uygulama kodu ve statik verinin tutulduğu alt dizin
  • Documents; Itunes aracılığı ile desktop ile paylaşılabilen veri.
  • Library; Uygulama destek dosyaları, kütüphaneler
  • Library/Preferences ; Uygulamaya özel ayarlar
  • Library/Caches; Yedeklenmesine gerek olmayan, geçici cachelenmiş data
  • tmp ; Geçici dosyalar
Iphonelarda uygulamalar verileri aşağıdaki herhangi birinde tutabilir;
  • Plist  dosyalarında
  • XML dosyalarında
  • Keychain
  • Uygulama home dizini
  • Cache
  • Loglarda
Plist(property list) binary olarak formatlanmış bir dosya yapısındadır. IOS paket uygulamasının çalıştırılması için temel konfigrasyon ve iç içe gemiş anahtar değerleri tutar. Plist dosyaları bir uygulamanın konfigrasyon bilgisi ve kullanıcı özelliklerinin store edilmesi için de kullanılır. 
Örneğin oyun uygulamaları genellikle seviye(level) bilgilerini ve score bilgilerini plist dosyalarında tutarlar. Genellikle uygulamalar plist dosyalarını [Application’s Home Directory]/documents/preferences dizininde tutarlar.
Plist dosyaları ya XML formatında yada binary formattadır. XML dosyaları veri tutma için en etkili araç olmamaları itibariyle, çoğu uygulama veri tutma için plist dosyalarını kullanır. Fakat yapılan testlerde XML dosyalarındada ilgili verilerin tutulduğu uygulamalar sıklıkla rastlanılmakta. 
Plist dosyalarında tutulan binary biçimlendirilmiş veri plist editörleri ile kolaylıkla görüntülenip değiştirilebilir. plutil iyi bir plist editör aracıdır. Plist editorleri binary datayı XML’e dönüştürür ve daha sonra kolaylıkla düzenlememizi sağlar. Plist dosyaları temelde user preferences ve uygulama konfigrasyonlarının tutulması amaçlı kullanılır , ancak bir çok uygulama cleartext olarak kullanıcı adı ve parola bilgisini tutma veya o anki oturumla ilişkili çeşitli bilgiler tutmak için kullanmaktadırlar. 
Pentester olarak uygulamanın home dizini altındaki tüm plist dosyaları incelenmelidir ve hassas bilgi (kullanıcı adı , parola , kullanıcı kişisel bilgileri, cookie v.s) aranmalıdır. Developerlar bu plist dosyalarına herhangi bir uzantı atayabilmektedir. Bir plist dosyası cat komutu ile içeriğine bakılarak kolaylıkla tespit edilebilir. Plist dosyaları herzaman bplist ile başlar. Hassas dosyaların store edilmesiyle birlikte, uygulamalar kimlik doğrulama ve yetkilendirmeleri plist dosyalarında tuttukları değerlerle karar verebilmektedirler. Meselar plist dosyaları incelenirken admin=0 gibi bir plist girdisi ile karşılaşırsak bunu admin=1 yapıp uygulamayı çalıştırdığımızda eğer uygulama yetkilendirme için kullanıcı girdilerini düzenli kontrol etmiyorsa ve plist kayıtlarını baz alıyorsa yetkilendirmede uygulamada admin olunabilir. 
En iyi uygulama geliştirme yöntemi plist dosyalarında hiç bir hassas bilgi tutmamaktır. Birde yetkilendirme ve kimlik doğrulama için plist dosyalarında tutulan değerlere göre karar verilmemelidir. Plist dosyaları kullanıcı kontrollü girdileri içerir, bu sepeble tüm diğer kullanıcı girdileri gibi bunlarda düzgünce kontrol edilmelidir. Wordpres mobil uygulaması cleartext olarak kullanıcı adı ve parolayı plist dosyalarında tutmaktaydı yakın zamanda ilgili açığın SANS tarafından bildirilmesi ile acilen kapatıldı.
Plutil ile TestIpadMobileApp isimli uygulamaya ait bir plist dosyası okunması için aşağıdaki dizine girilerek ilgili plist dosyası benzer şekilde kullanılabilir.
Celal-Erdiks-iPad:/var/mobile/Applications/6E58BE6B-B5F0-4A71-BF3E-7F0AA43E380F/Library/Preferences root# plutil com.gittigidiyor.TestIpadMobileApp.plist
Plist dosyaları jailbreaking yapılmış ve yapılmamış tüm cihazlarda görüntülenebilir. Jailbreak yapılmamış bir cihaz üzerinde plist dosyaları iExplorer(Iphone Explorer) ve iBackupBot gibi uygulamalar kullanılarak görüntülenip değiştirilebilirler. iExplorer disk modunda iphone cihazına erişim verir ve iphone daki tüm dosyalar doğrudan görüntüleyebiliriz. iExplorer ücretli bir uygulamadır. MAC cihazımıza bu uygulama kurulduktan sonra ipad,iphone cihazımız USB aracılığı ile bağlandığında doğrudan görsel olarak cihazdaki tüm uygulamalara erişilebilir.
Bir iphone cihaz bilgisayara bağlanır bağlanmaz itunes onun yedeğin alır. iBackupBot ise itunes yedeklerine bağlanıp buradaki plist dosyalarını düzenlememizi sağlar.
Jailbreak yapılmış bir cihaz üzerinde plutil veya iFile araçlarının her ikisi ile de plist dosyaları görüntülenip değiştirilebilir. Indirmek için cydia kullanılabilir. iFile doğrudan iphone üzerinde plist dosyalarını düzenlememize olanak sağlar.
Plutil ile herhangi bir plist dosyasında değişiklik yapma;
Örnek bir plist dosyası;

Celal-Erdiks-iPad:/var/mobile/Applications/2AA330B0-5B7B-4345-93E4-9FE3E3645F2D/Library/Preferences root# plutil com.excelheritagegroup.voyager.plist {     CBSessionCountKey = 50;     CBWebImageCacheCachedImages =     {         0a4547aacacfdf65d134c2e6cacb06c25147ae01 = 0a4547aacacfdf65d134c2e6cacb06c25147ae01;         0f1a6841cfc37d116e7a0eebdc8468cb3a9eff78 = 0f1a6841cfc37d116e7a0eebdc8468cb3a9eff78;         1772c002b7bdcb7eca1f034d097d323e869fb0eb = 1772c002b7bdcb7eca1f034d097d323e869fb0eb;
Buradaki CBSessionCountKey değerini 60 yapalım, bunun için aşağıdaki komut kullanılabilir.  
plutil -key CBSessionCountKey -value 60 com.excelheritagegroup.voyager.plist
Son hali aşağkdaki gibi olacaktır;
Celal-Erdiks-iPad:/var/mobile/Applications/2AA330B0-5B7B-4345-93E4-9FE3E3645F2D/Library/Preferences root# plutil com.excelheritagegroup.voyager.plist {     CBSessionCountKey = 60;
 
 
Bir plist dosyasını xml’e dönüştürmek için;
plutil -convert xml1 com.testapp.testcorpIPad.plist
Daha sonra bu xml üzerinde gerekli değişiklikler yapılarak tekrar plist formatına dönüştürülebilir.
plutil -convert binary1 com.testapp.testcorpIPad.plist
IOS cihaz üzerinde kurulu bir programın pathini bulmak için;
Celal-Erdiks-iPad:/User root# find /User/Applications/ -iname testappname 
şeklinde bir kullanım ile arama yapılabilir.
Testlerden önce BigBoss recommended tools cydia üzerinden kurulmasında fayda var. Otool başta olmak plutil,dd,grep gibi çeşitli araçlar otomatik kurulacaktır.
Testlerde statik analiz, uygulamanın kurulu olduğu path’e geçip buranın incelenmesidir. Iphone ios uygulamalarda statik analiz ve testler için iNalyzer aracı kullanılabilir. Bu uygulama ios uygulamaların class dosyalarını görüntülememizi ve çalışma zamanlı analiz yapmamıza ve daha bir çok test eylemi gerçekleştirmemize imkan sağlamaktadır. İlgili uygulamanın kurulması için öncelikle cydia üzerinden ilgili uygulamanın geliştiricisinin repository’si sisteme tanıtılmalıdır. Bunun için jailbreak yapılmış ios cihaz üzerinde cydia üzerinden manage bölümünden http://appsec-labs.com/cydia/ adres girilir. Ardından search bölümünden iNalyzer şeklinde aratılarak ilgili uygulama kurulabilir.
/Users/Applications/Appname.app dizini altında uygulamanın tüm içeriği bulunmaktadır. Buradaki dosyalar kullanılarak uygulama çalışmaktadır. Bu dizin altındaki tüm diğer dizinler (Documents,tmp ve Library) ve alt dizinler altındaki tüm dosyalar incelenmelidir.
  • sqlite veritabanı dosyaları
  • property list (plist) dosyaları
  • cache dosyası
  • ayarlar ve program verileri 
detaylı incelenmelidir.
Buralarda çeşitli hassas bilgiler(kredi kart no, özel mesajlaşmalar, kulalnıcı hesapları v.s) araştırılabilir. Daha önce belirttiğimiz üzere plist dosyalarını incelemek için plutil aracı,binary dosyaları okumak için otool aracı kullanılabilir.
Goatdroid gömülü jetty ve derby databaselerine sahip üzerinde çeşitli güvenlik açıklıkarını barındıran bir android mobile uygulama test ve geliştirme ortamıdır. iGoad ise ios uygulamalarda sık karşılaşılan güvenlik açıklıklarını gösteren ve iyiliştirmelerinde yardımcı olan bir ios test ortam aracıdır. Owasp tarafından geliştirilen bu uygulamalar hem güvenlik testlerinin gerçekleştirilmesinde hemde developerların güvenli uygulama geliştirmede başvurduğu uygulamalardır.
Goatdroid aşağıaki bileşenlerden oluşmaktadır;
  • Web servis ve SDK ile etkileşimli GUI
  • Çeşitli güvenlik açıkları içeren kaynak kodlar
  • Jetty veritabanı
  • Derby veritabanı
Goatdroid indirildikten ve zip dosyası açıkldıktan sonra goatdroid-gui.jar dosyası çalıştırılır. Launch Configuration -> Edit Configuration menusunden burada AVD pathi olarak Android virtual devices pathimizin barındırıldığı path girilir. SDK path kısmına da SDK uygulamamızın kurulu pathi girilmelidir. Duruma göre web servis portu da değitştirilebiilr ön tanımlı olarak 8888 gelmektedir.
Celal ERDİK < celal.erdik@bga.com.tr >