iOS Pentesting

Dünyanın en gelişmiş topluluk araçlarıyla desteklenen iş akışlarını kolayca oluşturmak ve otomatikleştirmek için Trickest kullanın. Bugün Erişim Alın:

HackTricks'i Destekleyin

iOS Temelleri

iOS Basics

Test Ortamı

Bu sayfada iOS simülatörü, emülatörler ve jailbreaking hakkında bilgi bulabilirsiniz:

iOS Testing Environment

İlk Analiz

Temel iOS Test İşlemleri

Test sırasında birçok işlem önerilecektir (cihaza bağlanma, dosyaları okuma/yazma/yükleme/indirme, bazı araçları kullanma...). Bu nedenle, bu eylemlerden herhangi birini nasıl gerçekleştireceğinizi bilmiyorsanız, lütfen sayfayı okumaya başlayın:

iOS Basic Testing Operations

Aşağıdaki adımlar için uygulama cihazda kurulu olmalıdır ve uygulamanın IPA dosyasını zaten almış olmalıdır. Bunu nasıl yapacağınızı öğrenmek için Temel iOS Test İşlemleri sayfasını okuyun.

Temel Statik Analiz

IPA dosyasına otomatik Statik Analiz gerçekleştirmek için MobSF aracını kullanmanız önerilir.

İkili dosyada mevcut olan korumaların tanımlanması:

  • PIE (Position Independent Executable): Etkinleştirildiğinde, uygulama her başlatıldığında rastgele bir bellek adresine yüklenir, bu da başlangıç bellek adresini tahmin etmeyi zorlaştırır.

otool -hv <app-binary> | grep PIE   # PIE bayrağını içermelidir
  • Stack Canaries: Yığın bütünlüğünü doğrulamak için, bir işlev çağrılmadan önce yığında bir ‘canary’ değeri yerleştirilir ve işlev sona erdiğinde tekrar doğrulanır.

otool -I -v <app-binary> | grep stack_chk   # stack_chk_guard ve stack_chk_fail sembollerini içermelidir
  • ARC (Automatic Reference Counting): Yaygın bellek bozulma hatalarını önlemek için

otool -I -v <app-binary> | grep objc_release   # _objc_release sembolünü içermelidir
  • Şifreli İkili: İkili dosya şifrelenmiş olmalıdır

otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT   # cryptid 1 olmalıdır

Hassas/Güvensiz Fonksiyonların Tanımlanması

  • Zayıf Hashing Algoritmaları

# iOS cihazında
otool -Iv <app> | grep -w "_CC_MD5"
otool -Iv <app> | grep -w "_CC_SHA1"

# Linux'ta
grep -iER "_CC_MD5"
grep -iER "_CC_SHA1"
  • Güvensiz Rastgele Fonksiyonlar

# iOS cihazında
otool -Iv <app> | grep -w "_random"
otool -Iv <app> | grep -w "_srand"
otool -Iv <app> | grep -w "_rand"

# Linux'ta
grep -iER "_random"
grep -iER "_srand"
grep -iER "_rand"
  • Güvensiz ‘Malloc’ Fonksiyonu

# iOS cihazında
otool -Iv <app> | grep -w "_malloc"

# Linux'ta
grep -iER "_malloc"
  • Güvensiz ve Açık Fonksiyonlar

# iOS cihazında
otool -Iv <app> | grep -w "_gets"
otool -Iv <app> | grep -w "_memcpy"
otool -Iv <app> | grep -w "_strncpy"
otool -Iv <app> | grep -w "_strlen"
otool -Iv <app> | grep -w "_vsnprintf"
otool -Iv <app> | grep -w "_sscanf"
otool -Iv <app> | grep -w "_strtok"
otool -Iv <app> | grep -w "_alloca"
otool -Iv <app> | grep -w "_sprintf"
otool -Iv <app> | grep -w "_printf"
otool -Iv <app> | grep -w "_vsprintf"

# Linux'ta
grep -R "_gets"
grep -iER "_memcpy"
grep -iER "_strncpy"
grep -iER "_strlen"
grep -iER "_vsnprintf"
grep -iER "_sscanf"
grep -iER "_strtok"
grep -iER "_alloca"
grep -iER "_sprintf"
grep -iER "_printf"
grep -iER "_vsprintf"

Temel Dinamik Analiz

MobSF tarafından gerçekleştirilen dinamik analizi kontrol edin. Farklı görünümler arasında gezinmeniz ve onlarla etkileşimde bulunmanız gerekecek, ancak diğer şeyleri yaparken birkaç sınıfı bağlayacak ve işiniz bittiğinde bir rapor hazırlayacaktır.

Yüklenen Uygulamaları Listeleme

Yüklenen uygulamaların bundle identifier'ını belirlemek için frida-ps -Uai komutunu kullanın:

$ frida-ps -Uai
PID  Name                 Identifier
----  -------------------  -----------------------------------------
6847  Calendar             com.apple.mobilecal
6815  Mail                 com.apple.mobilemail
-  App Store            com.apple.AppStore
-  Apple Store          com.apple.store.Jolly
-  Calculator           com.apple.calculator
-  Camera               com.apple.camera
-  iGoat-Swift          OWASP.iGoat-Swift

Temel Enumerasyon & Hooking

Uygulamanın bileşenlerini listelemeyi ve metotları ve sınıfları kolayca hook'lamayı öğrenin:

iOS Hooking With Objection

IPA Yapısı

Bir IPA dosyasının yapısı esasen bir ziplenmiş paket yapısıdır. Uzantısını .zip olarak yeniden adlandırarak, içeriğini açabilirsiniz. Bu yapı içinde, bir Bundle, kurulum için hazır bir şekilde paketlenmiş uygulamayı temsil eder. İçinde, uygulamanın kaynaklarını kapsayan <NAME>.app adlı bir dizin bulacaksınız.

  • Info.plist: Bu dosya, uygulamanın belirli yapılandırma ayrıntılarını tutar.

  • _CodeSignature/: Bu dizin, bundle içindeki tüm dosyaların bütünlüğünü sağlamak için bir imza içeren bir plist dosyası içerir.

  • Assets.car: İkonlar gibi varlık dosyalarını depolayan sıkıştırılmış bir arşivdir.

  • Frameworks/: Bu klasör, .dylib veya .framework dosyaları şeklinde olabilen uygulamanın yerel kütüphanelerini barındırır.

  • PlugIns/: Uygulamaya uzantılar içerebilir, bunlar .appex dosyaları olarak bilinir, ancak her zaman mevcut olmayabilir. * Core Data: Uygulamanızın kalıcı verilerini çevrimdışı kullanım için kaydetmek, geçici verileri önbelleğe almak ve uygulamanızda tek bir cihazda geri alma işlevselliği eklemek için kullanılır. Bir iCloud hesabındaki birden fazla cihaz arasında veri senkronizasyonu sağlamak için, Core Data otomatik olarak şemanızı bir CloudKit konteynerine yansıtır.

  • PkgInfo: PkgInfo dosyası, uygulamanızın veya bundle'ınızın türünü ve yaratıcısını belirtmenin alternatif bir yoludur.

  • en.lproj, fr.proj, Base.lproj: Bu, belirli diller için kaynakları içeren dil paketleridir ve bir dil desteklenmediğinde varsayılan bir kaynak içerir.

  • Güvenlik: _CodeSignature/ dizini, dijital imzalar aracılığıyla tüm paketlenmiş dosyaların bütünlüğünü doğrulayarak uygulamanın güvenliğinde kritik bir rol oynar.

  • Varlık Yönetimi: Assets.car dosyası, grafik varlıkları verimli bir şekilde yönetmek için sıkıştırma kullanır, bu da uygulama performansını optimize etmek ve genel boyutunu azaltmak için önemlidir.

  • Frameworks ve PlugIns: Bu dizinler, iOS uygulamalarının modülerliğini vurgular, geliştiricilerin yeniden kullanılabilir kod kütüphanelerini (Frameworks/) dahil etmelerine ve uygulama işlevselliğini genişletmelerine olanak tanır.

  • Yerelleştirme: Yapı, belirli dil paketleri için kaynaklar ekleyerek küresel uygulama erişimini kolaylaştıran birden fazla dili destekler.

Info.plist

Info.plist, iOS uygulamaları için bir köşe taşı olarak hizmet eder ve anahtar-değer çiftleri şeklinde ana yapılandırma verilerini kapsar. Bu dosya, yalnızca uygulamalar için değil, aynı zamanda içinde paketlenmiş uygulama uzantıları ve framework'ler için de gereklidir. XML veya ikili formatta yapılandırılmıştır ve uygulama izinlerinden güvenlik yapılandırmalarına kadar kritik bilgileri tutar. Mevcut anahtarların detaylı bir keşfi için Apple Developer Documentation adresine başvurabilirsiniz.

Bu dosyayla daha erişilebilir bir formatta çalışmak isteyenler için, XML dönüşümü macOS'ta plutil kullanılarak kolayca gerçekleştirilebilir (10.2 ve sonraki sürümlerde yerel olarak mevcuttur) veya Linux'ta plistutil ile yapılabilir. Dönüşüm için komutlar şu şekildedir:

  • macOS için:

$ plutil -convert xml1 Info.plist
  • Linux için:

$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist

Info.plist dosyasının ortaya çıkarabileceği çok sayıda bilgi arasında, dikkat çekici girdiler uygulama izin dizeleri (UsageDescription), özel URL şemaları (CFBundleURLTypes) ve Uygulama Taşıma Güvenliği için yapılandırmalar (NSAppTransportSecurity) bulunmaktadır. Bu girdiler, dışa aktarılan/içe aktarılan özel belge türleri (UTExportedTypeDeclarations / UTImportedTypeDeclarations) gibi diğerleriyle birlikte, dosyayı inceleyerek veya basit bir grep komutu kullanarak kolayca bulunabilir:

$ grep -i <keyword> Info.plist

Veri Yolları

iOS ortamında, dizinler sistem uygulamaları ve kullanıcı tarafından yüklenen uygulamalar için özel olarak belirlenmiştir. Sistem uygulamaları /Applications dizininde bulunurken, kullanıcı tarafından yüklenen uygulamalar /var/mobile/containers/Data/Application/ altında yer alır. Bu uygulamalar, dizin adlarının rastgeleliği nedeniyle bir uygulamanın klasörünü manuel olarak bulmayı zorlaştıran 128-bit UUID olarak bilinen benzersiz bir tanımlayıcıya sahiptir.

iOS'taki uygulamalar sandbox'lanmış olması gerektiğinden, her uygulamanın $HOME/Library/Containers içinde uygulamanın CFBundleIdentifier olarak adlandırılan bir klasörü de olacaktır.

Ancak, her iki klasör (veri ve konteyner klasörleri) .com.apple.mobile_container_manager.metadata.plist dosyasını içerir ve bu dosya, MCMetadataIdentifier anahtarında her iki dosyayı bağlar.

Kullanıcı tarafından yüklenen bir uygulamanın kurulum dizinini keşfetmeyi kolaylaştırmak için, objection aracı faydalı bir komut sağlar, env. Bu komut, söz konusu uygulama için ayrıntılı dizin bilgilerini ortaya çıkarır. Aşağıda bu komutun nasıl kullanılacağına dair bir örnek bulunmaktadır:

OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # env

Name               Path
-----------------  -------------------------------------------------------------------------------------------
BundlePath         /var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app
CachesDirectory    /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library/Caches
DocumentDirectory  /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Documents
LibraryDirectory   /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library

Alternatif olarak, uygulama adı /private/var/containers içinde find komutunu kullanarak aranabilir:

find /private/var/containers -name "Progname*"

ps ve lsof gibi komutlar, uygulamanın işlemini tanımlamak ve sırasıyla açık dosyaları listelemek için de kullanılabilir, bu da uygulamanın aktif dizin yolları hakkında bilgiler sağlar:

ps -ef | grep -i <app-name>
lsof -p <pid> | grep -i "/containers" | head -n 1

Bundle dizini:

  • AppName.app

  • Bu, IPA'da daha önce görülen Uygulama Paketi olup, temel uygulama verilerini, statik içeriği ve uygulamanın derlenmiş ikili dosyasını içerir.

  • Bu dizin kullanıcılara görünür, ancak kullanıcılar buna yazamaz.

  • Bu dizindeki içerik yedeklenmez.

  • Bu klasörün içeriği kod imzasını doğrulamak için kullanılır.

Veri dizini:

  • Documents/

  • Kullanıcı tarafından oluşturulan tüm verileri içerir. Uygulama son kullanıcı bu verilerin oluşturulmasını başlatır.

  • Kullanıcılara görünür ve kullanıcılar buna yazabilir.

  • Bu dizindeki içerik yedeklenir.

  • Uygulama, NSURLIsExcludedFromBackupKey ayarını kullanarak yolları devre dışı bırakabilir.

  • Library/

  • Kullanıcıya özel olmayan tüm dosyaları içerir, örneğin önbellekler, tercihler, çerezler ve özellik listesi (plist) yapılandırma dosyaları.

  • iOS uygulamaları genellikle Application Support ve Caches alt dizinlerini kullanır, ancak uygulama özel alt dizinler oluşturabilir.

  • Library/Caches/

  • Yarı kalıcı önbellek dosyalarını içerir.

  • Kullanıcılara görünmez ve kullanıcılar buna yazamaz.

  • Bu dizindeki içerik yedeklenmez.

  • OS, uygulama çalışmadığında ve depolama alanı azaldığında bu dizinin dosyalarını otomatik olarak silebilir.

  • Library/Application Support/

  • Uygulamanın çalışması için gerekli kalıcı dosyaları içerir.

  • Kullanıcılara görünmez ve kullanıcılar buna yazamaz.

  • Bu dizindeki içerik yedeklenir.

  • Uygulama, NSURLIsExcludedFromBackupKey ayarını kullanarak yolları devre dışı bırakabilir.

  • Library/Preferences/

  • Uygulama yeniden başlatılsa bile kalıcı olabilen özellikleri saklamak için kullanılır.

  • Bilgiler, şifrelenmemiş olarak, uygulama kumanda alanında [BUNDLE_ID].plist adlı bir plist dosyasında saklanır.

  • NSUserDefaults kullanılarak saklanan tüm anahtar/değer çiftleri bu dosyada bulunabilir.

  • tmp/

  • Uygulama başlatmaları arasında kalıcı olması gerekmeyen geçici dosyalar yazmak için bu dizini kullanın.

  • Kalıcı olmayan önbellek dosyalarını içerir.

  • Kullanıcılara görünmez.

  • Bu dizindeki içerik yedeklenmez.

  • OS, uygulama çalışmadığında ve depolama alanı azaldığında bu dizinin dosyalarını otomatik olarak silebilir.

iGoat-Swift'in Uygulama Paketi (.app) dizinine daha yakından bakalım (/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app):

OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
NSFileType      Perms  NSFileProtection    ...  Name
------------  -------  ------------------  ...  --------------------------------------
Regular           420  None                ...  rutger.html
Regular           420  None                ...  mansi.html
Regular           420  None                ...  splash.html
Regular           420  None                ...  about.html

Regular           420  None                ...  LICENSE.txt
Regular           420  None                ...  Sentinel.txt
Regular           420  None                ...  README.txt

Binary Reversing

<application-name>.app klasörünün içinde <application-name> adında bir ikili dosya bulacaksınız. Bu, çalıştırılacak dosyadır. İkili dosyanın temel bir incelemesini otool aracıyla gerçekleştirebilirsiniz:

otool -Vh DVIA-v2 #Check some compilation attributes
magic  cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64    ARM64        ALL  0x00     EXECUTE    65       7112   NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES BINDS_TO_WEAK PIE

otool -L DVIA-v2 #Get third party libraries
DVIA-v2:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.1)
/usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 274.6.0)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
@rpath/Bolts.framework/Bolts (compatibility version 1.0.0, current version 1.0.0)
[...]

Uygulamanın şifrelenip şifrelenmediğini kontrol et

Aşağıdaki için herhangi bir çıktı olup olmadığını kontrol edin:

otool -l <app-binary> | grep -A 4 LC_ENCRYPTION_INFO

İkiliyi Ayrıştırma

Metin bölümünü ayrıştırın:

otool -tV DVIA-v2
DVIA-v2:
(__TEXT,__text) section
+[DDLog initialize]:
0000000100004ab8    sub    sp, sp, #0x60
0000000100004abc    stp    x29, x30, [sp, #0x50]   ; Latency: 6
0000000100004ac0    add    x29, sp, #0x50
0000000100004ac4    sub    x8, x29, #0x10
0000000100004ac8    mov    x9, #0x0
0000000100004acc    adrp    x10, 1098 ; 0x10044e000
0000000100004ad0    add    x10, x10, #0x268

Örnek uygulamanın Objective-C segmentini yazdırmak için şunları kullanabilirsiniz:

otool -oV DVIA-v2
DVIA-v2:
Contents of (__DATA,__objc_classlist) section
00000001003dd5b8 0x1004423d0 _OBJC_CLASS_$_DDLog
isa        0x1004423a8 _OBJC_METACLASS_$_DDLog
superclass 0x0 _OBJC_CLASS_$_NSObject
cache      0x0 __objc_empty_cache
vtable     0x0
data       0x1003de748
flags          0x80
instanceStart  8

Daha kompakt bir Objective-C kodu elde etmek için class-dump kullanabilirsiniz:

class-dump some-app
//
//     Generated by class-dump 3.5 (64 bit).
//
//     class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2013 by Steve Nygard.
//

#pragma mark Named Structures

struct CGPoint {
double _field1;
double _field2;
};

struct CGRect {
struct CGPoint _field1;
struct CGSize _field2;
};

struct CGSize {
double _field1;
double _field2;
};

Ancak, ikili dosyayı parçalamak için en iyi seçenekler: Hopper ve IDA.

Trickest kullanarak dünyanın en gelişmiş topluluk araçlarıyla desteklenen iş akışlarını kolayca oluşturun ve otomatikleştirin. Bugün Erişim Alın:

Veri Depolama

iOS'un cihazda verileri nasıl depoladığını öğrenmek için bu sayfayı okuyun:

iOS Basics

Bilgileri depolamak için aşağıdaki yerler uygulama yüklendikten hemen sonra, uygulamanın tüm işlevleri kontrol edildikten sonra ve hatta bir kullanıcıdan çıkış yapıldıktan ve farklı bir kullanıcıya giriş yapıldıktan sonra kontrol edilmelidir. Amaç, uygulamanın (şifreler, tokenlar), mevcut kullanıcının ve daha önce giriş yapmış kullanıcıların korumasız hassas bilgilerini bulmaktır.

Plist

plist dosyaları, anahtar-değer çiftlerini içeren yapılandırılmış XML dosyalarıdır. Kalıcı verileri depolamanın bir yoludur, bu nedenle bazen bu dosyalarda hassas bilgiler bulabilirsiniz. Uygulamayı yükledikten sonra ve yoğun bir şekilde kullandıktan sonra bu dosyaları kontrol etmeniz önerilir.

Plist dosyalarında verileri kalıcı hale getirmenin en yaygın yolu NSUserDefaults kullanımıdır. Bu plist dosyası, uygulama kumandasının içinde Library/Preferences/<appBundleID>.plist konumunda kaydedilir.

NSUserDefaults sınıfı, varsayılan sistemle etkileşim kurmak için programatik bir arayüz sağlar. Varsayılan sistem, bir uygulamanın kullanıcı tercihleri doğrultusunda davranışını özelleştirmesine olanak tanır. NSUserDefaults ile kaydedilen veriler uygulama paketinde görüntülenebilir. Bu sınıf, plist dosyasında veri depolar, ancak küçük miktarda veri ile kullanılmak üzere tasarlanmıştır.

Bu verilere artık güvenilir bir bilgisayar aracılığıyla doğrudan erişilemez, ancak bir yedekleme yaparak erişilebilir.

NSUserDefaults kullanarak kaydedilen bilgileri dump edebilirsiniz, objection'ın ios nsuserdefaults get komutunu kullanarak.

Uygulama tarafından kullanılan tüm plist dosyalarına erişmek için /private/var/mobile/Containers/Data/Application/{APPID} konumuna gidebilir ve şunu çalıştırabilirsiniz:

find ./ -name "*.plist"

XML veya ikili (bplist) formatındaki dosyaları XML'e dönüştürmek için, işletim sisteminize bağlı olarak çeşitli yöntemler mevcuttur:

macOS Kullanıcıları için: plutil komutunu kullanın. Bu, macOS'ta (10.2+) bu amaç için tasarlanmış yerleşik bir araçtır:

$ plutil -convert xml1 Info.plist

Linux Kullanıcıları için: Öncelikle libplist-utils yükleyin, ardından dosyanızı dönüştürmek için plistutil kullanın:

$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist

Objection Oturumu İçinde: Mobil uygulamaları analiz etmek için, plist dosyalarını doğrudan dönüştürmenizi sağlayan özel bir komut vardır:

ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>/Library/Preferences/com.some.package.app.plist

Core Data

Core Data uygulamanızdaki nesnelerin model katmanını yönetmek için bir çerçevedir. Core Data, kalıcı depolama olarak SQLite kullanabilir, ancak çerçeve kendisi bir veritabanı değildir. CoreData varsayılan olarak verilerini şifrelemez. Ancak, CoreData'ya ek bir şifreleme katmanı eklenebilir. Daha fazla ayrıntı için GitHub Repo sayfasına bakın.

Bir uygulamanın SQLite Core Data bilgilerini /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support yolunda bulabilirsiniz.

SQLite'yi açıp hassas bilgilere erişebiliyorsanız, o zaman bir yanlış yapılandırma buldunuz.

Code from iGoat
-(void)storeDetails {
AppDelegate * appDelegate = (AppDelegate *)(UIApplication.sharedApplication.delegate);

NSManagedObjectContext *context =[appDelegate managedObjectContext];

User *user = [self fetchUser];
if (user) {
return;
}
user = [NSEntityDescription insertNewObjectForEntityForName:@"User"
inManagedObjectContext:context];
user.email = CoreDataEmail;
user.password = CoreDataPassword;
NSError *error;
if (![context save:&error]) {
NSLog(@"Error in saving data: %@", [error localizedDescription]);

}else{
NSLog(@"data stored in core data");
}
}

YapDatabase

YapDatabase SQLite üzerine inşa edilmiş bir anahtar/değer deposudur. Yap veritabanları sqlite veritabanları olduğundan, önceki bölümde önerilen komutu kullanarak bunları bulabilirsiniz.

Diğer SQLite Veritabanları

Uygulamaların kendi sqlite veritabanlarını oluşturması yaygındır. Bu veritabanlarında duyarlı veri saklıyor olabilirler ve bunu şifrelemeden bırakabilirler. Bu nedenle, her zaman uygulama dizinindeki her veritabanını kontrol etmek ilginçtir. Bu nedenle, verilerin kaydedildiği uygulama dizinine gidin (/private/var/mobile/Containers/Data/Application/{APPID})

find ./ -name "*.sqlite" -or -name "*.db"

Firebase Gerçek Zamanlı Veritabanları

Geliştiriciler, Firebase Gerçek Zamanlı Veritabanları aracılığıyla veri depolayıp senkronize etme yeteneğine sahiptir. JSON formatında depolanan veriler, gerçek zamanlı olarak tüm bağlı istemcilere senkronize edilir.

Yanlış yapılandırılmış Firebase veritabanlarını nasıl kontrol edeceğinizi burada bulabilirsiniz:

Firebase Database

Realm veritabanları

Realm Objective-C ve Realm Swift Apple tarafından sağlanmayan veri depolama için güçlü bir alternatif sunar. Varsayılan olarak, verileri şifrelenmemiş olarak depolar, belirli bir yapılandırma ile şifreleme mevcuttur.

Veritabanları şu konumda bulunmaktadır: /private/var/mobile/Containers/Data/Application/{APPID}. Bu dosyaları keşfetmek için şu gibi komutlar kullanılabilir:

iPhone:/private/var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Documents root# ls
default.realm  default.realm.lock  default.realm.management/  default.realm.note|

$ find ./ -name "*.realm*"

Bu veritabanı dosyalarını görüntülemek için Realm Studio aracının kullanılması önerilir.

Bir Realm veritabanında şifreleme uygulamak için aşağıdaki kod parçası kullanılabilir:

// Open the encrypted Realm file where getKey() is a method to obtain a key from the Keychain or a server
let config = Realm.Configuration(encryptionKey: getKey())
do {
let realm = try Realm(configuration: config)
// Use the Realm as normal
} catch let error as NSError {
// If the encryption key is wrong, `error` will say that it's an invalid database
fatalError("Error opening realm: \(error)")
}

Couchbase Lite Veritabanları

Couchbase Lite, hafif ve gömülü bir veritabanı motoru olarak tanımlanır ve belge odaklı (NoSQL) yaklaşımı takip eder. iOS ve macOS için yerel olarak tasarlanmış olup, verileri sorunsuz bir şekilde senkronize etme yeteneği sunar.

Bir cihazda potansiyel Couchbase veritabanlarını belirlemek için aşağıdaki dizin incelenmelidir:

ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support/

Çerezler

iOS, uygulamaların çerezlerini her uygulama klasörü içindeki Library/Cookies/cookies.binarycookies dosyasında saklar. Ancak, geliştiriciler bazen bunları anahtar zincirinde saklamayı tercih ederler çünkü belirtilen çerez dosyası yedeklerde erişilebilir.

Çerez dosyasını incelemek için bu python betiğini kullanabilir veya objection'ın ios cookies get komutunu kullanabilirsiniz. Bu dosyaları JSON formatına dönüştürmek ve verileri incelemek için objection'ı da kullanabilirsiniz.

...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios cookies get --json
[
{
"domain": "highaltitudehacks.com",
"expiresDate": "2051-09-15 07:46:43 +0000",
"isHTTPOnly": "false",
"isSecure": "false",
"name": "username",
"path": "/",
"value": "admin123",
"version": "0"
}
]

Cache

Varsayılan olarak NSURLSession, HTTP istekleri ve yanıtları Cache.db veritabanında depolar. Bu veritabanı, tokenlar, kullanıcı adları veya başka herhangi bir hassas bilgi önbelleğe alındıysa hassas veriler içerebilir. Önbelleğe alınmış bilgileri bulmak için uygulamanın veri dizinini açın (/var/mobile/Containers/Data/Application/<UUID>) ve /Library/Caches/<Bundle Identifier> dizinine gidin. WebKit önbelleği de Cache.db dosyasında depolanmaktadır. Objection, sqlite connect Cache.db komutuyla veritabanını açabilir ve etkileşimde bulunabilir, çünkü bu normal bir SQLite veritabanıdır.

Bu verilerin önbelleğe alınmasını devre dışı bırakmanız önerilir, çünkü istek veya yanıtta hassas bilgiler içerebilir. Aşağıdaki liste, bunu başarmanın farklı yollarını göstermektedir:

  1. Çıkış yaptıktan sonra Önbelleğe alınmış yanıtların kaldırılması önerilir. Bu, Apple tarafından sağlanan removeAllCachedResponses yöntemi ile yapılabilir. Bu yöntemi aşağıdaki gibi çağırabilirsiniz:

URLCache.shared.removeAllCachedResponses()

Bu yöntem, Cache.db dosyasından tüm önbelleğe alınmış istekleri ve yanıtları kaldıracaktır. 2. Çerezlerin avantajını kullanmanıza gerek yoksa, URLSession'ın .ephemeral yapılandırma özelliğini kullanmanız önerilir; bu, çerezlerin ve önbelleklerin kaydedilmesini devre dışı bırakır.

Apple belgeleri:

Geçici bir oturum yapılandırma nesnesi, varsayılan bir oturum yapılandırmasına (bkz. varsayılan) benzer, ancak ilgili oturum nesnesi önbellekleri, kimlik bilgisi depolarını veya herhangi bir oturumla ilgili veriyi diske kaydetmez. Bunun yerine, oturumla ilgili veriler RAM'de depolanır. Geçici bir oturumun diske veri yazdığı tek zaman, bir URL'nin içeriğini bir dosyaya yazmasını söylediğiniz zamandır. 3. Önbellek, Önbellek Politikasını .notAllowed olarak ayarlayarak da devre dışı bırakılabilir. Bu, önbelleği herhangi bir şekilde, ister bellek ister disk üzerinde depolamayı devre dışı bırakır.

Snapshots

Ana düğmeye her bastığınızda, iOS mevcut ekranın bir anlık görüntüsünü alır ve uygulamaya geçişi çok daha akıcı bir şekilde yapabilmek için. Ancak, eğer hassas veri mevcut ekranın içindeyse, bu görüntüde kaydedilir (bu yeniden başlatmalarda sürdürülür). Bunlar, uygulamalar arasında geçiş yapmak için ana ekranı çift tıklayarak erişebileceğiniz anlık görüntülerdir.

iPhone jailbreak edilmedikçe, saldırganın bu ekran görüntülerini görebilmesi için cihaza erişimi açık olmalıdır. Varsayılan olarak, son anlık görüntü uygulamanın sandbox'ında Library/Caches/Snapshots/ veya Library/SplashBoard/Snapshots klasöründe depolanır (güvenilir bilgisayarlar iOX 7.0'dan itibaren dosya sistemine erişemez).

Bu kötü davranışı önlemenin bir yolu, anlık görüntü alınmadan önce boş bir ekran koymak veya hassas verileri kaldırmaktır; bunu ApplicationDidEnterBackground() fonksiyonunu kullanarak yapabilirsiniz.

Aşağıda, varsayılan bir ekran görüntüsü ayarlayacak bir örnek düzeltme yöntemi bulunmaktadır.

Swift:

private var backgroundImage: UIImageView?

func applicationDidEnterBackground(_ application: UIApplication) {
let myBanner = UIImageView(image: #imageLiteral(resourceName: "overlayImage"))
myBanner.frame = UIScreen.main.bounds
backgroundImage = myBanner
window?.addSubview(myBanner)
}

func applicationWillEnterForeground(_ application: UIApplication) {
backgroundImage?.removeFromSuperview()
}

Objective-C:

@property (UIImageView *)backgroundImage;

- (void)applicationDidEnterBackground:(UIApplication *)application {
UIImageView *myBanner = [[UIImageView alloc] initWithImage:@"overlayImage.png"];
self.backgroundImage = myBanner;
self.backgroundImage.bounds = UIScreen.mainScreen.bounds;
[self.window addSubview:myBanner];
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
[self.backgroundImage removeFromSuperview];
}

Bu, uygulama arka plana alındığında arka plan resmini overlayImage.png olarak ayarlar. overlayImage.png mevcut görünümü her zaman geçersiz kılacağı için hassas veri sızıntılarını önler.

Anahtar Zinciri

iOS anahtar zincirine erişim ve yönetim için, jailbreak yapılmış cihazlar için uygun olan Keychain-Dumper gibi araçlar mevcuttur. Ayrıca, benzer amaçlar için Objection ios keychain dump komutunu sağlar.

Kimlik Bilgilerini Saklama

NSURLCredential sınıfı, hassas bilgileri doğrudan anahtar zincirinde saklamak için idealdir ve NSUserDefaults veya diğer sarmalayıcıları atlamayı sağlar. Giriş yaptıktan sonra kimlik bilgilerini saklamak için aşağıdaki Swift kodu kullanılır:

NSURLCredential *credential;
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];

Bu saklanan kimlik bilgilerini çıkarmak için, Objection'ın ios nsurlcredentialstorage dump komutu kullanılır.

Özel Klavyeler ve Klavye Önbelleği

iOS 8.0 ve sonrasında, kullanıcılar Ayarlar > Genel > Klavye > Klavyeler altında yönetilebilen özel klavye uzantıları yükleyebilir. Bu klavyeler genişletilmiş işlevsellik sunarken, tuş vuruşlarını kaydetme ve verileri harici sunuculara iletme riski taşır; ancak kullanıcılar, ağ erişimi gerektiren klavyeler hakkında bilgilendirilir. Uygulamalar, hassas bilgi girişi için özel klavyelerin kullanımını kısıtlayabilir ve kısıtlamalıdır.

Güvenlik Önerileri:

  • Gelişmiş güvenlik için üçüncü taraf klavyelerin devre dışı bırakılması önerilir.

  • Varsayılan iOS klavyesinin otomatik düzeltme ve otomatik öneri özelliklerinin, Library/Keyboard/{locale}-dynamic-text.dat veya /private/var/mobile/Library/Keyboard/dynamic-text.dat konumundaki önbellek dosyalarında hassas bilgileri saklayabileceğini unutmayın. Bu önbellek dosyaları, hassas veriler için düzenli olarak kontrol edilmelidir. Önbellek verilerini temizlemek için Ayarlar > Genel > Sıfırla > Klavye Sözlüğünü Sıfırla yoluyla klavye sözlüğünün sıfırlanması önerilir.

  • Ağ trafiğini yakalamak, özel bir klavyenin tuş vuruşlarını uzaktan iletip iletmediğini ortaya çıkarabilir.

Metin Alanı Önbelleklemesini Önleme

UITextInputTraits protokolü, hassas bilgi önbelleklemesini önlemek için otomatik düzeltme ve güvenli metin girişi yönetimi için özellikler sunar. Örneğin, otomatik düzeltmeyi devre dışı bırakmak ve güvenli metin girişini etkinleştirmek şu şekilde gerçekleştirilebilir:

textObject.autocorrectionType = UITextAutocorrectionTypeNo;
textObject.secureTextEntry = YES;