mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
131 lines
11 KiB
Markdown
131 lines
11 KiB
Markdown
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
# Separazione dei privilegi e Sandbox
|
|
|
|
In iOS, esiste una distinzione nei privilegi tra le applicazioni accessibili all'utente e i processi core del sistema. Le applicazioni vengono eseguite sotto l'identità utente **`mobile`**, mentre i processi di sistema cruciali operano come **`root`**. Questa separazione è migliorata da un meccanismo di sandbox, che impone severe limitazioni su quali azioni le applicazioni possono intraprendere. Ad esempio, anche se le applicazioni condividono la stessa identità utente, sono vietate dall'accesso o dalla modifica dei dati l'una dell'altra.
|
|
|
|
Le applicazioni sono installate in una directory specifica (`private/var/mobile/Applications/{random ID}`) e hanno accesso in lettura limitato a determinate aree e funzionalità di sistema, come SMS e chiamate telefoniche. L'accesso a aree protette attiva una richiesta pop-up per il permesso dell'utente.
|
|
|
|
# Protezione dei Dati
|
|
|
|
iOS offre agli sviluppatori le **API di Protezione dei Dati**, costruite sopra il Secure Enclave Processor (SEP) — un coprocessore dedicato per operazioni crittografiche e gestione delle chiavi. Il SEP garantisce l'integrità della protezione dei dati tramite una chiave unica specifica per il dispositivo, l'UID del dispositivo, incorporata al suo interno.
|
|
|
|
Al momento della creazione del file, viene generata una chiave di crittografia AES unica a 256 bit, che crittografa il contenuto del file. Questa chiave di crittografia, insieme a un ID di classe, viene quindi crittografata utilizzando una chiave di classe e memorizzata nei metadati del file. Decrittografare un file implica utilizzare la chiave di sistema per accedere ai metadati, recuperare la chiave di classe con l'ID di classe e poi decrittografare la chiave di crittografia unica del file.
|
|
|
|
iOS definisce **quattro classi di protezione** per la sicurezza dei dati, che determinano quando e come i dati possono essere accessibili:
|
|
|
|
- **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 non sia aperto (NSFileProtectionCompleteUnlessOpen)**: Consente l'accesso al file anche dopo che il dispositivo è bloccato, a condizione che il file fosse aperto quando il dispositivo è stato sbloccato.
|
|
- **Protetto fino alla prima autenticazione dell'utente (NSFileProtectionCompleteUntilFirstUserAuthentication)**: I dati sono accessibili dopo il primo sblocco dell'utente post-avvio, rimanendo accessibili anche se il dispositivo viene bloccato di nuovo.
|
|
- **Nessuna Protezione (NSFileProtectionNone)**: I dati sono protetti solo dall'UID del dispositivo, facilitando la rapida cancellazione remota dei dati.
|
|
|
|
La crittografia di tutte le classi, tranne `NSFileProtectionNone`, coinvolge una chiave derivata sia dall'UID del dispositivo che dal codice di accesso dell'utente, garantendo che la decrittografia 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".
|
|
|
|
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.
|
|
```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
|
|
```
|
|
## **Il Portachiavi**
|
|
|
|
In iOS, un **Portachiavi** funge da **contenitore crittografato sicuro** per memorizzare **informazioni sensibili**, accessibile solo dall'applicazione che lo ha memorizzato o da quelle esplicitamente autorizzate. Questa crittografia è rafforzata da una **password unica generata da iOS**, che è a sua volta crittografata con **AES**. Questo processo di crittografia sfrutta una **funzione PBKDF2**, combinando il codice di accesso dell'utente con un sale derivato dal **UID** del dispositivo, un componente accessibile solo dal **chipset della secure enclave**. 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.
|
|
|
|
**La gestione e l'accesso** ai dati del Portachiavi sono gestiti dal **daemon `securityd`**, basato su specifici diritti dell'app come `Keychain-access-groups` e `application-identifier`.
|
|
|
|
### **Operazioni API del Portachiavi**
|
|
|
|
L'API del Portachiavi, dettagliata 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 dello storage sicuro:
|
|
|
|
- **`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.
|
|
|
|
Forzare la password del Portachiavi implica attaccare direttamente la chiave crittografata o tentare di indovinare il codice di accesso sul dispositivo stesso, ostacolato significativamente dall'applicazione di un ritardo tra i tentativi falliti da parte della secure enclave.
|
|
|
|
### **Configurazione della Protezione dei Dati degli Elementi del Portachiavi**
|
|
|
|
I livelli di protezione dei dati per gli elementi del Portachiavi sono 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:
|
|
|
|
- **`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 post-riavvio.
|
|
- **`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly`**: Stesso di 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.
|
|
|
|
**`AccessControlFlags`** affinano ulteriormente i metodi di accesso, consentendo l'autenticazione biometrica o l'uso del codice di accesso.
|
|
|
|
### **Avviso per Dispositivi Jailbroken**
|
|
|
|
> [!WARNING]
|
|
> Su **dispositivi jailbroken**, le protezioni del Portachiavi sono compromesse, rappresentando un rischio significativo per la sicurezza.
|
|
|
|
### **Persistenza dei Dati del Portachiavi**
|
|
|
|
A differenza dei dati specifici dell'app eliminati al momento della 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'applicazione del precedente proprietario semplicemente reinstallando le app. Si consiglia agli sviluppatori di cancellare proattivamente i dati del Portachiavi al momento dell'installazione dell'app o durante il logout per mitigare questo rischio. Ecco un esempio di codice Swift che dimostra come cancellare i dati del Portachiavi al primo avvio dell'app:
|
|
```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
|
|
}
|
|
```
|
|
# **Capacità dell'App**
|
|
|
|
Nel campo dello sviluppo di app, il **sandboxing** gioca 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 a file di sistema o 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**.
|
|
|
|
Gli sviluppatori hanno la possibilità di configurare determinate **capacità o permessi** per le loro app, come **Data Protection** o **Keychain Sharing**. Questi permessi vengono applicati 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. Questo viene realizzato attraverso l'uso di _purpose strings_ o _usage description strings_, che vengono presentate agli utenti in un avviso di richiesta di permesso.
|
|
|
|
Per coloro che hanno accesso al codice sorgente, la verifica dei permessi inclusi nel file `Info.plist` può essere effettuata seguendo questi passaggi:
|
|
|
|
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 chiarezza.
|
|
|
|
Quando si tratta di un file IPA, è possibile seguire i seguenti passaggi:
|
|
|
|
1. Decomprimere l'IPA.
|
|
2. Trovare il file `Info.plist` all'interno di `Payload/<appname>.app/`.
|
|
3. Convertire il file in formato XML se necessario, per una ispezione più facile.
|
|
|
|
Ad esempio, le purpose strings nel file `Info.plist` potrebbero apparire in questo modo:
|
|
```xml
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>NSLocationWhenInUseUsageDescription</key>
|
|
<string>Your location is used to provide turn-by-turn directions to your destination.</string>
|
|
```
|
|
## Capacità del Dispositivo
|
|
|
|
Il file `Info.plist` di un'app specifica le **capacità del dispositivo** che aiutano l'App Store a filtrare le app per la compatibilità con il dispositivo. Queste sono definite sotto la chiave **`UIRequiredDeviceCapabilities`**. Ad esempio:
|
|
```xml
|
|
<key>UIRequiredDeviceCapabilities</key>
|
|
<array>
|
|
<string>armv7</string>
|
|
</array>
|
|
```
|
|
Questo esempio indica che l'app è compatibile con il set di istruzioni armv7. Gli sviluppatori possono anche specificare capacità come nfc per garantire che la loro app sia disponibile solo per dispositivi che supportano NFC.
|
|
|
|
## Autorizzazioni
|
|
|
|
Le **autorizzazioni** sono un altro aspetto critico dello sviluppo di app iOS, fungendo da coppie chiave-valore che concedono alle app il permesso di eseguire determinate operazioni oltre ai controlli di runtime. Ad esempio, abilitare la **Protezione dei Dati** in un'app comporta l'aggiunta di un'autorizzazione specifica nel progetto Xcode, che viene poi riflessa nel file delle autorizzazioni dell'app o nel file di provisioning mobile incorporato per le IPA.
|
|
|
|
# Riferimenti
|
|
|
|
- [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/)
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|