Sicurezza dei processi in esecuzione in iOS e iPadOS
iOS e iPadOS aiutano a garantire la sicurezza dei processi in esecuzione utilizzando le sandbox, le autorizzazioni dichiarate e il meccanismo ASLR (Address Space Layout Randomization).
Sandbox
Tutte le app di terze parti sono eseguite in sandbox, ovvero non possono accedere ai file archiviati da altre app o apportare delle modifiche al dispositivo. Il meccanismo di sandboxing è progettato per fare in modo che le app non possano raccogliere o modificare le informazioni archiviate da altre app. Ogni app dispone di una directory Inizio univoca per i propri file, che viene assegnata in maniera casuale al momento dell’installazione della app. Se un’app di terze parti deve accedere a informazioni diverse dalle proprie, lo può fare unicamente usando i servizi forniti specificamente da iOS e iPadOS.
Anche i file di sistema e le risorse sono separati rispetto alle app dell’utente. La maggior parte dei file di sistema e delle risorse di iOS e iPadOS viene eseguita come utente “mobile” non privilegiato, come succede per tutte le app di terze parti. L’intera partizione del sistema operativo è attivata come volume di sola lettura. Gli strumenti non necessari, come i servizi di login remoto, non sono inclusi nel software di sistema e le API non consentono alle app di far valere i propri privilegi per modificare altre app o gli stessi iOS e iPadOS.
Uso di autorizzazioni
L’accesso da parte delle app di terze parti alle informazioni dell’utente e a funzionalità come iCloud e l’estensibilità è controllato tramite autorizzazioni dichiarate. Le autorizzazioni sono coppie chiave-valore registrate in un’app che consentono l’autenticazione indipendentemente da altri fattori di esecuzione, come l’ID utente Unix. Dato che le autorizzazioni sono firmate digitalmente, non possono essere modificate. Le autorizzazioni sono ampiamente usate da app di sistema e daemon per eseguire operazioni privilegiate specifiche che richiederebbero altrimenti di eseguire il processo come root. In questo modo si riduce al minimo il rischio potenziale di sorpasso dei privilegi da parte di app di sistema o daemon compromessi.
Inoltre, le app possono solo eseguire processi in background tramite API fornite dal sistema. Ciò consente alle app di continuare a funzionare senza peggiorare le prestazioni o senza avere un impatto significativo sulla durata della batteria.
ASLR
L’ASLR (Address Space Layout Randomization) è un meccanismo che aiuta a proteggere il sistema contro lo sfruttamento di bug che causano il danneggiamento della memoria. Le app incorporate usano ASLR per aiutare a garantire che tutte le regioni della memoria vengano assegnate in modo casuale all’avvio. Oltre a funzionare all’avvio, l’ASLR organizza in modo casuale degli indirizzi di memoria del codice eseguibile, delle librerie di sistema e dei blocchi di programmazione relativi, riducendo ulteriormente la probabilità di molti tipi di attacchi. Ne sono un esempio i tentativi di attacco return‑to‑libc mirati a ingannare il dispositivo affinché esegua codice dannoso manipolando gli indirizzi di memoria delle librerie dello stack e del sistema. La posizione casuale degli indirizzi di memoria rende più difficile eseguire l’attacco, specialmente su diversi dispositivi. Xcode e gli ambienti di sviluppo per iOS e iPadOS, compilano automaticamente i programmi di terze parti con il supporto ASLR attivato.
Funzionalità “Execute Never”
iOS e iPadOS forniscono un ulteriore strumento di protezione utilizzando la funzionalità “Execute Never” (XN) di ARM, che contrassegna le pagine di memoria come non eseguibili. Le pagine di memoria contrassegnate come scrivibili ed eseguibili possono essere utilizzate solo da app sotto condizioni estremamente controllate. Il kernel verifica la presenza dell’autorizzazione per la firma del codice dinamica esclusiva di Apple. Dopo ciò, può comunque essere effettuata solo una singola chiamata mmap
per richiedere una pagina scrivibile ed eseguibile, a cui viene assegnato un indirizzo casuale. Safari utilizza questa funzionalità per il compilatore JavaScript Just-in-Time (JIT).