Dopo aver trattato la tecnica ASLR nel precedente articolo, rivolgiamo la nostra attenzione al processo di avvio di iOS spesso trascurato, che si verifica nel momento in cui accendiamo il nostro dispositivo.
Preambolo
La priorità principale Apple si è sempre prefissata durante lo sviluppo di iOS è stata l’imposizione di uno standard di sicurezza elevato poichè il sistema operativo che muovi i nostri dispositivi è stato plasmato in modo che sia il software, che l’hardware, siano sicuri in tutte le componenti del dispositivo; questa perfetta integrazione tra hardware e software, come ben sappiamo, garantisce l’affidabilità che ha sempre contraddistinto il sistema operativo degli iPhone.
iOS ha la peculiarità (e la fama) di essere un sistema totalmente chiuso: dall’avvio iniziale del dispositivo, agli aggiornamenti software, fino ad arrivare alle app di terze parti, ogni singolo passo mosso nel sistema viene analizzato e vagliato per garantire e preservare la purezza del sistema.
La scelta di una politica così rigida è indiscutibilmente legata alla distruzione e al commercio di milioni di dispositivi venduti in tutto il mondo: non è certo un caso che ad esempio che un numero elevatissimo di aziende utilizzino iPhone o iPad come dispositivi aziendali!
La procedura di avvio sicuro
Molto semplicemente è quella sequenza di operazioni che iOS compie per garantire che i livelli più bassi del software siano stati alterati in qualche modo: il motivo per il quale qualcuno dovrebbe modificare un pezzo di questa catena di controlli, lo scopriremo più avanti (spoiler: jailbreak!).
Ogni passo di questa “catena di controllo”, contiene un insieme di componenti che sono state firmate digitalmente da Apple attraverso una certa codifica. Se immaginiamo che la catena sia formata da tre blocchi A, B e C, se non viene verificata l’integrità del blocco A, allora sarà impossibile passare alla verifica del blocco B e così via.
E’ quindi facilmente intuibile che un avvio sicuro è tale solo nel momento in cui tutti i blocchi vengono verificati attraverso la firma digitale, senza errori.
Addentrandoci nel tecnico, a cosa bisogna associare i blocchi che abbiamo precedentemente definito? A cosa equivalgono nella pratica A,B e C nella catena di controllo di iOS?
- Blocco A: appena un dispositivo con a bordo iOS viene acceso, il processore esegue immediatamente il codice della memoria di sola lettura conosciuta in bootROM. Com’è facilmente intuibile, memoria di sola lettura significa che contiene del codice immutabile inserito durante la fabbricazione del chip, che viene definita anche come la “radice” di attendibilità dell’hardware. Il codice presente all’interno non è aggiornabile, quindi trovare e sfruttare una falla in bootROM è la più grande soddisfazione alla quale un hacker può aspirare.
- Blocco B: il codice della bootROM contiene al suo interno la chiave pubblica dell’autorità di certificazione root di Apple, che consente di verifica che iBoot sia effettivamente firmato da Apple. Che cos’è iBoot? Semplicemente è il bootloader usato da Apple, cioè quel programma che durante l’avvio carica il kernel di iOS dalla memoria secondaria in RAM. E’ proprio quel componente di iOS che è stato leakato un paio di giorni fa!
- Blocco C: è il kernel, caricato ed eseguito da iBoot; si chiama XNU ed è open source e disponibile su GitHub. Praticamente è l’intermediario tra il software e l’hardware del dispositivo, un intermediario che regola alcune funzioni di basso livello.
Osservando l’immagine, vi starete chiedendo cosa sia il blocco LLB.
Per i processori A9 o quelli della serie A precedenti, la bootROM (blocco A) carica un passaggio aggiuntivo detto LLB che ha il compito di caricare ed eseguire iBoot.
Se sfortunatamente non è possibile caricare o eseguire il bootloader di basso livello LLB, si entra nella modalità di recupero DFU, cioè bisogna collegare il dispositivo ad iTunes per eseguire un ripristino.
La catena di avvio a questo punto è praticamente corrotta, quindi seguirà un percorso sostanzialmente diverso: qualcosa è andato storto, quindi sarà praticamente impossibile caricare ed eseguire iBoot, quindi il dispositivo non si accenderà!
Come rimediare?
Succede che semplicemente, si accede ad un altro blocco che prende il nome di iBSS. Questo ulteriore componente è una versione ridotta e scalata di iBoot che non ha nessuna interazione con il filesystem di iOS, la sua unica funziona è quella di eseguire il caricamento (nel gergo, bootstrap) di un altro blocco, definito come il “fratello di iBoot” che si chiama iBEC che è il responsabile della gestione dei comandi quando colleghiamo il nostro iPhone ad un computer. Grazie a questa catena alternativa, è possibile entrare in modalità DFU, per il ripristino del dispositivo
Vi sareste mai aspettati così tanti passaggi per eseguire la semplice operazione di accensione del vostro dispositivo?
Anche per questo articolo è tutto. Per eventuali domande, curiosità o feedback potete lasciare un commento qui in basso, a presto!