Rosetta 2 på Macer med Apple-chip
Macer med Apple-chip kan kjøre kode kompilert for x86_64-instruksjonssettet ved hjelp av en oversettingsmekanisme som kalles Rosetta 2. Det tilbys to typer oversetting: Just-in-time og Ahead-of-time.
Just-in-time-oversetting
I oversettingsprosessen Just-in-time (JIT) identifiseres et x86_64-Mach-objekt tidlig i diskfilens kjøringsbane. Når disse bildene forekommer, overfører kjernen kontroll til en spesiell Rosetta-oversettelsesstubb i stedet for den dynamiske lenkeredigereren, dyld(1)
. Oversettelsesstubben oversetter deretter x86_64-sider når diskfilen kjører. Denne oversettelsen finner kun sted i prosessen. Kjernen verifiserer fortsatt kodehashene av hver x86_64-side mot kodesignaturen tilknyttet binærfilen. I tilfeller med manglende hashsamsvar håndhever kjernen repareringsregelsettet som er egnet for den prosessen.
Ahead-of-time-oversetting
I oversettingsprosessen Ahead-of-time (AOT) leses x86_64-binærfiler fra lagring på tidspunkter som systemet vurderer som optimale for responsivitet av den koden. De oversatte artefaktene skrives til lagring som en spesiell type Mach-objektfil. Den filen ligner på en kjørbar diskfil, men markeres for å indikere at det er det oversatte produktet til en annen diskfil.
I denne modellen avleder AOT-artefakten all identitetsinformasjon fra den originale kjørbare x86_64-diskfilen. For å håndheve denne bindingen signerer en privilegert brukerområdeenhet oversettelsesartefakten ved hjelp av en enhetsspesifikk nøkkel som administreres av Secure Enclave. Denne nøkkelen frigis kun til den privilegerte brukerområdeenheten, som identifiseres som dette ved hjelp av en begrenset rettighet. Kodekatalogen opprettet for oversettelsesartefakten inkluderer kodekataloghashen av den originale kjørbare x86_64-diskfilen. Signaturen på selve oversettelsesartefakten kalles tilleggssignaturen.
AOT-prosessen begynner likt som JIT-prosessen, der kjernen overfører kontroll til Rosetta-kjøringen i stedet for til den dynamiske lenkeredigereren dyld(1)
. Rosetta-kjøringen sender imidlertid deretter en IPC-spørring til Rosetta-systemtjenesten, som spør om det finnes en AOT-oversettelse tilgjengelig for den gjeldende kjørbare diskfilen. Hvis det finnes, gir Rosetta-tjenesten en referanse til denne oversettelsen og så tilordnes den i prosessen og kjøres. Under kjøring håndhever kjernen kodekataloghashene av oversettelsesartefakten som autentiseres av signaturen rotfestet i den enhetsspesifikke signeringsnøkkelen. Kodekataloghashene av den originale x86_64-diskfilen er ikke involvert i denne prosessen.
Oversatte artefakter lagres i et datahvelv som ikke er tilgjengelig under kjøring av noen enheter, unntatt Rosetta-tjenesten. Rosetta-tjenesten administrerer tilgang til bufferen ved å distribuere skrivebeskyttede fildeskriptorer til individuelle oversettelsesartefakter, noe som begrenser tilgang til AOT-artefaktbufferen. Denne tjenestens IPC og tilhørende fotavtrykk er med vilje svært innskrenket for å begrense angrepsflaten.
Hvis kodekataloghashene av den originale x86_64-diskfilen ikke samsvarer med den som er kodet inn i signaturen til AOT-oversettelsesartefakten, tilsvarer dette en ugyldig kodesignatur og det blir tatt egnede håndhevingstiltak.
Hvis en ekstern prosess spør kjernen om rettighetene eller andre kodeidentitetsegenskaper til en AOT-oversatt kjørbar fil, returneres identitetsegenskapene til den originale x86_64-diskfilen til den.
Innhold i statiske godkjenningsbuffere
macOS 11 eller nyere leveres med «fete» Mach-binærfiler som inneholder biter av x86_64- og arm64-datamaskinkode. På Macer med Apple-chip kan brukeren velge å kjøre x86_64-biten av en systembinærfil via Rosetta-prosessen, for eksempel for å laste et tillegg som ikke har en opprinnelig arm64-variant. For å støtte denne tilnærmingen inneholder den statiske godkjenningsbufferen som leveres med macOS, generelt sett, tre kodekataloghasher per Mach-objektfil:
kodekataloghash av arm64-biten
kodekataloghash av x86_64-biten
kodekataloghash av AOT-oversettelsen av x86_64-biten
Rosetta AOT-oversettelsesprosedyren er deterministisk og reproduserer identisk utdata for hvilken som helst gitt inndata, uten hensyn til når oversettelsen ble utført eller på hvilken enhet den ble utført.
Under bygging av macOS kjøres hver Mach-objektfil gjennom Rosetta AOT-oversettelsesprosessen som er forbundet med versjonen av macOS som bygges, og den resulterende kodekataloghashen registreres i godkjenningsbufferen. De faktisk oversatte produktene leveres ikke med operativsystemet av effektivitetsårsaker og kan rekonstitueres på etterspørsel når brukeren ber om dem.
Når en x86_64-diskfil kjøres på en Mac med Apple-chip, hvis den diskfilens kodekataloghash er i den statiske godkjenningsbufferen, forventes det at den resulterende kodekataloghashen av AOT-artefaktet også er i den statiske godkjenningsbufferen. Slike produkter signeres ikke av den enhetsspesifikke nøkkelen siden signeringsautoriteten er rotfestet i Apples sikre oppstartssekvens.
Usignert x86_64-kode
Macer med Apple-chip tillater ikke at standard arm64-kode kjøres uten en tilknyttet kodesignatur. Denne signaturen kan være så enkel som en «ad hoc»-kodesignatur (jf. codesign(1)
), som ikke innehar en faktisk identitet fra den hemmelige halvdelen av et asymmetrisk nøkkelpar (det er rett og slett en ikke-godkjent måling av binærfilen).
Oversatt x86_64-kode får lov til å kjøre gjennom Rosetta uten noen som helst signaturinformasjon på grunn av binær kompatibilitet. Det overføres ingen spesifikk identitet til denne koden gjennom den enhetsspesifikke Secure Enclave-signeringsprosedyren, og den kjøres med akkurat samme begrensninger som standard usignert kode som kjøres på Intel-baserte Macer.