Proceso de arranque para un Mac con chip de Apple
Cuando se enciende un Mac con chip de Apple, realiza un proceso de arranque muy similar al del iPhone y el iPad.
El chip ejecuta código de la ROM de arranque en el primer paso de la cadena de confianza. El arranque seguro de macOS en un Mac con chip de Apple no solo verifica el propio código del sistema operativo, sino también las políticas de seguridad e incluso las kexts (admitidas, aunque no recomendadas) configuradas por usuarios autorizados.
Cuando se inicia el cargador de arranque de bajo nivel (LLB), verifica las firmas y carga firmware enlazado por el sistema para núcleos intraSoC, como los controladores de almacenamiento, pantalla, gestión del sistema y Thunderbolt. El LLB también es responsable de cargar el archivo LocalPolicy, que es un archivo firmado por el procesador Secure Enclave. Este archivo describe la configuración que el usuario ha seleccionado para las políticas de arranque del sistema y de seguridad en tiempo de ejecución. El archivo LocalPolicy tiene el mismo formato de estructura de datos que todos los demás objetos de arranque, pero está firmado localmente por una clave privada que solo está disponible en el componente Secure Enclave de un ordenador determinado, en lugar de por un servidor central de Apple (como las actualizaciones de software).
Para ayudar a evitar la reproducción de cualquier archivo LocalPolicy anterior, el LLB debe buscar un valor de antirreproducción del componente de almacenamiento seguro asociado a Secure Enclave. Para ello, utiliza la ROM de arranque de Secure Enclave y se asegura de que el valor de antirreproducción del archivo LocalPolicy se corresponde con el valor de antirreproducción del componente de almacenamiento seguro. Esto ayuda a impedir que un antiguo archivo LocalPolicy, que podría estar configurado para un nivel de seguridad inferior, vuelva a aplicarse al sistema después de actualizar la seguridad. En consecuencia, el arranque seguro de un Mac con chip de Apple ayuda a proteger no solo contra ataques que intentan restablecer versiones anteriores del sistema operativo, sino también contra posibles degradaciones de las políticas de seguridad.
El archivo LocalPolicy recoge si el sistema operativo está configurado para una seguridad total, reducida o permisiva:
Seguridad máxima: El sistema se comporta como iOS y iPadOS, y solo permite el software de arranque más reciente en el momento de la instalación.
Seguridad reducida: Se indica al LLB que confíe en firmas “globales”, incluidas con el sistema operativo. Esto permite al sistema ejecutar versiones anteriores de macOS. A este nivel de seguridad se le llama reducida porque, inevitablemente, las versiones anteriores de macOS tienen vulnerabilidades sin correcciones. Este es también el nivel de política requerido para admitir el arranque de extensiones del kernel (kexts).
Seguridad permisiva: Al igual que la seguridad reducida, el sistema utiliza la verificación de firmas globales para iBoot y más, pero también indica a iBoot que debe aceptar algunos objetos de arranque firmados por Secure Enclave con la misma clave utilizada para firmar LocalPolicy. Este nivel de política permite que los usuarios compilen, firmen y arranquen sus propios kernels XNU personalizados.
Si LocalPolicy indica al LLB que el sistema operativo seleccionado se está ejecutando en el modo de seguridad máxima, el LLB evalúa la firma personalizada para iBoot. Si se ejecuta con seguridad reducida o permisiva, el LLB evalúa la firma global. Cualquier error de verificación de la firma provocará que el sistema arranque en el sistema operativo de recuperación para ofrecer opciones de reparación.
Después de que el LLB traspase el control a iBoot, este carga firmware enlazado por macOS, como los del Neural Engine seguro, el procesador AOP y otro firmware. iBoot también consulta información del archivo LocalPolicy que le transfiere el LLB. Si LocalPolicy indica que debe haber una colección de kernel auxiliar (AuxKC), iBoot la busca en el sistema de archivos, verifica que está firmada por Secure Enclave con la misma clave que LocalPolicy y comprueba que su hash se corresponde con el almacenado en LocalPolicy. Si se verifica la AuxKC, iBoot la coloca en la memoria con la colección de kernel de arranque, antes de bloquear la región de memoria completa que cubre dicha colección y la AuxKC con la protección de la integridad del coprocesador del sistema (SCIP). Si la política indica que debe haber presente una AuxKC pero no se encuentra, el sistema sigue arrancando en macOS sin ella. iBoot también es responsable de verificar el hash de arranque para el volumen del sistema firmado (SSV), con el fin de garantizar que la integridad del sistema de archivos que montará el kernel está completamente verificada.