iOS Pentesting

Використовуйте Trickest для легкого створення та автоматизації робочих процесів, підтримуваних найсучаснішими інструментами спільноти. Отримайте доступ сьогодні:

Підтримка HackTricks

iOS Основи

iOS Basics

Тестове середовище

На цій сторінці ви можете знайти інформацію про iOS емулятор, емулятори та джейлбрейк:

iOS Testing Environment

Початкова аналіз

Основні операції тестування iOS

Під час тестування будуть запропоновані кілька операцій (підключення до пристрою, читання/запис/завантаження/скачування файлів, використання деяких інструментів...). Тому, якщо ви не знаєте, як виконати будь-яку з цих дій, будь ласка, почніть читати цю сторінку:

iOS Basic Testing Operations

Для наступних кроків додаток має бути встановлений на пристрої та вже повинен мати IPA файл програми. Прочитайте сторінку Основні операції тестування iOS, щоб дізнатися, як це зробити.

Основний статичний аналіз

Рекомендується використовувати інструмент MobSF для автоматичного статичного аналізу IPA файлу.

Ідентифікація захистів, присутніх у бінарному файлі:

  • PIE (Position Independent Executable): Коли увімкнено, програма завантажується в випадкову адресу пам'яті щоразу при запуску, ускладнюючи передбачення її початкової адреси пам'яті.

otool -hv <app-binary> | grep PIE   # Має включати прапор PIE
  • Stack Canaries: Для перевірки цілісності стеку, значення «канарки» розміщується на стеку перед викликом функції та перевіряється знову після завершення функції.

otool -I -v <app-binary> | grep stack_chk   # Має включати символи: stack_chk_guard та stack_chk_fail
  • ARC (Automatic Reference Counting): Для запобігання поширеним помилкам корупції пам'яті

otool -I -v <app-binary> | grep objc_release   # Має включати символ _objc_release
  • Зашифрований бінарний файл: Бінарний файл має бути зашифрований

otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT   # Криптід має бути 1

Ідентифікація чутливих/незахищених функцій

  • Слабкі алгоритми хешування

# На пристрої iOS
otool -Iv <app> | grep -w "_CC_MD5"
otool -Iv <app> | grep -w "_CC_SHA1"

# На Linux
grep -iER "_CC_MD5"
grep -iER "_CC_SHA1"
  • Ненадійні випадкові функції

# На пристрої iOS
otool -Iv <app> | grep -w "_random"
otool -Iv <app> | grep -w "_srand"
otool -Iv <app> | grep -w "_rand"

# На Linux
grep -iER "_random"
grep -iER "_srand"
grep -iER "_rand"
  • Ненадійна функція ‘Malloc’

# На пристрої iOS
otool -Iv <app> | grep -w "_malloc"

# На Linux
grep -iER "_malloc"
  • Ненадійні та вразливі функції

# На пристрої iOS
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
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"

Основний динамічний аналіз

Ознайомтеся з динамічним аналізом, який виконує MobSF. Вам потрібно буде переміщатися між різними виглядами та взаємодіяти з ними, але він буде підключати кілька класів, виконуючи інші дії, і підготує звіт, коли ви закінчите.

Перелік встановлених додатків

Використовуйте команду frida-ps -Uai, щоб визначити ідентифікатор пакета встановлених додатків:

$ 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

Основна Перерахунка та Хукінг

Дізнайтеся, як перерахувати компоненти програми та як легко підключати методи та класи за допомогою objection:

iOS Hooking With Objection

Структура IPA

Структура IPA файлу в основному є структурою запакованого архіву. Змінивши його розширення на .zip, його можна розпакувати, щоб виявити його вміст. У цій структурі Bundle представляє повністю упаковану програму, готову до встановлення. Всередині ви знайдете каталог з назвою <NAME>.app, який містить ресурси програми.

  • Info.plist: Цей файл містить специфічні деталі конфігурації програми.

  • _CodeSignature/: Цей каталог включає plist файл, який містить підпис, що забезпечує цілісність усіх файлів у бандлі.

  • Assets.car: Стиснутий архів, що зберігає файли активів, такі як іконки.

  • Frameworks/: Ця папка містить рідні бібліотеки програми, які можуть бути у формі файлів .dylib або .framework.

  • PlugIns/: Це може включати розширення програми, відомі як файли .appex, хоча вони не завжди присутні. * Core Data: Використовується для збереження постійних даних вашої програми для офлайн використання, для кешування тимчасових даних та для додавання функціональності скасування дій у вашій програмі на одному пристрої. Щоб синхронізувати дані між кількома пристроями в одному обліковому записі iCloud, Core Data автоматично відображає вашу схему в контейнер CloudKit.

  • PkgInfo: Файл PkgInfo є альтернативним способом вказати тип і коди творця вашої програми або бандлу.

  • en.lproj, fr.proj, Base.lproj: Це мовні пакети, які містять ресурси для цих конкретних мов, а також ресурс за замовчуванням на випадок, якщо мова не підтримується.

  • Безпека: Каталог _CodeSignature/ відіграє критичну роль у безпеці програми, перевіряючи цілісність усіх упакованих файлів через цифрові підписи.

  • Управління активами: Файл Assets.car використовує стиснення для ефективного управління графічними активами, що є важливим для оптимізації продуктивності програми та зменшення її загального розміру.

  • Frameworks та PlugIns: Ці каталоги підкреслюють модульність iOS програм, дозволяючи розробникам включати повторно використовувані бібліотеки коду (Frameworks/) та розширювати функціональність програми (PlugIns/).

  • Локалізація: Структура підтримує кілька мов, полегшуючи глобальне охоплення програми, включаючи ресурси для специфічних мовних пакетів.

Info.plist

Info.plist служить основою для iOS програм, інкапсулюючи ключові дані конфігурації у формі пар ключ-значення. Цей файл є обов'язковим не лише для програм, але й для розширень програм та фреймворків, упакованих разом. Він структурований у форматі XML або бінарному форматі та містить критичну інформацію, починаючи від дозволів програми до конфігурацій безпеки. Для детального вивчення доступних ключів можна звернутися до Apple Developer Documentation.

Для тих, хто хоче працювати з цим файлом у більш доступному форматі, конвертацію в XML можна здійснити без зусиль за допомогою plutil на macOS (доступний нативно на версіях 10.2 і пізніше) або plistutil на Linux. Команди для конвертації такі:

  • Для macOS:

$ plutil -convert xml1 Info.plist
  • Для Linux:

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

Серед безлічі інформації, яку може розкрити файл Info.plist, помітні записи включають рядки дозволів додатка (UsageDescription), користувацькі URL-схеми (CFBundleURLTypes) та конфігурації для App Transport Security (NSAppTransportSecurity). Ці записи, разом з іншими, такими як експортовані/імпортовані користувацькі типи документів (UTExportedTypeDeclarations / UTImportedTypeDeclarations), можна без зусиль знайти, перевіряючи файл або використовуючи просту команду grep:

$ grep -i <keyword> Info.plist

Шляхи Даних

У середовищі iOS каталоги призначені спеціально для системних додатків та додатків, встановлених користувачем. Системні додатки розташовані в каталозі /Applications, тоді як додатки, встановлені користувачем, знаходяться під /var/mobile/containers/Data/Application/. Ці додатки отримують унікальний ідентифікатор, відомий як 128-бітний UUID, що ускладнює завдання ручного знаходження папки додатка через випадковість назв каталогів.

Оскільки додатки в iOS повинні бути в пісочниці, кожен додаток також матиме папку всередині $HOME/Library/Containers з CFBundleIdentifier додатка як назва папки.

Однак обидві папки (папки даних та контейнерів) мають файл .com.apple.mobile_container_manager.metadata.plist, який пов'язує обидва файли за ключем MCMetadataIdentifier.

Щоб полегшити виявлення каталогу встановлення додатка, встановленого користувачем, інструмент objection надає корисну команду env. Ця команда розкриває детальну інформацію про каталог для відповідного додатка. Нижче наведено приклад використання цієї команди:

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

Альтернативно, ім'я програми можна знайти в /private/var/containers, використовуючи команду find:

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

Команди, такі як ps та lsof, також можуть бути використані для ідентифікації процесу програми та переліку відкритих файлів відповідно, надаючи інформацію про активні директорії програми:

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

Bundle directory:

  • AppName.app

  • Це пакет програми, як було зазначено раніше в IPA, він містить основні дані програми, статичний контент, а також скомпільований бінарний файл програми.

  • Ця директорія видима для користувачів, але користувачі не можуть записувати в неї.

  • Контент у цій директорії не резервується.

  • Вміст цієї папки використовується для перевірки підпису коду.

Data directory:

  • Documents/

  • Містить всі дані, створені користувачем. Кінцевий користувач програми ініціює створення цих даних.

  • Видима для користувачів і користувачі можуть записувати в неї.

  • Контент у цій директорії резервується.

  • Програма може вимкнути шляхи, встановивши NSURLIsExcludedFromBackupKey.

  • Library/

  • Містить всі файли, які не є специфічними для користувача, такі як кеші, налаштування, куки та файли конфігурації списку властивостей (plist).

  • iOS програми зазвичай використовують підкаталоги Application Support та Caches, але програма може створювати власні підкаталоги.

  • Library/Caches/

  • Містить напівпостійні кешовані файли.

  • Невидима для користувачів і користувачі не можуть записувати в неї.

  • Контент у цій директорії не резервується.

  • ОС може автоматично видаляти файли цієї директорії, коли програма не працює і місця для зберігання недостатньо.

  • Library/Application Support/

  • Містить постійні файли, необхідні для роботи програми.

  • Невидима для користувачів і користувачі не можуть записувати в неї.

  • Контент у цій директорії резервується.

  • Програма може вимкнути шляхи, встановивши NSURLIsExcludedFromBackupKey.

  • Library/Preferences/

  • Використовується для зберігання властивостей, які можуть зберігатися навіть після перезапуску програми.

  • Інформація зберігається, нешифрована, всередині пісочниці програми у файлі plist під назвою [BUNDLE_ID].plist.

  • Усі пари ключ/значення, збережені за допомогою NSUserDefaults, можна знайти в цьому файлі.

  • tmp/

  • Використовуйте цю директорію для запису тимчасових файлів, які не потрібно зберігати між запусками програми.

  • Містить непостійні кешовані файли.

  • Невидима для користувачів.

  • Контент у цій директорії не резервується.

  • ОС може автоматично видаляти файли цієї директорії, коли програма не працює і місця для зберігання недостатньо.

Давайте ближче розглянемо пакет програми iGoat-Swift (.app) у директорії Bundle (/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 ви знайдете бінарний файл під назвою <application-name>. Це файл, який буде виконуватись. Ви можете виконати базову перевірку бінарного файлу за допомогою інструменту otool:

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)
[...]

Перевірте, чи зашифровано додаток

Перевірте, чи є будь-який вихід для:

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

Дизасемблювання бінарного файлу

Дизасемблюйте текстовий розділ:

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

Щоб надрукувати Objective-C сегмент зразкової програми, можна використати:

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

Щоб отримати більш компактний код Objective-C, ви можете використовувати class-dump:

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;
};

Однак, найкращими варіантами для дизасемблювання бінарного коду є: Hopper та IDA.

Використовуйте Trickest, щоб легко створювати та автоматизувати робочі процеси, підтримувані найсучаснішими інструментами спільноти. Отримайте доступ сьогодні:

Зберігання даних

Щоб дізнатися, як iOS зберігає дані на пристрої, прочитайте цю сторінку:

iOS Basics

Наступні місця для зберігання інформації слід перевірити відразу після встановлення програми, після перевірки всіх функцій програми і навіть після виходу з одного користувача та входу в іншого. Мета полягає в тому, щоб знайти незахищену чутливу інформацію програми (паролі, токени), поточного користувача та раніше увійшлих користувачів.

Plist

plist файли - це структуровані XML файли, які містять пари ключ-значення. Це спосіб зберігати постійні дані, тому іноді ви можете знайти чутливу інформацію в цих файлах. Рекомендується перевіряти ці файли після встановлення програми та після інтенсивного використання, щоб побачити, чи записуються нові дані.

Найпоширеніший спосіб зберігання даних у plist файлах - це використання NSUserDefaults. Цей plist файл зберігається всередині пісочниці програми в Library/Preferences/<appBundleID>.plist

Клас NSUserDefaults надає програмний інтерфейс для взаємодії з системою за замовчуванням. Система за замовчуванням дозволяє програмі налаштовувати свою поведінку відповідно до уподобань користувача. Дані, збережені за допомогою NSUserDefaults, можна переглядати в пакеті програми. Цей клас зберігає дані в plist файлі, але призначений для використання з невеликою кількістю даних.

Ці дані більше не можуть бути доступні безпосередньо через надійний комп'ютер, але можуть бути доступні шляхом виконання резервного копіювання.

Ви можете вивантажити інформацію, збережену за допомогою NSUserDefaults, використовуючи ios nsuserdefaults get від objection.

Щоб знайти всі plist, які використовуються програмою, ви можете отримати доступ до /private/var/mobile/Containers/Data/Application/{APPID} і виконати:

find ./ -name "*.plist"

Щоб конвертувати файли з XML або бінарного (bplist) формату в XML, доступні різні методи в залежності від вашої операційної системи:

Для користувачів macOS: Використовуйте команду plutil. Це вбудований інструмент в macOS (10.2+), призначений для цієї мети:

$ plutil -convert xml1 Info.plist

Для користувачів Linux: Спочатку встановіть libplist-utils, а потім використовуйте plistutil для конвертації вашого файлу:

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

У сесії Objection: Для аналізу мобільних додатків спеціальна команда дозволяє вам безпосередньо конвертувати файли plist:

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

Core Data

Core Data — це фреймворк для управління модельним шаром об'єктів у вашому додатку. Core Data може використовувати SQLite як своє постійне сховище, але сам фреймворк не є базою даних. CoreData за замовчуванням не шифрує свої дані. Однак, додатковий шар шифрування може бути доданий до CoreData. Дивіться GitHub Repo для отримання додаткової інформації.

Ви можете знайти інформацію про SQLite Core Data додатку за шляхом /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support

Якщо ви можете відкрити SQLite і отримати доступ до чутливої інформації, то ви знайшли неправильну конфігурацію.

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. Оскільки бази даних Yap є базами даних sqlite, ви можете знайти їх, використовуючи запропоновану команду в попередньому розділі.

Інші бази даних SQLite

Звичайно, що програми створюють свої власні бази даних sqlite. Вони можуть зберігати чутливі дані на них і залишати їх незашифрованими. Тому завжди цікаво перевіряти кожну базу даних у каталозі додатків. Тому перейдіть до каталогу програми, де зберігаються дані (/private/var/mobile/Containers/Data/Application/{APPID})

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

Firebase Real-Time Databases

Розробники можуть зберігати та синхронізувати дані в NoSQL хмарній базі даних через Firebase Real-Time Databases. Дані, збережені у форматі JSON, синхронізуються з усіма підключеними клієнтами в реальному часі.

Ви можете дізнатися, як перевірити неправильно налаштовані Firebase бази даних тут:

Firebase Database

Realm databases

Realm Objective-C та Realm Swift пропонують потужну альтернативу для зберігання даних, яку не надає Apple. За замовчуванням, вони зберігають дані без шифрування, з можливістю шифрування через специфічну конфігурацію.

Бази даних розташовані за адресою: /private/var/mobile/Containers/Data/Application/{APPID}. Щоб дослідити ці файли, можна використовувати команди, такі як:

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*"

Для перегляду цих файлів бази даних рекомендується інструмент Realm Studio.

Щоб реалізувати шифрування в базі даних Realm, можна використовувати наступний фрагмент коду:

// 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 Databases

Couchbase Lite описується як легкий та вбудований механізм бази даних, який слідує документно-орієнтованому (NoSQL) підходу. Розроблений для iOS та macOS, він пропонує можливість безперебійної синхронізації даних.

Щоб виявити потенційні бази даних Couchbase на пристрої, слід перевірити наступний каталог:

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

Cookies

iOS зберігає куки додатків у Library/Cookies/cookies.binarycookies всередині папки кожного додатку. Однак, розробники іноді вирішують зберігати їх у keychain, оскільки згаданий файл куків може бути доступний у резервних копіях.

Щоб перевірити файл куків, ви можете використовувати цей python скрипт або використовувати ios cookies get з objection. Ви також можете використовувати objection, щоб конвертувати ці файли у формат JSON та перевірити дані.

...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

За замовчуванням NSURLSession зберігає дані, такі як HTTP запити та відповіді в базі даних Cache.db. Ця база даних може містити чутливі дані, якщо токени, імена користувачів або будь-яка інша чутлива інформація була кешована. Щоб знайти кешовану інформацію, відкрийте каталог даних програми (/var/mobile/Containers/Data/Application/<UUID>) і перейдіть до /Library/Caches/<Bundle Identifier>. Кеш WebKit також зберігається у файлі Cache.db. Objection може відкрити та взаємодіяти з базою даних за допомогою команди sqlite connect Cache.db, оскільки це нормальна SQLite база даних.

Рекомендується відключити кешування цих даних, оскільки вони можуть містити чутливу інформацію в запиті або відповіді. Наступний список показує різні способи досягнення цього:

  1. Рекомендується видалити кешовані відповіді після виходу з системи. Це можна зробити за допомогою методу, наданого Apple, під назвою removeAllCachedResponses. Ви можете викликати цей метод наступним чином:

URLCache.shared.removeAllCachedResponses()

Цей метод видалить всі кешовані запити та відповіді з файлу Cache.db. 2. Якщо вам не потрібно використовувати переваги куків, рекомендується просто використовувати .ephemeral властивість конфігурації URLSession, яка відключить збереження куків та кешів.

Документація Apple:

Об'єкт конфігурації сесії ephemeral подібний до конфігурації сесії за замовчуванням (див. default), за винятком того, що відповідний об'єкт сесії не зберігає кеші, сховища облікових даних або будь-які дані, пов'язані з сесією, на диску. Натомість дані, пов'язані з сесією, зберігаються в оперативній пам'яті. Єдиний випадок, коли ephemeral сесія записує дані на диск, - це коли ви вказуєте їй записати вміст URL у файл. 3. Кеш також можна відключити, встановивши політику кешування на .notAllowed. Це відключить зберігання кешу будь-яким чином, як в пам'яті, так і на диску.

Snapshots

Коли ви натискаєте кнопку "Додому", iOS знімає знімок поточного екрану, щоб мати можливість здійснити перехід до програми набагато плавніше. Однак, якщо на поточному екрані присутні чутливі дані, вони будуть збережені в зображенні (яке зберігається після перезавантажень). Це знімки, до яких ви також можете отримати доступ, двічі торкнувшись екрана "Додому", щоб перемикатися між програмами.

Якщо iPhone не зламаний, зловмисник повинен мати доступ до пристрою без блокування, щоб побачити ці знімки екрана. За замовчуванням останній знімок зберігається в пісочниці програми в папці Library/Caches/Snapshots/ або Library/SplashBoard/Snapshots (достовірні комп'ютери не можуть отримати доступ до файлової системи з iOX 7.0).

Один зі способів запобігти цій поганій поведінці - це поставити чорний екран або видалити чутливі дані перед зняттям знімка, використовуючи функцію ApplicationDidEnterBackground().

Наступний приклад - це метод усунення, який встановить знімок за замовчуванням.

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];
}

Це встановлює фонове зображення на overlayImage.png щоразу, коли додаток переходить у фоновий режим. Це запобігає витоку чутливих даних, оскільки overlayImage.png завжди перекриває потній вигляд.

Keychain

Для доступу та управління iOS keychain доступні інструменти, такі як Keychain-Dumper, які підходять для джейлбрейкнутіх пристроїв. Крім того, Objection надає команду ios keychain dump для подібних цілей.

Зберігання облікових даних

Клас NSURLCredential ідеально підходить для збереження чутливої інформації безпосередньо в keychain, обходячи необхідність у NSUserDefaults або інших обгортках. Для зберігання облікових даних після входу використовується наступний код Swift: