Rosetta 2 på en Mac med Apple Silicon
En Mac med Apple Silicon er i stand til at afvikle kode, der er kompileret til x86_64-instruktionssættet, ved at bruge en oversættelsesmekanisme med navnet Rosetta 2. Der er mulighed for to typer oversættelse: enten samtidig med (JIT – Just In Time) eller forud for (AOT – Ahead Of Time) afviklingen.
JIT-oversættelse
I JIT-oversættelsesprocessen identificeres et x86_64 Mach-objekt tidligt i billedafviklingen. Når disse billeder forekommer, overdrager kernen kontrollen til et særligt ankerpunkt for Rosetta-oversættelse i stedet for det dynamiske redigeringsværktøj til links, dyld(1)
. Ankerpunktet oversætter derefter x86_64-siderne under afvikling af billedet. Oversættelsen foregår udelukkende i processen. Kernen kontrollerer stadig hash-værdierne for koderne på hver x86_64-side i forhold til den kodesignatur, der blev knyttet til det binære arkiv, da siden blev inkorporeret. Hvis hash-værdierne ikke stemmer overens, håndhæver kernen den udbedringspolitik, der er relevant for den pågældende proces.
AOT-oversættelse
I AOT-oversættelsesprocessen læses binære x86_64-arkiver fra lagringspladsen på det tidspunkt, som systemet bedømmer til at være optimalt for den pågældende kodes reaktionsevne. De oversatte artefakter skrives til lagringspladsen som en særlig type Mach-objektarkiv. Arkivet ligner et billede, der kan afvikles, men det mærkes for at vise, at det er det oversatte produkt af et andet billede.
Med denne model henter AOT-artefakten alle sine identitetsoplysninger fra det oprindelige x86_64-app-billede. Håndhævelsen af denne binding sker ved, at en priviligeret entitet i brugerområdet signerer oversættelsesartefakten ved hjælp af en enhedsspecifik nøgle, der administreres af Secure Enclave. Nøglen frigives kun til den priviligerede entitet i brugerområdet, som identificeres ved hjælp af en begrænset berettigelse. Det kodebibliotek, der oprettes til oversættelsesartefakten, indeholder hash-værdien i kodebiblioteket til det oprindelige x86_64-app-billede. Signaturen på selve oversættelsesartefakten kaldes en supplerende signatur.
AOT-processen begynder i lighed med JIT-processen med, at kernen overdrager kontrollen til Rosetta-afviklingsfunktionen i stedet for det dynamiske redigeringsværktøj til links, dyld(1)
. Men derefter sender Rosetta-afviklingsfunktionen en proces til proces-forespørgsel (IPC) til Rosetta-systemtjenesten om, hvorvidt der er en tilgængelig AOT-oversættelse til det aktuelle app-billede. Hvis der findes en, oplyser Rosetta-tjenesten en reference til oversættelsen, og den inkorporeres i processen og afvikles. Under afviklingen håndhæver kernen hash-værdierne i kodebiblioteket for oversættelsesartefakten, som godkendes af den signatur, der er afledt af den enhedsspecifikke signeringsnøgle. Hash-værdierne i kodebiblioteket for det oprindelige x86_64-billede er ikke involveret i denne proces.
Oversatte artefakter opbevares i en Data Vault, som ingen entiteter bortset fra Rosetta-tjenesten har adgang til under afviklingen. Rosetta-tjenesten administrerer adgangen til sin buffer ved at distribuere skrivebeskyttede arkivbeskrivelser til de enkelte oversættelsesartefakter. Det begrænser adgangen til AOT-artefaktbufferen. Tjenestens proces til proces-kommunikation og tilhørende fodaftryk holdes med vilje smalt for at begrænse dens angrebsflade.
Hvis det oprindelige x86_64-billedes hash-værdi i kodebiblioteket ikke stemmer overens med den værdi, der er kodet ind i AOT-oversættelsesartefaktens signatur, betragtes kodesignaturen som ugyldig, og der træffes en passende foranstaltning.
Hvis en ekstern proces sender en forespørgsel til kernen for at få oplyst berettigelser eller andre kodeidentitetsegenskaber for et AOT-oversat app-arkiv, returneres egenskaberne for det oprindelige x86_64-billede til den.
Indhold i statisk buffer til godkendelse
macOS 11 og nyere versioner leveres med “fede” binære arkiver, som indeholder stykker af x86_64- og arm64-computerkode. På en Mac med Apple Silicon kan brugeren vælge at afvikle x86_64-stykket i et binært systemarkiv via Rosetta-processen, f.eks. for at indlæse et tilbehør, som ikke har en indbygget arm64-variant. Fremgangsmåden understøttes ved, at den statiske buffer til godkendelse, der leveres med macOS, som hovedregel indeholder tre hash-værdier i kodebiblioteket pr. Mach-objektarkiv.
En hash-værdi i kodebiblioteket til arm64-stykket
En hash-værdi i kodebiblioteket til x86_64-stykket
En hash-værdi i kodebiblioteket til AOT-oversættelsen af x86_64-stykket
Rosetta AOT-oversættelsesproceduren er deterministisk, ved at den genskaber identisk output for et givet input, uanset hvornår eller på hvilken enhed oversættelsen blev foretaget.
Når macOS bygges, gennemgår alle Mach-objektarkiver den Rosetta AOT-oversættelsesproces, der hører til den version af macOS, der bygges, og den hash-værdi i kodebiblioteket, der genereres, anføres i bufferen til godkendelse. Af hensyn til effektiviteten leveres de faktiske oversatte produkter ikke med operativsystemet, men etableres igen ved behov, når brugeren anmoder om dem.
Når et x86_64-billede afvikles på en Mac med Apple Silicon, og billedets hash-værdi i kodebiblioteket findes i den statiske buffer til godkendelse, forventes den genererede AOT-artefakts hash-værdi i kodebiblioteket også at være i den statiske buffer til godkendelse. Sådanne produkter signeres ikke med den enhedsspecifikke nøgle, da signeringsmyndigheden er forankret i Apples sikre startkæde.
Ikke-signeret x86_64-kode
En Mac med Apple Silicon tillader ikke, at indbygget arm64-kode afvikles, hvis den ikke har en gyldig kodesignatur. Signaturen kan blot være en ad hoc-kodesignatur (jf. codesign(1)
), som ikke indeholder en faktisk identitet fra den hemmelige halvdel af et asymmetrisk nøglepar (den er blot en ikke-godkendt måling af det binære arkiv).
Af hensyn til den binære kompatibilitet tillades afvikling af x86_64-kode via Rosetta helt uden signaturoplysninger. Koden tildeles ingen særlig identitet i den enhedsspecifikke signeringsprocedure i Secure Enclave, og den afvikles med præcis de samme begrænsninger som indbygget ikke-signeret kode, der afvikles på en Intel-baseret Mac.