
TEE 드라이버(CVE-2021-44733) 악용을 위한 취약한 커널 환경
최근 리눅스 커널 TEE 서브시스템(버전 5.15.11까지 포함)에서 use-after-free 취약점이 발견되어 CVE-2021-44733 [1]이 할당되었습니다.
처음에는 여러 이유로 익스플로잇이 불가능해 보였지만, 취약한 코드 경로를 추가로 분석하고 개념 증명 익스플로잇을 구현한 결과 커널의 함수 포인터를 덮어쓸 수 있었습니다. 이 글에서는 권한 상승 페이로드를 제시하지 않지만, OPTEE와 익스플로잇을 실행하기 위한 전체 환경을 추가 테스트용으로 제공합니다('환경 설정' 참조).
TEE(Trusted Execution Environment)는 ARM CPU의 TrustZone과 같은 보안 환경에서 실행되는 신뢰할 수 있는 OS입니다. TEE 드라이버는 TEE와 통신하는 데 필요한 세부 사항을 처리합니다. 드라이버의 주요 임무 중 일부는 Globalplatform TEE 클라이언트 API 사양 [3]에 기반한 TEE용 일반 API를 제공하는 것뿐만 아니라 Linux와 TEE 간의 공유 메모리를 관리하는 것입니다. 이 서브시스템은 ARM 아키텍처의 커널 구성에서 CONFIG_OPTEE를 설정하여 활성화할 수 있습니다.
보안 월드에는 OP-TEE OS [4]라는 신뢰할 수 있는 OS가 포함되어 있습니다. 이 OS 위에서 소위 Trusted Application(TA)을 실행할 수 있으며, 이는 격리된 환경에서 일부 작업을 수행할 수 있습니다(그림 1 참조).
그림 1: TEE 개요 - Linaro의 프레젠테이션 [5]에서 발췌
노멀 월드(Linux 사용자 공간/커널)는 클라이언트 애플리케이션(CA)과 TEE 서브시스템이 노출하는 API를 사용하여 이러한 애플리케이션과 상호 작용할 수 있습니다. CA는 특정 TA에 대한 세션을 열고 TA가 구현한 함수를 호출할 수 있습니다. TA와 CA 간의 인수 전달은 공유 메모리를 사용하여 수행됩니다. CA와 TA 간의 상호 작용은 관련 모든 시스템 호출을 사용하여 다음에 설명됩니다.
CA는 드라이버와 통신하기 위해 /dev/tee[0-9]를 엽니다. 참고로, 이러한 API를 사용하는 일반적인 방법에서는 libteec를 사용하여 암시적으로 수행됩니다.
공유 메모리는 CA가 IOCTL TEE_IOC_SHM_ALLOC을 사용하여 등록할 수 있습니다. 이는 공유 메모리를 할당하고 사용자 공간이 mmap의 일부로 사용할 수 있는 파일 디스크립터를 반환합니다.
다음 단계는 IOCTL TEE_IOC_OPEN_SESSION을 사용하고 특정 TA의 uuid를 지정하여 세션을 설정하는 것입니다. 이 uuid는 TA 컴파일 중에 하드코딩됩니다.
TA의 특정 함수를 호출하려면 CA가 함수 식별자와 입력 인수를 지정하여 호출하며, 이는 TEE_IOC_INVOKE를 사용하여 수행됩니다.
CA가 모든 요청을 완료하면 TEE_IOC_CLOSE_SESSION을 사용하여 세션을 닫을 수 있습니다.
그림 2: CA와 TA 간의 세션 - Linaro의 프레젠테이션 [5]에서 발췌
클라이언트와 TEE 간의 통신의 대부분은 드라이버에 대해 불투명합니다. 드라이버의 주요 작업은 컨텍스트를 관리하고, 클라이언트로부터 요청을 수신하고, 이를 TEE로 전달하고, 결과를 다시 보내는 것입니다 [2].