Apple Silicon이 탑재된 Mac의 Rosetta 2
Apple Silicon이 탑재된 Mac은 Rosetta 2라는 변환 메커니즘을 사용하여 x86_64 명령 세트에 대해 컴파일된 코드를 실행할 수 있습니다. Just In Time 및 Ahead Of Time라는 두 가지 유형의 변환이 있습니다.
Just In Time 변환
JIT(Just In Time) 변환 파이프라인, x86_64 Mach 개체는 이미지 실행 경로의 초기에 확인됩니다. 이러한 이미지가 발견되면 커널은 동적 링크 에디터인 dyld(1)
가 아닌 특수 Rosetta 변환 스텁으로 제어 권한을 전송합니다. 그러면 변환 스텁은 이미지 실행 도중 x86_64 페이지를 변환합니다. 이러한 변환은 전적으로 프로세스 내에서 이루어집니다. 커널은 페이지 오류 발생에 따라 바이너리에 첨부된 코드 서명에 대해 각 x86_64 페이지의 코드 해시를 계속 확인합니다. 해시 불일치가 발생하는 경우 커널은 해당 프로세스에 적절한 교정 정책을 시행합니다.
Ahead Of Time 변환
AOT(Ahead Of Time) 변환 경로인 x86_64 바이너리는 시스템이 해당 코드의 반응성에 대해 최적이라고 판단될 때 저장 장치에서 읽히게 됩니다. 변환된 아티팩트는 특수한 유형의 Mach 개체 파일로 저장 장치에 기록됩니다. 해당 파일은 실행 가능 이미지와 유사하지만 다른 이미지의 변환된 결과물임을 뜻하는 정보가 있습니다.
이 모델에서 AOT 아티팩트는 모든 ID 정보를 원본 x86_64 실행 가능 이미지에서 파생합니다. 이 바인딩을 시행하기 위해 권한이 있는 사용자 공간 항목은 Secure Enclave에서 관리하는 기기별 키를 사용하여 변환 아티팩트에 서명합니다. 이 키는 제한된 권한을 사용하여 식별되는 권한이 있는 사용자 공간 항목에만 공개됩니다. 변환 아티팩트에 대해 생성된 코드 디렉토리에는 원본 x86_64 실행 가능 이미지의 코드 디렉토리 해시가 포함됩니다. 변환 아티팩트 자체에 있는 서명을 보조 서명이라고 합니다.
AOT 파이프 라인은 커널은 동적 링크 에디터인 dyld(1)
가 아닌 Rosetta 런타임으로 제어를 전송하면서 JIT 파이프 라인과 유사하게 시작됩니다. 하지만 Rosetta 런타임은 IPC(프로세스 간 통신) 쿼리를 Rosetta 시스템 서비스로 전송하여 현재 실행 가능 이미지에 대해 사용 가능한 AOT 변환이 있는지 묻습니다. 있는 경우, Rosetta 서비스는 해당 변환에 대한 핸들을 제공하며, 프로세스에 매핑되고 실행됩니다. 실행 중에 커널은 기기별 서명 키에 루트된 서명으로 인증된 변환 아티팩트의 코드 디렉토리 해시를 시행합니다. 원본 x86_64 이미지의 코드 디렉토리 해시는 이 프로세스와 관련이 없습니다.
변환된 아티팩트는 Rosetta 서비스를 제외한 어떤 항목도 런타임에 접근할 수 없는 Data Vault에 저장됩니다. Rosetta 서비스는 읽기 전용 파일 설명자를 개별 변환 아티팩트에 배포하여 캐시에 대한 접근을 관리합니다. 이는 AOT 아티팩트 캐시에 대한 접근을 제한합니다. 이 서비스의 프로세스 간 통신 및 종속 풋프린트는 공격 표면을 제한하기 위해 의도적으로 매우 좁게 유지됩니다.
원본 x86_64 이미지의 코드 디렉토리 해시가 AOT 변환 아티팩트의 서명으로 인코딩된 해시와 일치하지 않는 경우, 이 결과는 잘못된 코드 서명으로 간주되어 적절한 시행 조치가 취해집니다.
원격 프로세스가 AOT로 변환된 실행 파일의 권한 또는 기타 코드 ID 속성을 커널에 쿼리하는 경우, 원본 x86_64 이미지의 ID 속성이 반환됩니다.
정적 신뢰 캐시 콘텐츠
macOS 11 이상은 x86_64 및 arm64 컴퓨터 코드 슬라이스를 포함하는 Mach ‘fat’ 바이너리와 함께 제공됩니다. Apple Silicon이 탑재된 Mac에서 사용자는 다양한 이유로 Rosetta 파이프라인을 통해 시스템 바이너리의 x86_64 슬라이스를 실행하도록 결정할 수 있습니다. 예를 들면 기본 arm64 변형이 없는 플러그인을 로드하기 위한 이유가 있습니다. 이러한 접근을 지원하기 위해 일반적으로 macOS와 함께 제공되는 정적 신뢰 캐시에는 Mach 개체 파일당 3개의 코드 디렉토리 해시가 포함되어 있습니다.
arm64 슬라이스의 코드 디렉토리 해시
x86_64 슬라이스의 코드 디렉토리 해시
x86_64 슬라이스 AOT 변환의 코드 디렉토리 해시
Rosetta AOT 변환 절차는 변환이 수행된 시기 또는 수행된 기기와 상관없이 주어진 입력에 대해 동일한 출력을 재현한다는 면에서 결정론적입니다.
macOS 빌드 도중 모든 Mach 개체 파일은 빌드 중인 macOS 버전과 관련된 Rosetta AOT 변환 파이프라인을 통해 실행되며 결과 코드 디렉토리 해시는 신뢰 캐시에 기록됩니다. 실제 변환된 제품은 효율성을 이유로 운영 체제와 함께 제공되지 않으며 사용자가 요청하는 경우 재구성됩니다.
Apple Silicon이 탑재된 Mac에서 x86_64 이미지가 실행될 때 해당 이미지의 코드 디렉토리 해시가 정적 신뢰 캐시에 있는 경우, 결과 AOT 아티팩트의 코드 디렉토리 해시 또한 정적 신뢰 캐시에 있을 것으로 예상됩니다. 이러한 제품은 서명 기관이 Apple 보안 시동 체인에 뿌리를 두고 있기 때문에 기기별 키로 서명되지 않습니다.
서명되지 않은 x86_64 코드
Apple Silicon이 탑재된 Mac은 유효한 서명이 첨부되지 않으면 기본 arm64 코드 실행을 허용하지 않습니다. 이 서명은 비대칭 키 쌍의 감춰진 절반에서 실제 신원을 가지고 있지 않은 ‘임시’ 코드 서명 (codesign(1)
와 비교 시)처럼 간단할 수 있습니다(단순히 바이너리의 인증되지 않은 측정임).
바이너리 호환성을 위해 변환된 x86_64 코드는 서명 정보가 전혀 없어도 Rosetta를 통해 실행되도록 허용됩니다. 기기별 Secure Enclave 서명 절차를 통해 이 코드에 특정 ID가 전달되지 않으며 Intel 기반 Mac에서 실행되는 서명되지 않은 기본 코드와 정확히 동일한 제한으로 실행됩니다.