iOS Basics

Support HackTricks

Розділення привілеїв та пісочниця

В iOS існує розрізнення привілеїв між додатками, доступними користувачеві, та основними процесами системи. Додатки працюють під ідентичністю користувача mobile, тоді як критично важливі системні процеси функціонують як root. Це розділення посилюється механізмом пісочниці, який накладає суворі обмеження на дії, які можуть виконувати додатки. Наприклад, навіть якщо додатки мають однакову ідентичність користувача, їм заборонено отримувати доступ або змінювати дані один одного.

Додатки встановлюються в певний каталог (private/var/mobile/Applications/{random ID}) і мають обмежений доступ для читання до певних системних областей і функцій, таких як SMS та телефонні дзвінки. Доступ до захищених областей викликає спливаюче вікно з запитом на дозвіл користувача.

Захист даних

iOS пропонує розробникам API захисту даних, побудовані на основі Secure Enclave Processor (SEP) — спеціального сопроцесора для криптографічних операцій та управління ключами. SEP забезпечує цілісність захисту даних за допомогою унікального ключа, специфічного для пристрою, ідентифікатора пристрою (UID), вбудованого в нього.

При створенні файлу генерується унікальний 256-бітний ключ шифрування AES, який шифрує вміст файлу. Цей ключ шифрування разом з ідентифікатором класу потім шифрується за допомогою класного ключа та зберігається в метаданих файлу. Дешифрування файлу передбачає використання системного ключа для доступу до метаданих, отримання класного ключа за допомогою ідентифікатора класу, а потім дешифрування унікального ключа шифрування файлу.

iOS визначає чотири класи захисту для безпеки даних, які визначають, коли і як можна отримати доступ до даних:

  • Повний захист (NSFileProtectionComplete): Дані недоступні, поки пристрій не буде розблоковано за допомогою пароля користувача.

  • Захищено, якщо не відкрито (NSFileProtectionCompleteUnlessOpen): Дозволяє доступ до файлу навіть після блокування пристрою, якщо файл був відкритий, коли пристрій був розблокований.

  • Захищено до першої аутентифікації користувача (NSFileProtectionCompleteUntilFirstUserAuthentication): Дані доступні після першого розблокування користувача після завантаження, залишаючись доступними навіть якщо пристрій знову заблоковано.

  • Без захисту (NSFileProtectionNone): Дані захищені лише ідентифікатором пристрою (UID), що полегшує швидке видалення даних віддалено.

Шифрування всіх класів, за винятком NSFileProtectionNone, передбачає ключ, отриманий як з ідентифікатора пристрою (UID), так і з пароля користувача, що забезпечує можливість дешифрування лише на пристрої з правильним паролем. Починаючи з iOS 7, клас захисту за замовчуванням — "Захищено до першої аутентифікації користувача".

Розробники можуть використовувати FileDP, інструмент для перевірки класу захисту даних файлів на iPhone.

# Example code to use FileDP for checking file protection class
# Note: Ensure your device is jailbroken and has Python installed to use FileDP.
# Installation and usage of FileDP:
git clone https://github.com/abjurato/FileDp-Source
cd FileDp-Source
python filedp.py /path/to/check

Ключниця

В iOS Ключниця слугує безпечним зашифрованим контейнером для зберігання чутливої інформації, доступної лише для програми, яка її зберігала, або тих, хто явно авторизований. Це шифрування підкріплене унікальним паролем, згенерованим iOS, який сам по собі зашифрований за допомогою AES. Цей процес шифрування використовує функцію PBKDF2, поєднуючи код доступу користувача з сіллю, отриманою з UID пристрою, компонентом, до якого може отримати доступ лише чіпсет безпечного оточення. Отже, навіть якщо код доступу користувача відомий, вміст Ключниці залишається недоступним на будь-якому пристрої, окрім того, на якому вони були спочатку зашифровані.

Управління та доступ до даних Ключниці здійснюється демоном securityd, на основі специфічних прав доступу програми, таких як Keychain-access-groups та application-identifier.

Операції API Ключниці

API Ключниці, детально описаний у документації Apple з сервісів Ключниці, надає основні функції для управління безпечним зберіганням:

  • SecItemAdd: Додає новий елемент до Ключниці.

  • SecItemUpdate: Оновлює існуючий елемент у Ключниці.

  • SecItemCopyMatching: Отримує елемент з Ключниці.

  • SecItemDelete: Видаляє елемент з Ключниці.

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

Налаштування захисту даних елементів Ключниці

Рівні захисту даних для елементів Ключниці встановлюються за допомогою атрибута kSecAttrAccessible під час створення або оновлення елемента. Ці рівні, як зазначено Apple, визначають, коли і як елементи Ключниці доступні:

  • kSecAttrAccessibleAlways: Доступний у будь-який час, незалежно від статусу блокування пристрою.

  • kSecAttrAccessibleAlwaysThisDeviceOnly: Завжди доступний, але не включений у резервні копії.

  • kSecAttrAccessibleAfterFirstUnlock: Доступний після першого розблокування після перезавантаження.

  • kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly: Те ж саме, але не підлягає перенесенню на нові пристрої.

  • kSecAttrAccessibleWhenUnlocked: Доступний лише коли пристрій розблоковано.

  • kSecAttrAccessibleWhenUnlockedThisDeviceOnly: Доступний при розблокуванні, не включений у резервні копії.

  • kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly: Вимагає код доступу пристрою, не включений у резервні копії.

AccessControlFlags додатково уточнюють методи доступу, дозволяючи біометричну аутентифікацію або використання коду доступу.

Попередження про джейлбрейкнуті пристрої

На джейлбрейкнутіх пристроях захисти Ключниці скомпрометовані, що становить значний ризик безпеки.

Стійкість даних Ключниці

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

let userDefaults = UserDefaults.standard

if userDefaults.bool(forKey: "hasRunBefore") == false {
// Remove Keychain items here

// Update the flag indicator
userDefaults.set(true, forKey: "hasRunBefore")
userDefaults.synchronize() // Forces the app to update UserDefaults
}

Можливості додатків

У сфері розробки додатків пісочниця відіграє важливу роль у підвищенні безпеки. Цей процес забезпечує, що кожен додаток працює у своїй унікальній домашній директорії, запобігаючи доступу до системних файлів або даних, що належать іншим додаткам. Вимушення цих обмежень здійснюється через політики пісочниці, які є частиною Trusted BSD (MAC) Mandatory Access Control Framework.

Розробники мають можливість налаштовувати певні можливості або дозволи для своїх додатків, такі як Захист даних або Спільний доступ до ключів. Ці дозволи застосовуються відразу після встановлення додатка. Проте, для доступу до певних захищених ресурсів, додаток повинен отримати явну згоду користувача під час першої спроби. Це досягається за допомогою рядків мети або рядків опису використання, які подаються користувачам у сповіщенні про запит дозволу.

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

  1. Відкриття проекту в Xcode.

  2. Знаходження та відкриття файлу Info.plist.

  3. Пошуку ключів, що починаються з "Privacy -", з можливістю перегляду сирих ключів/значень для ясності.

При роботі з файлом IPA можна виконати такі кроки:

  1. Розпакувати IPA.

  2. Знайти файл Info.plist у Payload/<appname>.app/.

  3. Перетворити файл у формат XML, якщо це необхідно, для легшої перевірки.

Наприклад, рядки мети у файлі Info.plist можуть виглядати так:

<plist version="1.0">
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Your location is used to provide turn-by-turn directions to your destination.</string>

Device Capabilities

Файл Info.plist програми вказує можливості пристрою, які допомагають App Store фільтрувати програми за сумісністю з пристроєм. Вони визначені під ключем UIRequiredDeviceCapabilities. Наприклад:

<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>

Цей приклад вказує на те, що додаток сумісний з набором інструкцій armv7. Розробники також можуть вказувати можливості, такі як nfc, щоб забезпечити доступність свого додатку лише для пристроїв, що підтримують NFC.

Права

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

Посилання

Support HackTricks

Last updated