iOS Basics

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Privilegentrennung und Sandbox

In iOS besteht ein Unterschied in den Privilegien zwischen den für Benutzer zugänglichen Anwendungen und den Kernprozessen des Systems. Anwendungen werden unter der Benutzeridentität mobile ausgeführt, während die wichtigen Systemprozesse als root arbeiten. Diese Trennung wird durch einen Sandbox-Mechanismus verstärkt, der strenge Einschränkungen für die Aktionen auferlegt, die Anwendungen durchführen können. Zum Beispiel ist es Anwendungen, auch wenn sie dieselbe Benutzeridentität teilen, untersagt, auf die Daten anderer Anwendungen zuzugreifen oder diese zu ändern.

Anwendungen werden in einem bestimmten Verzeichnis (private/var/mobile/Applications/{zufällige ID}) installiert und haben eingeschränkten Lesezugriff auf bestimmte Systembereiche und -funktionen, wie SMS und Telefonanrufe. Der Zugriff auf geschützte Bereiche löst eine Popup-Anfrage zur Benutzerberechtigung aus.

Datenschutz

iOS bietet Entwicklern die Data Protection APIs, die auf dem Secure Enclave Processor (SEP) aufbauen - einem dedizierten Coprozessor für kryptografische Operationen und Schlüsselverwaltung. Der SEP gewährleistet die Integrität des Datenschutzes durch einen eindeutigen gerätespezifischen Schlüssel, die Geräte-UID, die darin eingebettet ist.

Bei der Erstellung einer Datei wird ein eindeutiger 256-Bit-AES-Verschlüsselungsschlüssel generiert, der den Inhalt der Datei verschlüsselt. Dieser Verschlüsselungsschlüssel wird zusammen mit einer Klassen-ID mit einem Klassenschlüssel verschlüsselt und in den Metadaten der Datei gespeichert. Das Entschlüsseln einer Datei beinhaltet die Verwendung des Systemschlüssels zum Zugriff auf die Metadaten, das Abrufen des Klassenschlüssels mit der Klassen-ID und anschließend das Entschlüsseln des eindeutigen Verschlüsselungsschlüssels der Datei.

iOS definiert vier Schutzklassen für die Datensicherheit, die bestimmen, wann und wie auf Daten zugegriffen werden kann:

  • Vollständiger Schutz (NSFileProtectionComplete): Daten sind nicht zugänglich, bis das Gerät mit dem Passcode des Benutzers entsperrt wird.

  • Geschützt, es sei denn, geöffnet (NSFileProtectionCompleteUnlessOpen): Ermöglicht den Dateizugriff auch nach dem Sperren des Geräts, sofern die Datei geöffnet wurde, als das Gerät entsperrt war.

  • Geschützt bis zur ersten Benutzerauthentifizierung (NSFileProtectionCompleteUntilFirstUserAuthentication): Daten sind nach der ersten Benutzerentsperrung nach dem Booten zugänglich und bleiben auch dann zugänglich, wenn das Gerät erneut gesperrt wird.

  • Kein Schutz (NSFileProtectionNone): Daten sind nur durch die Geräte-UID geschützt und ermöglichen schnelles Löschen von Remote-Daten.

Die Verschlüsselung aller Klassen, außer NSFileProtectionNone, erfolgt mit einem Schlüssel, der sowohl aus der Geräte-UID als auch aus dem Passcode des Benutzers abgeleitet wird, um sicherzustellen, dass die Entschlüsselung nur auf dem Gerät mit dem richtigen Passcode möglich ist. Ab iOS 7 ist die Standard-Schutzklasse "Geschützt bis zur ersten Benutzerauthentifizierung".

Entwickler können FileDP verwenden, ein Tool zum Überprüfen der Datenschutzklasse von Dateien auf einem 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

Der Schlüsselbund

In iOS dient ein Schlüsselbund als sicherer verschlüsselter Container zum Speichern von sensiblen Informationen, der nur von der Anwendung, die sie gespeichert hat, oder von explizit autorisierten Anwendungen zugänglich ist. Diese Verschlüsselung wird durch ein einzigartiges von iOS generiertes Passwort verstärkt, das selbst mit AES verschlüsselt ist. Dieser Verschlüsselungsprozess nutzt eine PBKDF2-Funktion, die den Passcode des Benutzers mit einem aus der UID des Geräts abgeleiteten Salt kombiniert, auf den nur der sichere Enklaven-Chipsatz zugreifen kann. Selbst wenn der Passcode des Benutzers bekannt ist, bleiben die Inhalte des Schlüsselbunds auf jedem anderen Gerät als demjenigen, auf dem sie ursprünglich verschlüsselt wurden, unzugänglich.

Die Verwaltung und der Zugriff auf die Daten des Schlüsselbunds werden vom securityd-Daemon über spezifische App-Berechtigungen wie Keychain-access-groups und application-identifier gehandhabt.

Keychain-API-Operationen

Die Keychain-API, die in der Dokumentation von Apple zu Keychain Services detailliert beschrieben ist, bietet wesentliche Funktionen für das Management der sicheren Speicherung:

  • SecItemAdd: Fügt dem Schlüsselbund einen neuen Eintrag hinzu.

  • SecItemUpdate: Aktualisiert einen vorhandenen Eintrag im Schlüsselbund.

  • SecItemCopyMatching: Ruft einen Eintrag aus dem Schlüsselbund ab.

  • SecItemDelete: Entfernt einen Eintrag aus dem Schlüsselbund.

Das Brute-Forcing des Schlüsselbund-Passworts beinhaltet entweder den direkten Angriff auf den verschlüsselten Schlüssel oder den Versuch, den Passcode auf dem Gerät selbst zu erraten, wobei die Durchsetzung einer Verzögerung zwischen fehlgeschlagenen Versuchen durch den sicheren Enklaven-Chipsatz erheblich behindert wird.

Konfiguration des Schutzes von Schlüsselbunddaten

Die Schutzstufen für Schlüsselbundeinträge werden mithilfe des Attributs kSecAttrAccessible während der Erstellung oder Aktualisierung des Eintrags festgelegt. Diese Stufen, wie von Apple angegeben, bestimmen, wann und wie Schlüsselbundeinträge zugänglich sind:

  • kSecAttrAccessibleAlways: Jederzeit zugänglich, unabhängig vom Sperrstatus des Geräts.

  • kSecAttrAccessibleAlwaysThisDeviceOnly: Immer zugänglich, aber nicht in Backups enthalten.

  • kSecAttrAccessibleAfterFirstUnlock: Nach dem ersten Entsperren nach dem Neustart zugänglich.

  • kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly: Wie oben, aber nicht auf neue Geräte übertragbar.

  • kSecAttrAccessibleWhenUnlocked: Nur zugänglich, wenn das Gerät entsperrt ist.

  • kSecAttrAccessibleWhenUnlockedThisDeviceOnly: Zugänglich, wenn entsperrt, nicht in Backups enthalten.

  • kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly: Erfordert Geräte-Passcode, nicht in Backups enthalten.

AccessControlFlags verfeinern den Zugriff weiter und ermöglichen die biometrische Authentifizierung oder die Verwendung des Passcodes.

Warnung bei gejailbreakten Geräten

Auf gejailbreakten Geräten sind die Schutzmaßnahmen des Schlüsselbunds beeinträchtigt und stellen ein erhebliches Sicherheitsrisiko dar.

Persistenz von Schlüsselbunddaten

Im Gegensatz zu app-spezifischen Daten, die beim Deinstallieren der App gelöscht werden, bleiben Schlüsselbunddaten auf dem Gerät erhalten. Diese Eigenschaft könnte es neuen Besitzern eines gebrauchten Geräts ermöglichen, einfach durch erneutes Installieren von Apps auf die Anwendungsdaten des vorherigen Besitzers zuzugreifen. Entwickler werden empfohlen, proaktiv Schlüsselbunddaten beim Installieren der App oder beim Abmelden zu löschen, um dieses Risiko zu mindern. Hier ist ein Swift-Code-Beispiel, das zeigt, wie man Schlüsselbunddaten beim ersten Start der App löscht:

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
}

App-Fähigkeiten

Im Bereich der App-Entwicklung spielt Sandboxing eine entscheidende Rolle bei der Verbesserung der Sicherheit. Dieser Prozess stellt sicher, dass jede App in ihrem eigenen eindeutigen Home-Verzeichnis arbeitet und somit keinen Zugriff auf Systemdateien oder Daten anderer Apps hat. Die Durchsetzung dieser Einschränkungen erfolgt durch Sandbox-Richtlinien, die Teil des Trusted BSD (MAC) Mandatory Access Control Frameworks sind.

Entwickler haben die Möglichkeit, bestimmte Fähigkeiten oder Berechtigungen für ihre Apps zu konfigurieren, wie z.B. Datenschutz oder Keychain Sharing. Diese Berechtigungen werden unmittelbar nach der Installation der App angewendet. Um jedoch auf bestimmte geschützte Ressourcen zugreifen zu können, muss die App die explizite Zustimmung des Benutzers zum Zeitpunkt des ersten Versuchs einholen. Dies wird durch die Verwendung von Zweck-Strings oder Verwendungszweck-Beschreibungs-Strings erreicht, die Benutzern in einer Berechtigungsanfrage angezeigt werden.

Für diejenigen, die Zugriff auf den Quellcode haben, kann die Überprüfung der Berechtigungen, die in der Info.plist-Datei enthalten sind, wie folgt erfolgen:

  1. Das Projekt in Xcode öffnen.

  2. Die Info.plist-Datei suchen und öffnen.

  3. Nach Schlüsseln suchen, die mit "Privacy -" beginnen, mit der Option, Rohschlüssel/Werte zur besseren Übersicht anzuzeigen.

Bei der Arbeit mit einer IPA-Datei können die folgenden Schritte befolgt werden:

  1. Die IPA-Datei entpacken.

  2. Die Info.plist-Datei innerhalb von Payload/<appname>.app/ suchen.

  3. Die Datei bei Bedarf in das XML-Format konvertieren, um sie einfacher zu überprüfen.

Beispielhaft könnten die Zweck-Strings in der Info.plist-Datei wie folgt aussehen:

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

Gerätefähigkeiten

Die Info.plist-Datei einer App gibt die Gerätefähigkeiten an, die dem App Store helfen, Apps nach Gerätekompatibilität zu filtern. Diese werden unter dem Schlüssel UIRequiredDeviceCapabilities definiert. Zum Beispiel:

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

Dieses Beispiel zeigt, dass die App mit dem Befehlssatz armv7 kompatibel ist. Entwickler können auch Fähigkeiten wie NFC angeben, um sicherzustellen, dass ihre App nur auf Geräten verfügbar ist, die NFC unterstützen.

Berechtigungen

Berechtigungen sind ein weiterer wichtiger Aspekt der iOS-App-Entwicklung und dienen als Schlüssel-Wert-Paare, die Apps die Erlaubnis geben, bestimmte Operationen über Laufzeitprüfungen hinaus durchzuführen. Zum Beispiel erfordert das Aktivieren des Daten­schutzes in einer App das Hinzufügen einer spezifischen Berechtigung im Xcode-Projekt, die sich dann in der Berechtigungsdatei der App oder der eingebetteten mobilen Bereitstellungsdatei für IPAs widerspiegelt.

Referenzen

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated