Processo di avvio per i Mac dotati di chip Apple
Quando accendi un Mac dotato di chip Apple, viene eseguito un processo di avvio molto simile a quello di iPhone e iPad.
Nel primo passaggio della catena di attendibilità, il chip esegue del codice dalla ROM di avvio. L’avvio protetto di macOS sui Mac dotati di chip Apple verifica non solo il codice del sistema operativo stesso, ma anche le politiche di sicurezza e persino le estensioni del kernel (supportate, ma non consigliate) configurate dagli utenti autorizzati.
Quando l’LLB, ossia il bootloader di livello inferiore, viene avviato, esso verifica le firme e carica il firmware abbinato al sistema per i core intra-SoC, come l’archiviazione, il monitor, la gestione del sistema e i controller Thunderbolt. Il bootloader di livello inferiore è responsabile anche del caricamento di LocalPolicy, un file firmato da Secure Enclave. Il file LocalPolicy descrive la configurazione scelta dall’utente per le politiche per l’avvio del sistema e per la sicurezza dell’esecuzione. LocalPolicy ha lo stesso formato di struttura di dati di tutti gli altri oggetti di avvio, ma il file è firmato localmente da una chiave privata che è disponibile solo all’interno del Secure Enclave di un determinato computer, invece che essere firmato da un server centrale Apple (come gli aggiornamenti software).
Per impedire il riutilizzo di qualsiasi LocalPolicy precedente, il bootloader di livello inferiore deve cercare un valore anti-replay dal componente Secure Storage collegato a Secure Enclave. Per farlo, utilizza la ROM di avvio di Secure Enclave e si assicura che il valore anti-replay in LocalPolicy corrisponda a quello nel componente Secure Storage. Questa procedura aiuta a impedire che un LocalPolicy meno recente, che potrebbe essere stato configurato con un livello di sicurezza inferiore, venga riapplicato al sistema dopo che la sicurezza è stata aumentata. Il risultato è che l’avvio protetto sui Mac dotati di chip Apple aiuta a proteggere non solo contro l’uso di versioni precedenti del sistema operativo, ma anche contro l’applicazione di politiche di sicurezza meno severe.
Il file LocalPolicy rileva se il sistema operativo è configurato per garantire una sicurezza totale, ridotta o assente.
Sicurezza totale: il sistema si comporta come iOS e iPadOS e consente solo l’avvio di software che risulta essere il più recente disponibile al momento dell’installazione.
Sicurezza ridotta: al bootloader di livello inferiore viene permesso di ritenere affidabili le firme “globali” che sono incluse con il sistema operativo. Questo consente al sistema di eseguire versioni meno recenti di macOS. Dal momento che le versioni meno recenti di macOS presentano inevitabilmente vulnerabilità non risolte, questa modalità di sicurezza è definita come ridotta. Questo è anche il livello di sicurezza richiesto per supportare l’avvio di estensioni del kernel.
Sicurezza assente: il sistema si comporta come in sicurezza ridotta per il fatto di utilizzare la verifica di firme globali per iBoot e oltre, ma inoltre consente ad iBoot di accettare che alcuni oggetti di avvio vengano firmati da Secure Enclave con la stessa chiave utilizzata per firmare LocalPolicy. Questo livello di sicurezza è pensato per gli utenti che si occupano di creazione, firma e avvio di kernel XNU personalizzati.
Se LocalPolicy indica al bootloader di livello inferiore che il sistema operativo è in esecuzione in sicurezza totale, il bootloader di livello inferiore valuta la firma personalizzata per iBoot. Se è in esecuzione in sicurezza ridotta o assente, valuta la firma globale. Qualsiasi errore di verifica della firma causa l’avvio del sistema in recoveryOS per offrire le dovute opzioni di riparazione.
Una volta che il bootloader di livello inferiore ha passato le operazioni ad iBoot, questo carica il firmware abbinato a macOS, come quello per il Secure Neural Engine, per il processore sempre attivo e altro firmware. iBoot esamina anche le informazioni riguardo a LocalPolicy fornite dal bootloader di livello inferiore. Se LocalPolicy indica che dovrebbe esserci una raccolta del kernel ausiliaria, iBoot la cerca nel file system, verifica che sia stata firmata da Secure Enclave con la stessa chiave di LocalPolicy e controlla che il relativo hash corrisponda a quello archiviato in quest’ultimo. Se la raccolta del kernel ausiliaria passa la verifica, iBoot la posiziona in memoria con la raccolta del kernel di avvio, prima di bloccare l’intera regione di memoria che copre la raccolta del kernel di avvio e la raccolta del kernel ausiliaria con la Protezione dell’integrità dei coprocessori di sistema (SCIP). Se la politica indica che dovrebbe essere presente una raccolta del kernel ausiliaria, ma questa non viene trovata, il sistema prosegue l’avvio in macOS senza di essa. iBoot è anche responsabile della verifica dell’hash root del volume di sistema firmato, per controllare che l’integrità del file system attivato dal kernel sia totalmente verificata.