iOS Basics

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

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, narzędzia do sprawdzania klasy ochrony danych plików na iPhone'ie.

# 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, 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, 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

Na urządzeniach z jailbreakiem, ochrona Keychain jest naruszona, co stanowi znaczne ryzyko dla bezpieczeństwa.

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:

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/<nazwa_aplikacji>.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:

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

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:

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

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

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated