Процесс загрузки компьютера Mac с чипом Apple
При включении компьютера Mac с чипом Apple он выполняет процесс загрузки, который очень похож на процесс загрузки iPhone и iPad.
Чип исполняет код из загрузочного ПЗУ, что является первым звеном цепочки доверия. Процесс безопасной загрузки macOS на компьютере Mac с чипом Apple проверяет не только сам код операционной системы, но и политики безопасности и даже расширения ядра (поддерживается, но не рекомендуется), настроенные авторизованными пользователями.
После запуска низкоуровневого загрузчика он проверяет подписи и загружает парную системную прошивку для ядер внутри системы на кристалле, таких как контроллеры хранилища, дисплея, управления системой и контроллер Thunderbolt. Низкоуровневый загрузчик также отвечает за загрузку политики LocalPolicy, которая представляет собой файл с подписью сопроцессора Secure Enclave. В ней содержится описание конфигурации, выбранной пользователем для загрузки системы, и политик безопасности среды выполнения. Структура данных политики LocalPolicy имеет такой же формат, как и у всех других объектов загрузки, однако файл политики подписан локально личным ключом, который доступен только в Secure Enclave определенного компьютера, а не центральным сервером Apple (как обновления программного обеспечения).
Для того чтобы предотвратить повторное выполнение предыдущих политик LocalPolicy, низкоуровневому загрузчику следует найти значение функции антиповтора в компоненте защищенного хранилища с Secure Enclave. Для этого используется загрузочное ПЗУ Secure Enclave. Затем выполняется проверка того, совпадает ли значение функции антиповтора в политике LocalPolicy со значением функции антиповтора в компоненте защищенного хранилища. Эта мера направлена на то, чтобы предупредить повторное применение к системе старой политики LocalPolicy, которая, возможно, была ранее настроена на обеспечение более низкого уровня защиты, после повышения уровня безопасности системы. В результате безопасная загрузка на компьютере Mac с чипом Apple помогает защитить не только от возврата к предыдущим версиям операционной системы, но и от понижения уровня политики безопасности.
В политике LocalPolicy фиксируется уровень настройки безопасности операционной системы: высший уровень безопасности, сниженный уровень безопасности и низкий уровень безопасности.
Высший уровень безопасности. В этом режиме система работает так же, как и iOS и iPadOS; допускается загрузка только программного обеспечения, которое было заведомо наиболее актуальным на момент установки.
Сниженный уровень безопасности. Низкоуровневому загрузчику предписывается доверять «глобальным» подписям, которые поставляются в комплекте с операционной системой. Благодаря этому на компьютере можно использовать более ранние версии macOS. Поскольку в старых версиях macOS неизбежно имеются неустраненные уязвимости, данный уровень безопасности называется сниженным. Кроме того, этот уровень политики необходим для поддержки загрузки расширений ядра.
Низкий уровень безопасности. Если выбран этот уровень безопасности, система работает так же, как и в режиме сниженного уровня безопасности в отношении использования глобальных подписей для iBoot и не только, однако в этом режиме iBoot предписывается принимать некоторые объекты загрузки, подписанные Secure Enclave с помощью того же ключа, который использовался для подписания политики LocalPolicy. Этот уровень политики поддерживает создание, подписание и загрузку пользователями собственных ядер XNU.
Если политика LocalPolicy указывает низкоуровневому загрузчику, что операционная система запущена в режиме высшего уровня безопасности, низкоуровневый загрузчик проверяет персональную подпись для iBoot. Если операционная система запущена в режиме сниженного или низкого уровня безопасности, проверяется глобальная подпись. В случае возникновения любых ошибок при проверке система загружает recoveryOS для предоставления вариантов исправления ошибок.
После того как низкоуровневый загрузчик передает управление загрузчику iBoot, последний загружает парную прошивку macOS, например: прошивку для защищенной системы Neural Engine, всегда включенного процессора и другие прошивки. Загрузчик iBoot также проверяет информацию о политике LocalPolicy, переданную ему низкоуровневым загрузчиком. Если политика LocalPolicy указывает на необходимость наличия вспомогательной коллекции ядра (AuxKC), iBoot выполняет поиск AuxKC в файловой системе, проверяет, была ли она подписана Secure Enclave с использованием того же ключа, что и для политики LocalPolicy, а затем проверяет, совпадает ли ее хеш с тем, который хранится в политике LocalPolicy. После проверки AuxKC загрузчик iBoot помещает ее в память вместе с загрузочной коллекцией ядра, прежде чем заблокировать всю область памяти, в которой находятся загрузочная коллекция ядра и AuxKC, с помощью защиты целостности системного сопроцессора (SCIP). Если в политике указано, что необходима коллекция AuxKC, однако она не найдена, система продолжает загрузку macOS без нее. iBoot также отвечает за проверку корневого хеша подписанного системного тома (SSV), чтобы убедиться в полной целостности файловой системы, которую будет подключать ядро.