Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
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, uno strumento per ispezionare la classe di protezione dei dati dei file su un 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
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, 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, 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:
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:
- Aprire il progetto in Xcode.
- Trovare e aprire il file
Info.plist. - 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:
- Decomprimere lâIPA.
- Trovare il file
Info.plistallâinterno diPayload/<appname>.app/. - 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:
<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:
<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://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/iOS/0x06h-Testing-Platform-Interaction/
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
HackTricks

