tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

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

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

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

Захист даних

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

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

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

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

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

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

python
# 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 додатково уточнюють методи доступу, дозволяючи біометричну аутентифікацію або використання коду доступу.

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

warning

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

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

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

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 можуть виглядати так:

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

Можливості пристрою

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

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

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

Права

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

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks