Learn & practice AWS Hacking:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Learn & practice GCP Hacking: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
In iOS, esiste una distinzione nei privilegi tra le applicazioni accessibili all'utente e i processi core del sistema. Le applicazioni vengono eseguite con l'identità utente **`mobile`**, mentre i processi di sistema cruciali operano come **`root`**. Questa separazione è migliorata da un meccanismo di sandbox, che impone limitazioni rigorose su quali azioni possono intraprendere le applicazioni. Ad esempio, anche se le applicazioni condividono la stessa identità utente, è vietato loro accedere o modificare i dati reciproci.
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.
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.
- **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.
In iOS, un **Keychain** 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 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 Keychain rimangono inaccessibili su qualsiasi dispositivo diverso da quello in cui sono stati originariamente crittografati.
**La gestione e l'accesso** ai dati del Keychain sono gestiti dal **daemon `securityd`**, basato su specifici diritti dell'app, come `Keychain-access-groups` e `application-identifier`.
L'API del Keychain, dettagliata nella [documentazione dei Keychain Services di Apple](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html), fornisce funzioni essenziali per la gestione dello storage sicuro:
Forzare la password del Keychain 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.
I livelli di protezione dei dati per gli elementi del Keychain 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 Keychain sono accessibili:
A differenza dei dati specifici dell'app eliminati al momento della disinstallazione dell'app, i **dati del Keychain 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 Keychain 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 Keychain al primo avvio dell'app:
Nel campo dello sviluppo di app, **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 **capabilities o permissions** per le loro app, come **Data Protection** o **Keychain Sharing**. 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. Questo viene realizzato attraverso l'uso di _purpose strings_ o _usage description strings_, che vengono presentate agli utenti in un avviso di richiesta di autorizzazione.
Per coloro che hanno accesso al codice sorgente, la verifica delle autorizzazioni incluse nel file `Info.plist` può essere effettuata seguendo questi passaggi:
Il file `Info.plist` di un'app specifica **le capacità del dispositivo** che aiutano l'App Store a filtrare le app per la compatibilità del dispositivo. Queste sono definite sotto la chiave **`UIRequiredDeviceCapabilities`**. Ad esempio:
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 i dispositivi che supportano NFC.
**Entitlements** sono un altro aspetto critico dello sviluppo di app iOS, servendo come coppie chiave-valore che concedono alle app il permesso di eseguire determinate operazioni oltre ai controlli di runtime. Ad esempio, abilitare **Data Protection** in un'app comporta l'aggiunta di un entitlement specifico nel progetto Xcode, che viene poi riflesso nel file di entitlement dell'app o nel file di provisioning mobile incorporato per le IPA.
Learn & practice AWS Hacking:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Learn & practice GCP Hacking: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.