
Integrità del sistema operativo
Apple progetta i propri sistemi operativi dando un’importanza centrale alla sicurezza. Tale progettazione include una catena di attendibilità hardware che consente di eseguire un avvio protetto e un processo di aggiornamento del software al tempo stesso rapido e sicuro. I sistemi operativi Apple fanno anche uso di chip appositamente creati per fornire funzionalità hardware che aiutano a impedire attacchi durante l’esecuzione del sistema operativo. Queste funzionalità proteggono l’integrità del codice attendibile mentre si trova in esecuzione. Il software dei sistemi operativi Apple aiuta a contrastare gli attacchi a prescindere dal fatto che provengano da app dannose, dal web o da qualsiasi altro canale. Queste protezioni sono disponibili sui dispositivi con i SoC Apple supportati, come iOS, iPadOS, macOS sui Mac dotati di chip Apple, tvOS, visionOS e watchOS.
Funzionalità | A10 | A11, S3 | A12-A14 S4-S10 | A15-A18 | M1 | M2-M4 | A19 M5 |
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
1 |
2 |
|
| |
|
|
|
|
|
2 |
2 | |
Memory Integrity Enforcement con Enhanced Memory Tagging Extension |
|
|
|
|
|
|
|
1: il Secure Page Table Monitor (SPTM) è supportato sui SoC A15 o modelli successivi e M2 o modelli successivi e sostituisce il Page Protection Layer sulle piattaforme supportate.
2: Page Protection Layer (PPL) e Secure Page Table Monitor (SPTM) impongono l’esecuzione di codice firmato e autorizzato su tutte le piattaforme a eccezione di macOS (perché macOS è progettato per eseguire qualsiasi tipo di codice). Tutte le altre proprietà di sicurezza, tra cui la protezione delle tabelle di paginazione, sono presenti su tutte le piattaforme supportate.
Protezione dell’integrità del kernel
Una volta terminata l’inizializzazione del kernel del sistema operativo, viene abilitata la protezione dell’integrità del kernel (KIP, Kernel Integrity Protection) per aiutare a impedire modifiche al codice del kernel e dei driver. Il controller della memoria fornisce un’area di memoria fisica protetta usata da iBoot per caricare il kernel e le estensioni del kernel. Una volta completato l’avvio, il controller della memoria nega la scrittura sulla regione di memoria fisica protetta. L’unità di gestione della memoria del processore per le applicazioni è configurata in modo tale da aiutare a impedire la mappatura di codice con privilegi dalla memoria fisica al di fuori dalla regione di memoria protetta e in modo tale da aiutare a impedire mappature scrivibili della memoria fisica all’interno della regione di memoria del kernel.
Per impedire la riconfigurazione, l’hardware utilizzato per abilitare la protezione dell’integrità del kernel viene bloccato dopo il completamento della procedura di avvio.
Restrizioni rapide dei permessi
A partire dai SoC Apple A11 Bionic e S3, è stato introdotto un nuovo primitivo hardware, le restrizioni rapide dei permessi, che includono un registro CPU che limita velocemente i permessi per thread. Grazie a queste restrizioni rapide dei permessi (conosciute anche come registri APRR), i sistemi operativi supportati possono rimuovere i permessi di esecuzione dalla memoria senza il sovraccarico di una chiamata di sistema e di uno svuotamento o un’analisi della tabella della pagina. Questi registri forniscono un ulteriore livello di protezione dagli attacchi dal web, in particolare per il codice compilato durante il runtime (compilazione “just in time”), perché la memoria non può essere eseguita nello stesso momento in cui è in corso la lettura e la scrittura.
Protezione dell’integrità dei coprocessori di sistema
Il firmware dei coprocessori gestisce molte attività fondamentali del sistema, per esempio Secure Enclave, il processore del sensore di immagini e il coprocessore di movimento. La sua sicurezza è quindi una parte fondamentale della sicurezza del sistema globale. Per impedire la modifica al firmware dei coprocessori, Apple utilizza un meccanismo chiamato protezione dell’integrità dei coprocessori di sistema (SCIP).
La protezione dell’integrità dei coprocessori di sistema funziona in modo simile alla protezione dell’integrità del kernel: durante l’avvio, iBoot carica il firmware di ciascun coprocessore in una regione di memoria protetta, riservata e separata dalla regione per la protezione dell’integrità del kernel. iBoot configura ciascuna unità di memoria dei coprocessori per aiutare a impedire quanto segue:
Mappature eseguibili al di fuori della parte di regione di memoria protetta.
Mappature scrivibili all’interno della parte di regione di memoria protetta.
Inoltre al momento dell’avvio, viene usato il sistema operativo Secure Enclave per configurare il SCIP per Secure Enclave. Una volta completato il processo di avvio, l’hardware utilizzato per abilitare il SCIP viene bloccato. Questo meccanismo è progettato per impedire la riconfigurazione.
Codici di autenticazione dei puntatori
I codici di autenticazione dei puntatori (PAC) sono utilizzati per proteggere contro gli attacchi mirati ai bug di corruzione della memoria. Il software di sistema e le app integrate utilizzano i codici di autenticazione dei puntatori per aiutare a impedire la modifica dei puntatori alle funzioni e degli indirizzi di restituzione (puntatori al codice). Un PAC usa cinque valori segreti a 128 bit per firmare i dati e le istruzioni del kernel, e ogni processo nello spazio utente ha le proprie chiavi B. Agli elementi vengono aggiunti salt e firme come indicato di seguito.
Elemento | Chiave | Salt |
|---|---|---|
Indirizzo di ritorno della funzione | IB | Indirizzo archiviazione |
Puntatori funzione | IA | 0 |
Funzione di richiamo del blocco | IA | Indirizzo archiviazione |
Puntatore del descrittore del blocco | DA | Indirizzo archiviazione + 0xC0BB |
Cache metodo Objective-C | IB | Indirizzo archiviazione + Classe + Selettore |
Puntatore Isa Objective-C | DA | Indirizzo archiviazione + 0x6AE1 |
Puntatore Super Objective-C | DA | Indirizzo archiviazione + 0xB5AB |
Ivar Objective-C Selector Typed | DB | Indirizzo archiviazione + 0x57C2 |
Puntatore classe di dati di sola lettura Objective-C | DA | Indirizzo archiviazione + 0x61F8 |
Voci V-Table C++ | IA | Indirizzo archiviazione + Hash (nome metodo mangled) |
Puntatori V-Table C++ | DA | Indirizzo archiviazione + Hash (nome V-Table base mangled) |
Etichetta Goto calcolata | IA | Hash (nome funzione) |
Stato thread del kernel | GA | • |
Registri stato thread dell’utente | IA | Indirizzo archiviazione |
Il valore della firma è archiviato nei bit di inserimento inutilizzati all’inizio del puntatore a 64 bit. La firma viene verificata prima dell’uso e l’inserimento viene ripristinato per aiutare a garantire il funzionamento dell’indirizzo del puntatore. Se la verifica non va a buon fine, l’operazione viene interrotta. Questa verifica aumenta la difficoltà di molti attacchi come ad esempio un attacco basato sul return oriented programming, che tenta di ingannare il dispositivo in modo tale che esegua del codice in maniera dannosa manipolando gli indirizzi di ritorno delle funzioni archiviati sullo stack.
Page Protection Layer (PPL)
Il Page Protection Layer (PPL) in iOS, iPadOS, visionOS e watchOS è progettato per proteggere il codice dello spazio utente dalle modifiche una volta che è stato completato il processo di verifica della firma. Basandosi sulla protezione dell’integrità del kernel e sulle restrizioni veloci alle autorizzazioni, il PPL gestisce gli override dei permessi della tabella della pagina per garantire che le pagine protette contenenti codice utente e le tabelle delle pagine possano essere modificate unicamente dal PPL. Il sistema fornisce una riduzione massiva della superficie di attacco supportando l’applicazione dell’integrità del codice su tutto il sistema, anche di fronte a un kernel compromesso. Il PPL non è offerto in macOS perché è applicabile solo ai sistemi in cui tutto il codice deve essere firmato.
Secure Page Table Monitor e Trusted Execution Monitor
Secure Page Table Monitor (SPTM) e Trusted Execution Monitor (TXM) su iOS, iPadOS, macOS e visionOS sono concepiti per funzionare insieme poiché contribuiscono a proteggere da modifica le page table per i processi sia utente che per il kernel. Questo include anche le situazioni in cui gli hacker dispongono di capacità di scrittura a livello di kernel e sono in grado di aggirare le protezioni del flusso di controllo. STPM usufruisce di un livello di privilegi superiore rispetto al kernel e utilizza il TXM con privilegi inferiori per applicare le politiche che governano l’esecuzione del codice. Questo sistema è concepito in modo da evitare che la manomissione del TXM comporti automaticamente l’aggiramento dell’SPM, grazie alla separazione dei privilegi e alla gestione dell’affidabilità tra di loro. Nei SOC A15 o modelli successivi e M2 o modelli successivi, SPTM (insieme a TXM) sostituisce PPL, poiché offre una superficie di attacco più piccola, che non si basa sull’attendibilità del kernel, anche durante le prime fasi dell’avvio. STPM si basa su nuovi primitivi del chip che rappresentano un’evoluzione delle restrizioni rapide dei permessi utilizzate da PPL e che sono disponibili solo sui processori elencati nella tabella qui sopra.
Protezione dell’integrità della memoria
La protezione dell’integrità della memoria è un meccanismo completo di difesa della sicurezza della memoria per le piattaforme Apple disponibile sui chip A19 e M5 o modelli successivi. La protezione dell’integrità della memoria si basa sulle robuste fondamenta fornite dagli allocatori di memoria sicuri di Apple, unite a Enhanced Memory Tagging Extension (EMTE) in modalità sincrona e supportate da ampie politiche di protezione della riservatezza dei tag. La protezione dell’integrità della memoria è integrata sui chip Apple e offre una difesa senza eguali e sempre attiva della sicurezza della memoria per superfici di attacco chiave, tra cui il kernel, mantenendo al tempo stesso la potenza e le prestazioni che gli utenti si aspettano di ottenere. Per ulteriori informazioni, consulta Memory Integrity Enforcement: A complete vision for memory safety in Apple devices sul blog Apple Security Research.
Memory Tagging Extension
Arm ha pubblicato la specifica Memory Tagging Extension (MTE) nel 2019 come strumento destinato all’hardware per aiutare a trovare bug di corruzione della memoria. MTE è un sistema di tag della memoria e di verifica dei tag in cui ciascuna allocazione di memoria è taggata con un segreto. L’hardware garantisce che le richieste successive di accesso alla memoria sono accettate solo se esse contengono il segreto giusto. Se i segreti non corrispondono, l’app va in blocco e l’evento viene registrato in un log. Ciò consente ai team di sviluppo di identificare i bug di corruzione della memoria immediatamente mentre si verificano.
Enhanced Memory Tagging Extension
EMTE corregge i difetti che impediscono a MTE di essere una difesa attiva, ad esempio supportando solo la modalità sincrona più sicura. Inoltre, l’accesso alla memoria non taggata da una regione di memoria taggata richiede la conoscenza del tag di tale regione, rendendo molto più difficile per un hacker la possibilità di trasformare bug di accesso fuori dai limiti alla memoria taggata dinamica in un modo per raggirare EMTE modificando direttamente le allocazioni non taggate.
Protezione della riservatezza dei tag
La protezione della riservatezza dei tag protegge l’implementazione degli allocatori sicuri da minacce tecniche e la riservatezza dei tag EMTE, inclusi gli attacchi a canale laterale e ad esecuzione speculativa. Secure Page Table Monitor protegge l’allocatore del kernel responsabile dell’archiviazione e del salvataggio dei tag. Inoltre il sistema garantisce che, quando il kernel accede alla memoria per un’applicazione, sia soggetto alle stesse regole di verifica dei tag dello spazio utente. La protezione della riservatezza dei tag inoltre è progettata per ridurre la possibilità di fughe di tag causate da attacchi temporali o speculativi e include persino una protezione con tro Spectre V1.