![](https://help.apple.com/assets/6537FB06A074DBB5E802EA07/6537FB31280588A5490B6E1D/ru_RU/52d714626638d3391623c853be0c593b.png)
Rosetta 2 на компьютере Mac с чипом Apple
Компьютер Mac с чипом Apple способен запускать код, скомпилированный для набора инструкций x86_64, с помощью механизма преобразования под названием Rosetta 2. Предлагается два типа преобразования: точно в нужный момент и заблаговременно.
Преобразование точно в нужный момент
При использовании преобразования точно в нужный момент (JIT) идентификация объекта Mach x86_64 выполняется на раннем этапе исполнения образа. Встречая такие образы, ядро передает управление специальной заглушке преобразования Rosetta, а не динамическому редактору ссылок dyld(1)
. Заглушка преобразования выполняет преобразование страниц x86_64 во время исполнения образа. Преобразование выполняется полностью внутри процесса. Ядро по‑прежнему проверяет хеши кода каждой страницы x86_64 на соответствие подписи кода, прикрепленной к двоичному файлу, когда происходит сбой страницы. В случае несоответствия хеша ядро применяет соответствующую политику исправления, подходящую для этого процесса.
Заблаговременное преобразование
При использовании заблаговременного преобразования (AOT) чтение двоичных файлов x86_64 из хранилища выполняется в те моменты, которые система считает оптимальными для скорости отклика этого кода. Преобразованные артефакты записываются в хранилище как особый файл объекта Mach. Этот файл похож на исполняемый образ, но содержит пометку, что это результат преобразования другого образа.
В этой модели артефакт AOT получает всю свою идентификационную информацию из исходного исполняемого образа x86_64. Для обеспечения этой привязки привилегированный объект пользовательского пространства подписывает преобразованный артефакт с помощью ключа конкретного устройства, которым управляет Secure Enclave. Этот ключ выдается только привилегированному объекту пользовательского пространства, который идентифицируется в этом качестве с помощью ограниченного права. Каталог кода, созданный для артефакта преобразования, включает хеш каталога кода исходного исполняемого образа x86_64. Подпись самого артефакта преобразования называется дополнительной подписью.
Процесс AOT начинается аналогично процессу JIT, то есть ядро передает управление среде выполнения Rosetta, а не динамическому редактору ссылок dyld(1)
. Однако затем среда выполнения Rosetta отправляет в системную службу Rosetta запрос межпроцессного взаимодействия о том, доступно ли преобразование AOT для текущего исполняемого образа. Если такое преобразование найдено, служба Rosetta предоставляет дескриптор этого преобразования, после чего оно сопоставляется с процессом и исполняется. Во время исполнения ядро применяет хеши каталога кода артефакта преобразования, которые аутентифицируются подписью с корнем в ключе подписания конкретного устройства. Хеши каталога кода исходного образа x86_64 не участвуют в этом процессе.
Преобразованные артефакты находятся в хранилище Data Vault, которое во время выполнения недоступно для любых объектов, кроме службы Rosetta. Служба Rosetta управляет доступом к своему кэшу, выдавая доступные только для чтения файловые дескрипторы отдельным артефактам преобразования; это ограничивает доступ к кэшу артефакта AOT. Межпроцессное взаимодействие и зависимая область этой службы намеренно оставлены очень узкими, чтобы минимизировать атакуемую область.
Если хеш каталога кода исходного образа x86_64 не совпадает с хешем, закодированным в подписи артефакта преобразования AOT, это равноценно недействительной подписи кода и приводит к принятию соответствующих принудительных мер.
Если удаленный процесс запрашивает у ядра права доступа или другие идентифицирующие свойства кода исполняемого файла, преобразованного AOT, ему возвращаются идентифицирующие свойства исходного образа x86_64.
Содержимое статического доверенного кэша
macOS 11 или новее поставляется с мультиархитектурными двоичными файлами Mach, которые содержат фрагменты кода x86_64 и arm64. Пользователь компьютера Mac с чипом Apple может выбрать исполнение фрагмента x86_64 системного двоичного файла через процесс Rosetta, например, чтобы загрузить подключаемый модуль, не имеющий нативной версии arm64. Для поддержки этого подхода статический доверенный кэш, который поставляется с macOS, в основном содержит три хеша каталога кода на каждый файл объекта Mach.
Хеш каталога кода фрагмента arm64.
Хеш каталога кода фрагмента x86_64.
Хеш каталога кода фрагмента заблаговременного (AOT) преобразования x86_64.
Процедура преобразования AOT Rosetta детерминирована. Она дает одинаковый результат для любого отдельно взятого набора входных данных, независимо от того, когда или на каком устройстве было выполнено преобразование.
Во время сборки macOS каждый файл объекта Mach проходит через процесс преобразования AOT Rosetta, связанный с версией данной macOS, и полученный хеш каталога кода записывается в доверенный кэш. Из соображений эффективности фактические результаты преобразования не поставляются с операционной системой и воссоздаются по запросу, когда пользователь их запрашивает.
Когда на компьютере Mac с чипом Apple исполняется образ x86_64, то, если хеш каталога кода этого образа находится в статическом доверенном кэше, хеш каталога кода полученного артефакта AOT также должен находиться в статическом доверенном кэше. Такие продукты не подписываются ключом конкретного устройства, поскольку корень полномочий подписания находится в последовательности безопасной загрузки Apple.
Неподписанный код x86_64
Компьютер Mac с чипом Apple не разрешает исполнение нативного кода arm64 без прикрепленной подписи кода. Эта подпись может быть такой же простой, как специальная ad-hoc подпись кода (ср. с codesign(1)
), не содержащая никакой идентификационной информации из секретной половины пары асимметричных ключей (это неаутентифицированное измерение двоичного файла).
Из соображений совместимости двоичных файлов преобразованному коду x86_64 разрешено исполняться через Rosetta, даже не имея никакой информации о подписи. Процедура подписи Secure Enclave для конкретного устройства никак не идентифицирует этот код, и он исполняется с теми же ограничениями, что и собственный неподписанный код, исполняемый на компьютере Mac с процессором Intel.