hacktricks/mobile-pentesting/ios-pentesting/ios-basics.md

157 lines
14 KiB
Markdown
Raw Normal View History

2022-04-28 16:01:33 +00:00
<details>
2024-02-10 13:03:23 +00:00
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:03:23 +00:00
Altri modi per supportare HackTricks:
2022-04-28 16:01:33 +00:00
2024-02-10 13:03:23 +00:00
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT**](https://opensea.io/collection/the-peass-family) esclusivi
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
2022-04-28 16:01:33 +00:00
</details>
2024-02-10 13:03:23 +00:00
# Separazione dei privilegi e sandbox
2024-02-10 13:03:23 +00:00
In iOS, esiste una distinzione di privilegi tra le applicazioni accessibili dall'utente e i processi principali del sistema. Le applicazioni vengono eseguite con l'identità utente **`mobile`**, mentre i processi principali del sistema operano come **`root`**. Questa separazione è potenziata da un meccanismo di sandbox, che impone rigorose limitazioni sulle azioni che le applicazioni possono intraprendere. Ad esempio, anche se le applicazioni condividono la stessa identità utente, è loro vietato accedere o modificare i dati delle altre applicazioni.
2024-02-10 13:03:23 +00:00
Le applicazioni vengono installate in una directory specifica (`private/var/mobile/Applications/{ID casuale}`) e hanno un accesso in lettura limitato a determinate aree e funzionalità di sistema, come gli SMS e le chiamate telefoniche. L'accesso alle aree protette attiva una richiesta di autorizzazione da parte dell'utente.
2024-02-10 13:03:23 +00:00
# Protezione dei dati
2024-02-10 13:03:23 +00:00
iOS offre agli sviluppatori le **API di protezione dei dati**, costruite sopra il Secure Enclave Processor (SEP) - un coprocessore dedicato alle operazioni crittografiche e alla gestione delle chiavi. Il SEP garantisce l'integrità della protezione dei dati tramite una chiave unica specifica del dispositivo, l'UID del dispositivo, incorporata al suo interno.
2024-02-10 13:03:23 +00:00
Alla creazione di un file, viene generata una chiave di crittografia AES a 256 bit univoca, che cifra il contenuto del file. Questa chiave di crittografia unica, insieme a un ID di classe, viene quindi crittografata utilizzando una chiave di classe e memorizzata all'interno dei metadati del file. La decrittazione di un file comporta l'utilizzo della chiave di sistema per accedere ai metadati, recuperare la chiave di classe con l'ID di classe e quindi decrittare la chiave di crittografia unica del file.
2024-02-10 13:03:23 +00:00
iOS definisce **quattro classi di protezione** per la sicurezza dei dati, che determinano quando e come i dati possono essere accessibili:
2024-02-10 13:03:23 +00:00
- **Protezione completa (NSFileProtectionComplete)**: i dati sono inaccessibili fino a quando il dispositivo non viene sbloccato utilizzando il codice di accesso dell'utente.
- **Protetto a meno che aperto (NSFileProtectionCompleteUnlessOpen)**: consente l'accesso ai file anche dopo il blocco del dispositivo, a condizione che il file sia stato aperto quando il dispositivo era sbloccato.
- **Protetto fino alla prima autenticazione dell'utente (NSFileProtectionCompleteUntilFirstUserAuthentication)**: i dati sono accessibili dopo la prima sblocco dell'utente dopo l'avvio, rimanendo accessibili anche se il dispositivo viene nuovamente bloccato.
- **Nessuna protezione (NSFileProtectionNone)**: i dati sono protetti solo dall'UID del dispositivo, facilitando la cancellazione rapida dei dati remoti.
2024-02-10 13:03:23 +00:00
La crittografia di tutte le classi, tranne `NSFileProtectionNone`, prevede una chiave derivata sia dall'UID del dispositivo che dal codice di accesso dell'utente, garantendo che la decrittazione sia possibile solo sul dispositivo con il codice di accesso corretto. A partire da iOS 7, la classe di protezione predefinita è "Protetto fino alla prima autenticazione dell'utente".
2024-02-10 13:03:23 +00:00
Gli sviluppatori possono utilizzare [**FileDP**](https://github.com/abjurato/FileDp-Source), uno strumento per ispezionare la classe di protezione dei dati dei file su un iPhone.
2024-02-08 03:08:28 +00:00
```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
```
2024-02-10 13:03:23 +00:00
## **Il Portachiavi**
2024-02-10 13:03:23 +00:00
In iOS, un **Portachiavi** funge da **contenitore crittografato sicuro** per memorizzare **informazioni sensibili**, accessibili solo dall'applicazione che le ha memorizzate o da quelle esplicitamente autorizzate. Questa crittografia è rinforzata da una **password univoca generata da iOS**, che a sua volta è crittografata con **AES**. Questo processo di crittografia sfrutta una funzione **PBKDF2**, che combina il codice di accesso dell'utente con un salt derivato dall'**UID** del dispositivo, un componente a cui solo il **chipset del secure enclave** può accedere. Di conseguenza, anche se il codice di accesso dell'utente è noto, i contenuti del Portachiavi rimangono inaccessibili su qualsiasi dispositivo diverso da quello in cui sono stati originariamente crittografati.
2024-02-10 13:03:23 +00:00
La **gestione e l'accesso** ai dati del Portachiavi sono gestiti dal demone **`securityd`**, in base a specifici privilegi dell'app come `Keychain-access-groups` e `application-identifier`.
2024-02-10 13:03:23 +00:00
### **Operazioni API del Portachiavi**
2024-02-10 13:03:23 +00:00
L'API del Portachiavi, descritta nella [documentazione dei servizi del Portachiavi di Apple](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html), fornisce funzioni essenziali per la gestione della memorizzazione sicura:
2024-02-10 13:03:23 +00:00
- **`SecItemAdd`**: Aggiunge un nuovo elemento al Portachiavi.
- **`SecItemUpdate`**: Aggiorna un elemento esistente nel Portachiavi.
- **`SecItemCopyMatching`**: Recupera un elemento dal Portachiavi.
- **`SecItemDelete`**: Rimuove un elemento dal Portachiavi.
2024-02-10 13:03:23 +00:00
Forzare la password del Portachiavi comporta attaccare direttamente la chiave crittografata o tentare di indovinare il codice di accesso sul dispositivo stesso, ostacolato significativamente dal secure enclave che impone un ritardo tra i tentativi falliti.
2024-02-10 13:03:23 +00:00
### **Configurazione della protezione dei dati degli elementi del Portachiavi**
2024-02-10 13:03:23 +00:00
I livelli di protezione dei dati per gli elementi del Portachiavi vengono impostati utilizzando l'attributo `kSecAttrAccessible` durante la creazione o l'aggiornamento dell'elemento. Questi livelli, [come specificato da Apple](https://developer.apple.com/documentation/security/keychain_services/keychain_items/item_attribute_keys_and_values#1679100), determinano quando e come gli elementi del Portachiavi sono accessibili:
2024-02-10 13:03:23 +00:00
- **`kSecAttrAccessibleAlways`**: Accessibile in qualsiasi momento, indipendentemente dallo stato di blocco del dispositivo.
- **`kSecAttrAccessibleAlwaysThisDeviceOnly`**: Sempre accessibile, ma non incluso nei backup.
- **`kSecAttrAccessibleAfterFirstUnlock`**: Accessibile dopo il primo sblocco successivo al riavvio.
- **`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly`**: Come sopra, ma non trasferibile a nuovi dispositivi.
- **`kSecAttrAccessibleWhenUnlocked`**: Accessibile solo quando il dispositivo è sbloccato.
- **`kSecAttrAccessibleWhenUnlockedThisDeviceOnly`**: Accessibile quando sbloccato, non incluso nei backup.
- **`kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly`**: Richiede il codice di accesso del dispositivo, non incluso nei backup.
2024-02-10 13:03:23 +00:00
**`AccessControlFlags`** raffinano ulteriormente i metodi di accesso, consentendo l'autenticazione biometrica o l'uso del codice di accesso.
2024-02-10 13:03:23 +00:00
### **Avviso per i dispositivi jailbroken**
{% hint style="warning" %}
2024-02-10 13:03:23 +00:00
Su **dispositivi jailbroken**, le protezioni del Portachiavi sono compromesse, rappresentando un rischio significativo per la sicurezza.
{% endhint %}
2024-02-10 13:03:23 +00:00
### **Persistenza dei dati del Portachiavi**
2024-02-10 13:03:23 +00:00
A differenza dei dati specifici dell'app eliminati durante la disinstallazione dell'app, i dati del Portachiavi persistono sul dispositivo. Questa caratteristica potrebbe consentire ai nuovi proprietari di un dispositivo di seconda mano di accedere ai dati dell'app del precedente proprietario semplicemente reinstallando le app. Si consiglia agli sviluppatori di eliminare proattivamente i dati del Portachiavi durante l'installazione dell'app o durante il logout per mitigare questo rischio. Ecco un esempio di codice Swift che mostra come eliminare i dati del Portachiavi al primo avvio dell'app:
2024-02-08 03:08:28 +00:00
```swift
let userDefaults = UserDefaults.standard
if userDefaults.bool(forKey: "hasRunBefore") == false {
2024-02-10 13:03:23 +00:00
// Remove Keychain items here
2024-02-10 13:03:23 +00:00
// Update the flag indicator
userDefaults.set(true, forKey: "hasRunBefore")
userDefaults.synchronize() // Forces the app to update UserDefaults
}
```
2024-02-10 13:03:23 +00:00
# **Funzionalità dell'app**
2024-02-10 13:03:23 +00:00
Nel campo dello sviluppo delle app, il **sandboxing** svolge un ruolo cruciale nel migliorare la sicurezza. Questo processo garantisce che ogni app operi all'interno della propria directory home unica, impedendole così di accedere ai file di sistema o ai dati appartenenti ad altre app. L'applicazione di queste restrizioni avviene attraverso le politiche di sandbox, che fanno parte del **Trusted BSD (MAC) Mandatory Access Control Framework**.
2021-05-17 19:08:47 +00:00
2024-02-10 13:03:23 +00:00
Gli sviluppatori hanno la possibilità di configurare determinate **funzionalità o autorizzazioni** per le loro app, come la **protezione dei dati** o la **condivisione del portachiavi**. Queste autorizzazioni vengono applicate immediatamente dopo l'installazione dell'app. Tuttavia, per accedere a determinate risorse protette, l'app deve ottenere il consenso esplicito dell'utente al momento del primo tentativo. Ciò viene realizzato attraverso l'uso di _stringhe di scopo_ o _stringhe di descrizione dell'uso_, che vengono presentate agli utenti in un avviso di richiesta di autorizzazione.
2021-05-17 19:08:47 +00:00
2024-02-10 13:03:23 +00:00
Per coloro che hanno accesso al codice sorgente, la verifica delle autorizzazioni incluse nel file `Info.plist` può essere effettuata seguendo questi passaggi:
2021-05-17 19:08:47 +00:00
2024-02-10 13:03:23 +00:00
1. Aprire il progetto in Xcode.
2. Trovare e aprire il file `Info.plist`.
3. Cercare le chiavi con prefisso `"Privacy -"`, con l'opzione di visualizzare chiavi/valori grezzi per maggiore chiarezza.
2021-05-17 19:08:47 +00:00
2024-02-10 13:03:23 +00:00
Quando si lavora con un file IPA, è possibile seguire i seguenti passaggi:
2021-05-17 19:08:47 +00:00
2024-02-10 13:03:23 +00:00
1. Decomprimere il file IPA.
2. Trovare il file `Info.plist` all'interno di `Payload/<nomeapp>.app/`.
3. Convertire il file in formato XML se necessario, per una più facile ispezione.
2021-05-17 19:08:47 +00:00
2024-02-10 13:03:23 +00:00
Ad esempio, le stringhe di scopo nel file `Info.plist` potrebbero apparire così:
2024-02-08 03:08:28 +00:00
```xml
<plist version="1.0">
<dict>
2024-02-10 13:03:23 +00:00
<key>NSLocationWhenInUseUsageDescription</key>
<string>Your location is used to provide turn-by-turn directions to your destination.</string>
2024-02-08 03:08:28 +00:00
```
2024-02-10 13:03:23 +00:00
## Capacità del dispositivo
Il file `Info.plist` di un'app specifica le **capacità del dispositivo** che aiutano l'App Store a filtrare le app in base alla compatibilità del dispositivo. Queste sono definite sotto la chiave **`UIRequiredDeviceCapabilities`**. Ad esempio:
2024-02-08 03:08:28 +00:00
```xml
2021-05-17 19:08:47 +00:00
<key>UIRequiredDeviceCapabilities</key>
<array>
2024-02-10 13:03:23 +00:00
<string>armv7</string>
2021-05-17 19:08:47 +00:00
</array>
```
2024-02-10 13:03:23 +00:00
Questo esempio indica che l'app è compatibile con l'insieme di istruzioni armv7. Gli sviluppatori possono anche specificare funzionalità come nfc per garantire che la loro app sia disponibile solo su dispositivi che supportano NFC.
2021-05-17 19:08:47 +00:00
2022-05-01 12:41:36 +00:00
## Entitlements
2021-05-17 19:08:47 +00:00
2024-02-10 13:03:23 +00:00
**Entitlements** sono un altro aspetto critico dello sviluppo di app iOS, che fungono da coppie chiave-valore che concedono alle app il permesso di eseguire determinate operazioni al di là dei controlli in fase di esecuzione. Ad esempio, abilitare **Data Protection** in un'app comporta l'aggiunta di un entitlement specifico nel progetto Xcode, che viene quindi riflessa nel file degli entitlements dell'app o nel file di provisioning mobile incorporato per gli IPA.
2024-02-10 13:03:23 +00:00
# Riferimenti
2024-02-08 03:08:28 +00:00
* [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/)
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 13:03:23 +00:00
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:03:23 +00:00
Altri modi per supportare HackTricks:
2022-04-28 16:01:33 +00:00
2024-02-10 13:03:23 +00:00
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>