Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github.
# Separacja uprawnień i piaskownica
W systemie iOS istnieje rozróżnienie w uprawnieniach między aplikacjami dostępnymi dla użytkownika a podstawowymi procesami systemu. Aplikacje działają pod tożsamością użytkownika **`mobile`**, podczas gdy kluczowe procesy systemowe działają jako **`root`**. Ta separacja jest wzmacniana przez mechanizm piaskownicy, który narzuca ścisłe ograniczenia na działania, jakie mogą podjąć aplikacje. Na przykład, nawet jeśli aplikacje mają tę samą tożsamość użytkownika, są zabronione przed dostępem lub modyfikacją danych innych aplikacji.
Aplikacje są instalowane w określonym katalogu (`private/var/mobile/Applications/{losowy ID}`) i mają ograniczony dostęp do odczytu do określonych obszarów i funkcji systemowych, takich jak SMS-y i połączenia telefoniczne. Dostęp do chronionych obszarów powoduje wyświetlenie prośby o zgodę użytkownika.
# Ochrona danych
iOS oferuje programistom interfejsy API ochrony danych, zbudowane na procesorze Secure Enclave (SEP) - dedykowanym koprocesorze do operacji kryptograficznych i zarządzania kluczami. SEP zapewnia integralność ochrony danych za pomocą unikalnego klucza specyficznego dla urządzenia, UID urządzenia, wbudowanego w niego.
Podczas tworzenia pliku generowany jest unikalny klucz szyfrowania AES o długości 256 bitów, który szyfruje zawartość pliku. Ten klucz szyfrowania, wraz z identyfikatorem klasy, jest następnie szyfrowany za pomocą klucza klasy i przechowywany w metadanych pliku. Deszyfrowanie pliku polega na użyciu klucza systemowego do uzyskania dostępu do metadanych, pobraniu klucza klasy z identyfikatorem klasy, a następnie deszyfrowaniu unikalnego klucza szyfrowania pliku.
iOS definiuje **cztery klasy ochrony** dla bezpieczeństwa danych, które określają, kiedy i w jaki sposób można uzyskać dostęp do danych:
- **Pełna ochrona (NSFileProtectionComplete)**: Dane są niedostępne do momentu odblokowania urządzenia za pomocą kodu dostępu użytkownika.
- **Chronione, chyba że otwarte (NSFileProtectionCompleteUnlessOpen)**: Umożliwia dostęp do pliku nawet po zablokowaniu urządzenia, pod warunkiem, że plik został otwarty, gdy urządzenie było odblokowane.
- **Chronione do pierwszej autoryzacji użytkownika (NSFileProtectionCompleteUntilFirstUserAuthentication)**: Dane są dostępne po pierwszym odblokowaniu przez użytkownika po uruchomieniu, pozostając dostępnymi nawet po ponownym zablokowaniu urządzenia.
- **Brak ochrony (NSFileProtectionNone)**: Dane są chronione tylko przez UID urządzenia, ułatwiając szybkie zdalne usuwanie danych.
Szyfrowanie wszystkich klas, z wyjątkiem `NSFileProtectionNone`, obejmuje klucz pochodzący zarówno z UID urządzenia, jak i z kodu dostępu użytkownika, zapewniając, że deszyfrowanie jest możliwe tylko na urządzeniu z prawidłowym kodem dostępu. Od wersji iOS 7 domyślną klasą ochrony jest "Chronione do pierwszej autoryzacji użytkownika".
Programiści mogą używać [**FileDP**](https://github.com/abjurato/FileDp-Source), narzędzia do sprawdzania klasy ochrony danych plików na iPhone'ie.
```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
```
## **Keychain**
W systemie iOS **Keychain** służy jako bezpieczny **zaszyfrowany kontener** do przechowywania **wrażliwych informacji**, dostępny tylko dla aplikacji, która je przechowuje lub dla tych, które są wyraźnie autoryzowane. Szyfrowanie to jest wzmacniane przez unikalne **hasło generowane przez iOS**, które samo w sobie jest zaszyfrowane za pomocą **AES**. Proces szyfrowania wykorzystuje funkcję **PBKDF2**, łącząc kod dostępu użytkownika z solą pochodzącą z **UID** urządzenia, do którego dostęp ma tylko **bezpieczny chipset enklawy**. W rezultacie, nawet jeśli kod dostępu użytkownika jest znany, zawartość Keychain pozostaje niedostępna na jakimkolwiek innym urządzeniu niż to, na którym została pierwotnie zaszyfrowana.
**Zarządzanie i dostęp** do danych Keychain są obsługiwane przez demon **`securityd`**, na podstawie określonych uprawnień aplikacji, takich jak `Keychain-access-groups` i `application-identifier`.
### **Operacje API Keychain**
API Keychain, szczegółowo opisane w [dokumentacji Apple dotyczącej usług Keychain](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html), zapewniają podstawowe funkcje zarządzania bezpiecznym przechowywaniem:
- **`SecItemAdd`**: Dodaje nowy element do Keychain.
- **`SecItemUpdate`**: Aktualizuje istniejący element w Keychain.
- **`SecItemCopyMatching`**: Pobiera element z Keychain.
- **`SecItemDelete`**: Usuwa element z Keychain.
Atakowanie hasła Keychain polega na atakowaniu bezpośrednio zaszyfrowanego klucza lub próbie odgadnięcia kodu dostępu na samym urządzeniu, co jest znacznie utrudnione przez wymuszenie przez bezpieczną enklawę opóźnienia między nieudanymi próbami.
### **Konfigurowanie ochrony danych elementów Keychain**
Poziomy ochrony danych dla elementów Keychain są ustawiane za pomocą atrybutu `kSecAttrAccessible` podczas tworzenia lub aktualizacji elementu. Te poziomy, [zgodnie z wytycznymi Apple](https://developer.apple.com/documentation/security/keychain_services/keychain_items/item_attribute_keys_and_values#1679100), określają, kiedy i w jaki sposób elementy Keychain są dostępne:
- **`kSecAttrAccessibleAlways`**: Dostępne zawsze, niezależnie od stanu blokady urządzenia.
- **`kSecAttrAccessibleAlwaysThisDeviceOnly`**: Zawsze dostępne, ale nie uwzględniane w kopii zapasowej.
- **`kSecAttrAccessibleAfterFirstUnlock`**: Dostępne po pierwszym odblokowaniu po restarcie.
- **`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly`**: To samo co powyżej, ale nieprzenośne na nowe urządzenia.
- **`kSecAttrAccessibleWhenUnlocked`**: Dostępne tylko po odblokowaniu urządzenia.
- **`kSecAttrAccessibleWhenUnlockedThisDeviceOnly`**: Dostępne po odblokowaniu, nie uwzględniane w kopii zapasowej.
- **`kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly`**: Wymaga kodu dostępu do urządzenia, nie uwzględniane w kopii zapasowej.
**`AccessControlFlags`** dodatkowo precyzują metody dostępu, umożliwiając uwierzytelnianie biometryczne lub użycie kodu dostępu.
### **Ostrzeżenie dotyczące urządzeń z jailbreakiem**
{% hint style="warning" %}
Na **urządzeniach z jailbreakiem**, ochrona Keychain jest naruszona, co stanowi znaczne ryzyko dla bezpieczeństwa.
{% endhint %}
### **Trwałość danych Keychain**
W przeciwieństwie do danych specyficznych dla aplikacji, które są usuwane po odinstalowaniu aplikacji, dane Keychain pozostają na urządzeniu. Ta cecha może umożliwić nowym właścicielom używanego urządzenia dostęp do danych aplikacji poprzedniego właściciela, po prostu ponownie instalując aplikacje. Zaleca się, aby programiści aktywnie usuwali dane Keychain podczas instalacji aplikacji lub podczas wylogowywania się, aby zminimalizować to ryzyko. Oto przykład kodu Swift, który pokazuje, jak usunąć dane Keychain podczas pierwszego uruchomienia aplikacji:
```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
}
```
# **Zdolności aplikacji**
W dziedzinie tworzenia aplikacji, **sandboxing** odgrywa kluczową rolę w poprawie bezpieczeństwa. Ten proces zapewnia, że każda aplikacja działa w swoim unikalnym katalogu domowym, co uniemożliwia jej dostęp do plików systemowych lub danych należących do innych aplikacji. Egzekucja tych ograniczeń odbywa się poprzez polityki sandboxu, które są częścią **Trusted BSD (MAC) Mandatory Access Control Framework**.
Deweloperzy mają możliwość konfigurowania określonych **zdolności lub uprawnień** dla swoich aplikacji, takich jak **Ochrona danych** lub **Współdzielenie kluczy Keychain**. Te uprawnienia są stosowane natychmiast po zainstalowaniu aplikacji. Niemniej jednak, aby uzyskać dostęp do określonych chronionych zasobów, aplikacja musi uzyskać wyraźną zgodę użytkownika podczas pierwszej próby. Jest to osiągane poprzez użycie _ciągów celu_ lub _opisów użycia_, które są prezentowane użytkownikom w prośbie o zgodę.
Dla osób mających dostęp do kodu źródłowego, weryfikacja uprawnień zawartych w pliku `Info.plist` może być wykonana poprzez:
1. Otwarcie projektu w Xcode.
2. Zlokalizowanie i otwarcie pliku `Info.plist`.
3. Wyszukiwanie kluczy z prefiksem `"Privacy -"`, z opcją wyświetlania surowych kluczy/wartości dla większej czytelności.
Przy pracy z plikiem IPA można postępować według następujących kroków:
1. Rozpakowanie pliku IPA.
2. Zlokalizowanie pliku `Info.plist` w folderze `Payload/.app/`.
3. Konwersja pliku do formatu XML, jeśli jest to konieczne, dla łatwiejszej inspekcji.
Na przykład, ciągi celu w pliku `Info.plist` mogą wyglądać tak:
```xml
NSLocationWhenInUseUsageDescription
Your location is used to provide turn-by-turn directions to your destination.
```
## Możliwości urządzenia
Plik `Info.plist` aplikacji określa **możliwości urządzenia**, które pomagają Sklepowi App w filtrowaniu aplikacji pod kątem kompatybilności urządzenia. Są one zdefiniowane w kluczu **`UIRequiredDeviceCapabilities`**. Na przykład:
```xml
UIRequiredDeviceCapabilities
armv7
```
Ten przykład wskazuje, że aplikacja jest kompatybilna z zestawem instrukcji armv7. Deweloperzy mogą również określić możliwości, takie jak nfc, aby upewnić się, że ich aplikacja jest dostępna tylko na urządzeniach obsługujących NFC.
## Uprawnienia
**Uprawnienia** są kolejnym istotnym aspektem tworzenia aplikacji iOS i służą jako pary klucz-wartość, które nadają aplikacjom uprawnienia do wykonywania określonych operacji poza sprawdzaniem czasu wykonania. Na przykład, włączenie **Ochrony danych** w aplikacji polega na dodaniu określonego uprawnienia w projekcie Xcode, które jest następnie odzwierciedlane w pliku uprawnień aplikacji lub osadzonym pliku zabezpieczeń mobilnych dla plików IPA.
# Odwołania
* [https://mas.owasp.org/MASTG/iOS/0x06d-Testing-Data-Storage](https://mas.owasp.org/MASTG/iOS/0x06d-Testing-Data-Storage)
* [https://github.com/OWASP/owasp-mastg/blob/master/Document/0x06h-Testing-Platform-Interaction.md](https://github.com/OWASP/owasp-mastg/blob/master/Document/0x06h-Testing-Platform-Interaction.md)
* [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0069/](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0069/)
* [https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/](https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/)
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.