- Apple의 Exclaves는 XNU 커널이 침해돼도 일부 민감 리소스를 별도 영역에 남겨두려는 격리 기능이며, M4·A18용 XNU 소스 공개로 구조 일부가 드러남
- XNU는 Mach 기반이지만 실제 시스템 기능은 같은 특권 범위에 몰려 있어 모놀리식 커널처럼 동작하고, Exclaves는 Secure Enclave, PPL, SPTM으로 이어진 방어 심화 흐름 위에 있음
- Exclaves는 부팅 시 정의되는 도메인과 리소스로 구성되며, 공유 메모리 버퍼, 오디오 버퍼, 센서, Conclave, 서비스 등을 SPTM의 새 페이지 타입으로 XNU에서 보호함
- Secure Kernel(SK) 은 XNU와 같은 애플리케이션 프로세서에서 동작하며, 소스 단서상 seL4 계열 및 ARM TrustZone secure world 사용 가능성이 있지만 내부 구현 상당 부분은 공개되지 않음
- 실제 보안 효과는 어떤 구성요소가 Exclaves로 이동하느냐에 달려 있으며, 현재 빌드 이미지는 카메라·마이크 보안 표시기, Apple Neural Engine 일부, 일부 드라이버, Secure Enclave 통신 구성요소 사용을 가리킴
모놀리식 커널과 Apple의 격리 강화 흐름
- 현대 운영체제는 보통 사용자 모드와 커널 모드라는 두 보호 도메인으로 동작함
- 애플리케이션은 파일 접근이나 네트워크 통신 같은 강한 권한 작업을 직접 수행하지 못하고 시스템 호출을 통해 커널에 요청함
- 커널은 접근 권한을 확인한 뒤 열린 파일을 나타내는 핸들 같은 결과를 사용자 모드로 돌려줌
- 대부분의 운영체제는 모놀리식 커널 구조를 사용하며, 커널은 하드웨어, 메모리, 사용자 데이터 전체에 제한 없는 접근 권한을 가짐
- 커널이 커질수록 취약점이 생길 가능성도 커짐
- 커널 취약점 악용은 전체 시스템 침해로 이어질 수 있음
- 마이크로커널은 커널 내부 기능을 줄이고 대부분의 작업을 별도 비특권 프로세스로 밀어내 보안 격리를 개선할 수 있음
- 성능 문제와 애플리케이션 소프트웨어 복잡도 증가는 단점으로 남음
- iOS, macOS, tvOS, visionOS, watchOS가 공유하는 XNU는 Mach 마이크로커널 기반이지만, 구현상 여러 시스템 기능이 같은 특권 범위에 있어 사실상 모놀리식 커널처럼 동작함
Exclaves 이전의 Apple 보안 격리
- 2013년 iPhone 5s에는 Secure Enclave가 도입됨
- 전용 강화 CPU 코어에서 SepOS라는 마이크로커널 기반 OS가 실행됨
- SepOS의 커널은 Apple의 L4-embedded 커스텀 버전인 cL4임
- 암호화 키와 Face ID 같은 생체 정보 보호에 사용됨
- iOS 커널이 침해돼도 Secure Enclave 자체를 겨냥한 추가 익스플로잇이 없으면 대체로 영향을 받지 않음
- Secure Enclave와 Secure Exclaves는 서로 다른 대상임
- 2017년 A11 기반 iPhone 8·iPhone X에서는 Page Protection Layer(PPL) 가 도입됨
- 커널 일부에만 메모리 페이지 테이블 수정 권한을 주고, 나머지 커널은 직접 수정하지 못하게 함
- 공격 표면이 작아 우회가 드물었지만, 나머지 커널은 여전히 데이터 침해에 필요한 많은 권한을 유지함
- 2021~2023년 A15와 iOS 17에서는 Secure Page Table Monitor(SPTM) 가 PPL을 대체·개선함
- 추가 메모리 기능을 보호하고 작은 커널 구성요소 단위로 격리함
- Apple 서명 여부를 확인하는 코드 서명 검증도 분리됨
- 이 시기 XNU 소스에 exclaves 간접 참조가 나타났고, 당시에는 SPTM이 관리하는 하위 시스템으로 추정됨
2024년 XNU Exclaves의 등장
- M4·A18 기반 시스템을 지원하는 XNU 소스 공개로 Exclaves 구조 일부가 드러남
- iPhone 16 같은 시스템이 대상임
- 이전 프로세서에서는 Exclaves가 활성화되지 않음
- Exclaves는 XNU에서 분리된 리소스를 가리키며, 커널이 침해돼도 보호되는 영역으로 설계됨
- 리소스는 OS 빌드 시 미리 정의됨
- 이름 또는 ID로 식별됨
- 타입을 가지며 부팅 시 초기화됨
- 고유한 도메인으로 구성됨
- SPTM은 Exclave 전용 페이지 타입으로 Exclave 메모리를 XNU에서 보호함
- 확인된 리소스 타입은 XNU와 Exclave 사이의 경계가 어디에 생기는지 보여줌
- XNU와 Exclave가 함께 접근할 수 있는 공유 메모리 버퍼
- XNU 입장에서 읽기 전용 또는 읽기·쓰기 가능으로 설정될 수 있음
- 카메라·마이크 접근 표시기 같은 기능 보안에 쓰이는 오디오 버퍼와 센서
- 여러 리소스를 자체 보안 도메인으로 묶는 Conclave와 Conclave Manager
- XNU 스레드가 호출할 때 Exclave 공간에서 코드를 실행할 수 있는 서비스
- XNU와 Exclave가 함께 접근할 수 있는 공유 메모리 버퍼
Secure Kernel과 secure world
- Exclave 서비스가 XNU에서 격리된 상태로 실행되도록 Apple은 Secure Kernel(SK) 을 도입함
- SK 이미지 파일에는 “cL4” 버전 문자열이 포함됨
- IPC 구조는 원래 SepOS cL4의 L4-embedded보다 seL4에 더 가까워 보임
- SK 문자열에는 capability, frame, untyped memory, minting 같은 seL4 계열 용어가 자주 등장함
- Apple은 2024년 4월 seL4 Foundation 가입을 공개함
- SepOS가 전용 프로세서에서 실행되는 것과 달리, SK는 XNU/iOS와 같은 고속 애플리케이션 프로세서에서 실행됨
- 이 구조에는 추가 프로세서 특권 레벨이 필요하며, 가능한 기반으로 가상화 확장, Apple의 SPTM 추가 기능, ARM TrustZone이 거론됨
- XNU 소스에는 TrustZone의 secure world 전환 관련 참조가 있음
- XNU와 iOS는 insecure world에서, SK는 secure world에서 동작하는 구조로 해석됨
- SK는 Exclave, 리소스, 서비스에 제한된 운영 환경을 제공함
- ARM이 제안한 Trusted Applications 설계 패턴과는 다름
- Exclave 서비스와 Secure Kernel의 공격 표면이 제한적이어서, secure world에서 탈출해 XNU를 침해하는 일은 insecure world에서 XNU를 직접 공격하는 것보다 훨씬 어려울 가능성이 있음
- XNU 소스에서 secure world 전환은 RINGGATE로 지칭됨
- SPTM이 전환을 관리할 수 있다는 부분은 추정에 머물며, 관련 영역은 오픈소스가 아니라 바이너리 분석이 필요함
도메인, 리소스, Conclave
- XNU는 부팅 중 발견한 Exclave 리소스 정보를 담기 위해 2단계 커널 테이블 구조를 초기화함
root_table은 이름으로 도메인을 식별함- 각 도메인은 해당 도메인의 리소스를 담는 2단계 테이블을 참조함
- 확인된 도메인 구조는 다음과 같음
com.apple.kernel- Conclave launcher, 디버그 서비스, 보안 표시등용 ExclaveIndicatorController, 로그 서비스, ExclaveKit 부팅에 쓰이는 FrameMint 등을 포함함
- Exclave 서비스가 upcall을 통해 XNU 공간에서 파일 I/O를 수행하는 데 쓰는 공유 메모리 버퍼
com.apple.storage.backend도 포함함 - Conclave마다 하나씩 있는 Conclave Manager 리소스를 포함함
com.apple.darwin- 오픈소스 컴포넌트에서는 사용 사례가 없음
com.apple.conclave.name- Conclave마다 하나의 도메인이 존재함
- 서비스, 오디오 버퍼, 공유 메모리 버퍼 등을 포함할 수 있음
com.apple.driver.*name*- 디바이스 드라이버별 도메인으로 주석에 근거해 존재가 언급되지만, 오픈소스 코드에서 실제 확인되지는 않음
- Conclave는 여러 리소스를 담을 수 있는 리소스 타입이면서, 서비스와 리소스가 서로 공유 접근을 갖도록 하는 보안 단위임
- Mach task는 호출 가능한 Conclave가 제한됨
- 각 Conclave에는 커널 도메인에 위치한 Conclave Manager가 있음
- Conclave는 attach, launch, stop, detach 같은 생명주기를 가짐
- launching, stopping 같은 전환 상태도 존재함
Conclave 생성, 연결, 실행
- XNU의
posix_spawn()은task_add_conclave()를 호출해 task와 Conclave Manager 리소스를 연결할 수 있음- 관계는 1:1임
- 하나의 task는 하나의 Conclave Manager에만 연결되고, 반대도 같음
- Conclave를 spawn할 수 있는 주체는 launchd 또는
com.apple.private.exclaves.conclave-spawnentitlement를 가진 task임com.apple.private.exclaves.conclave-hostentitlement는 새 task를 spawn하기보다 자기 자신을 attach하는 권한에 가까운 것으로 해석됨
- 커널은 대상 Conclave에 연결된 Conclave Manager 리소스를
com.apple.kernel도메인에서 찾음- 이후 Conclave 리소스 구조체에 Conclave Manager endpoint로 향하는 Tightbeam endpoint를 저장함
- Tightbeam은 Exclave 컴포넌트 간 통신을 위한 RPC 프레임워크로 보임
- Conclave 실행은 연결된 Conclave Manager task에서 수행돼야 함
- Exclaves가
EXCLAVES_BS_BOOTED_EXCLAVEKIT상태까지 완전히 부팅될 때까지 launch 시도가 대기함 - 새 Mach trap은
_exclaves_ctl_trap()함수로 들어오며,EXCLAVES_CTL_OP_LAUNCH_CONCLAVE가 Conclave 실행에 사용됨 - production 환경에서는 launch된 Conclave host가 tainted 상태가 될 수 있고, 이후
exit()가 커널 패닉을 일으킬 수 있음
- Exclaves가
Exclaves용 새 Mach trap
_exclaves_ctl_trap()은 Exclave 기능을 처리하는 새 Mach trap임- operation 파라미터에 따라 여러 동작을 수행함
- 일반적으로 호출된 operation에 필요한 entitlement를 검증함
EXCLAVES_CTL_OP_BOOT는 시스템 부팅 중 두 번 호출됨- Exclaves boot stage 2 시작
- ExclaveKit 부팅
- 호출자는 launchd이거나
com.apple.private.exclaves.bootentitlement를 가져야 함
- 나머지 주요 operation은 최소한 현재 task가
com.apple.private.exclaves.kernel-domainentitlement를 갖거나 관련 Conclave Manager task여야 함EXCLAVES_CTL_OP_LOOKUP_SERVICES: 현재 task의 Exclave 도메인에서 서비스를 찾고, 실패하면 권한에 따라 Darwin 도메인과 kernel 도메인을 확인함EXCLAVES_CTL_OP_ENDPOINT_CALL: 현재 task 도메인의 Exclave 서비스 endpoint를 호출해 현재 스레드가 secure world로 전환되고 특정 코드를 실행함- named buffer 생성과 copyin/copyout
- audio buffer 생성과 copyout
- sensor 생성, start, stop, status
- notification resource lookup
Downcall과 Upcall
- Downcall은 secure world에 있는 Exclave 서비스 endpoint 호출이며, secure world 코드 실행이 시작되는 지점임
- Downcall은 현재 스레드를 secure world로 전환하고 secure 코드의 entry point에서 실행을 시작함
- 다른 스레드에 작업을 맡기는 방식이 아님
- 호출 task는 kernel domain entitlement를 갖거나 해당 서비스 Conclave에 연결된 Conclave Manager task여야 함
- Conclave는 호출 가능한 서비스를 최대 128개까지 가짐
- XNU는
sk_enter()를 통해 스레드를 Secure Kernel로 스케줄링하는 것으로 보임- SK가 독립 스레드를 갖지 않고, XNU가 secure world의 모든 스레드 스케줄링을 처리할 가능성이 있음
- secure world에서 실행 중인 스레드는 yield, wait, suspend, interrupt 같은 일반 스케줄러 동작을 할 수 있음
- 이 경우 스레드는 secure world를 떠나 XNU 커널 컨텍스트로 돌아오고, 이후 Exclave 스케줄링 코드로 다시 secure world에 스케줄링됨
- Downcall의 IPC 구조는 secure world 진입 전에 request·response 버퍼로 설정됨
- 최종 IPC request 구조를 준비하고
sk_enter()를 호출하는 동안 인터럽트와 선점이 비활성화됨 - 이 구조가 CPU 코어마다 하나씩만 있기 때문임
- Downcall response는 중단, upcall, yield, 재스케줄링 때문에 다른 CPU의 per-core response buffer로 돌아올 수 있음
- 최종 IPC request 구조를 준비하고
- Upcall은 secure world에서 실행 중인 스레드가 XNU의 도움이 필요할 때 Tightbeam을 통해 Exclaves upcall handler를 호출하는 방식임
- 허용된 특정 XNU 함수로 제한됨
- upcall 중인 스레드는 사용자 모드로 돌아갈 수 없음
- secure world로 다시 downcall해 재진입하는 것도 허용되지 않음
- 스레드는 upcall을 수행한 지점의 secure world 컨텍스트로 되돌아가야 함
- 소스에서 확인된 upcall 범주는 메모리, 파일 저장소, DriverKit, DriverKit Apple Neural Engine, Conclave 제어임
XNUProxy와 부팅 단계
- XNUProxy에 대한 참조는 많지만 정확한 위치와 역할은 확정되지 않음
- 독립 Exclave 도메인일 수 있음
com.apple.kernel도메인에서 특정 downcall을 처리하는 서비스 또는 서비스 묶음일 수 있음- secure world로 downcall을 수행하는 SPTM 하위 시스템일 가능성도 있음
Exclaves_L4.h주석은 XNU Proxy가 여러 Exclave를 reachable하게 만든다고 적고 있음- user app 템플릿
- audio driver
- ExclaveDriverKit
- Always On Processor와 Display Coprocessor용 SecureRTBuddy
- Conclave control, Conclave debug 등
- Exclaves 부팅은 insecure world와 secure world 사이의 조율을 필요로 하며, 문제가 생기면 보통
panic()으로 이어짐 - 부팅은 세 단계로 나뉨
- Stage 1은 오픈소스에서 보이지 않으며, SK를 메모리에 로드하고 코드 서명을 검증한 뒤 실행 가능하게 만드는 secure boot 과정일 가능성이 있음
- Stage 2는 upcall server 초기화, secure kernel 부팅 정보 수집, Exclave scheduler 초기화, XrtHostedXNU kext 초기화, multicore 초기화, XNU Proxy 초기화, static Exclave resource 발견, Conclave Manager endpoint 생성 등을 수행함
- Stage 3은
com.apple.service.FrameMint서비스를 찾고framemint_framemint__init(),framemint_framemint_populate()관련 호출을 수행한 뒤EXCLAVES_BS_BOOTED_EXCLAVEKIT상태가 됨
SPTM 메모리 타입과 남은 한계
- SPTM은 하위 시스템별 접근 제어를 위해 메모리 페이지에 타입을 지정함
- 기존 타입에는
XNU_USER_EXEC,XNU_USER_DEBUG,XNU_USER_JIT,XNU_ROZONE,XNU_KERNEL_RESTRICTED, TXM·DART 관련 타입 등이 있음
- 기존 타입에는
- Exclaves는 새 SK 관련 타입을 추가함
SK_DEFAULT: SK 전용, XNU 접근 불가SK_IO: SK 전용, XNU 접근 불가SK_SHARED_RO: SK와 XNU가 공유하지만 XNU는 읽기 전용SK_SHARED_RW: SK와 XNU가 공유하며 XNU는 읽기·쓰기 가능
- Exclaves는 Apple 운영체제에 defence in depth를 추가하기 위한 큰 투자로 볼 수 있음
- 민감한 리소스를 격리해 잠재 공격 표면을 줄임
- 단일 커널 침해의 영향을 낮추는 방향임
- 실제로 어떤 구성요소가 커널에서 Exclaves로 이동하는지는 직접 분석되지 않음
- 빌드 이미지는 보안 카메라·마이크 표시기, Apple Neural Engine 일부 기능, 일부 디바이스 드라이버, Secure Enclave와 통신하는 구성요소 사용을 가리킴
- 향후 더 많은 구성요소가 Exclaves로 이동할 수 있음
- Exclaves 바깥의 XNU 영역은 여전히 공격 대상임
- 분석은 Apple Open Source XNU build 11215에 기반함
- ExclaveKit, ExclaveDriverKit, XNUProxy의 정확한 위치, XNU의 secure world 전환 방식, Secure Kernel, secure world userspace는 추가 분석이 필요한 영역으로 남아 있음