1. Introduction
지난 번 ARM Trust Zone에 대해서 소개할 때 간략하게 Trusty에 대해서 짚고 넘어간 적이 있다. TA와 Secure OS의 기본적인 구조, Trusty의 개요에 대해서 다루었다.
이번 글에선 Trusty에 대한 좀 더 자세한 부분과 개요에 대해서 알아보고 이후에 Secure OS 중 Open Source인 Trusty의 코드 분석을 통해서 Secure OS의 기본적인 구조와 동작의 개념에 대해서 알아보도록 한다.
Main Topic
- TEE
- Install Trusty
2. Trusty? TEE?
지난 글에서 알아봤듯이 TEE(Trusted Execution Environment)라는 개념이 도입되고 나서 ARM에선 TrustZone이라는 TEE의 Architecture 구현체 모델을 제시했다.
TrustZone이 발표되고 각 회사들은 다양한 TrustZone에 대한 Operating System으로 Qualcomm의 QSEE, Samsung의 Teegris, Trustonic의 Kinibi 등이 출시 되었다. 하지만 이는 모두 유료 시스템 혹은 자사의 모바일에만 도입하는 Trust OS였다.
Trust OS의 대부분의 기능은 비슷하다. EL 0 Level에서 실행되는 Trust Application에 관한 관리와 EL 1 Level에서 실행되는 TEE의 커널, 그리고 Secure World의 메모리, 자원을 Normal World와 격리시키고 접근할 수 없도록 하는 것이다.
Trusty는 이러한 Trust OS의 기능을 다 제공하며 Open Source의 무료라는 강점이 존재한다.
3. Trusty Application
TrustZone Architecture
ARM에서 제시하는 Architecture 모델은 위와 같다. 각각 EL 0 Level에서는 Application이 실행되고 EL 1 Level은 OS (Kernel)가, EL 2에서는 Hypervisor가 작동을 하며 최종적으로 EL 3 Level에서 Secure Monitor가 존재한다.
Secure Monitor는 대부분 ARM에서 만든 오픈 소스 모듈식 펌웨어를 사용하며 제조사는 필요에 따라 SMC 핸들러를 추가하여 사용할 수 있다. SMC 핸들러는 Secure Monitor에게 작업을 요청하는 Syscall과 비슷한 개념의 함수이고 이에 따라 Normal World와 Secure World가 간접적으로 연결된다.
또, 그림에서는 Secure Application이라고 하지 않고 Secure Firmware라고 명시되어 있는데 Trusty가 이 특징을 그대로 가지고있다. Trusty의 Application은 커널의 모듈 처럼 개발 후 커널 이미지와 함께 패키징 되기 때문에 임의의 사용자가 개발과 빌드를 진행할 수 없다는 특징이 있다.
Trusty Application
Trusty Application(이하 TA)은 바이너리, HAL(하드웨어 표준 인터페이스) 관리와 앱 관리를 위한 바이너리 매니페스트, 암호화 서명의 모음으로 구성된다.
App이 실행되면 커널의 비특권 모드에서 격리된 프로세스로 실행이 된다. TA는 TEE 프로세서가 메모리를 자체적으로 관리하며 가상 메모리 샌드박스 내에서 실행된다. 모든 프로세스는 우선 순위가 같고 라운드 로빈 스케줄링 알고리즘에 의해 관리된다.
대부분의 TA와 드라이버는 서명된 바이너리이지만 암호화 되어있지 않다면 쉽게 분석이 가능하다. 형식은 MCLF를 따르며 mclf-ida-loader 플러그인을 이용하면 쉽게 IDA에서 볼 수 있다.
TA는 로드 시 Trust OS가 헤더 정보를 참조하여 Code, Data, BSS, Stack 메모리를 매핑하며 구 버전의 경우 공유 라이브러리는 고정적인 주소에 매핑 된다.
또, Non Secure Memory인 월드 공유 메모리의 경우 정해진 주소 범위 내에 매핑하여 Normal World의 요청에 따른 응답 데이터를 월드 공유 메모리에 기록하고 다음 요청 메시지를 기다린다.
글을 적으면서 궁금했던 부분이 있는데, 바로 TA가 매핑될 때 ASLR이 없다는 것이다. 이를 위해서 자료를 찾아보고 질문을 한 결과 TrustZone의 Application은 애초에 취약점이 발생하지 않는다는 것을 전제로 하고 또, 이를 위해 라이브러리와 모든 주소가 ASLR이 적용되면 메모리 오버헤드가 너무 커지기 때문에 하지 않는다고 한다.
4. Install Trusty
기본적으로 Trusty 다운로드와 빌드에 관련된 부분은 아래 공식 docs에서 알려주고 있다.
https://source.android.com/docs/security/features/trusty/download-and-build?hl=ko
빌드 시 Repo라는 명령을 필요로 하는데 해당 명령은 curl을 통해서 바이너리를 가져와서 만들 수 있다.
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > repo
$ chmod a+x repo
$ sudo mv repo /usr/bin
QEMU를 이용한 에뮬레이트도 지원하기 때문에 기기가 없이도 실습을 진행할 수 있다. 하지만 저장 공간과 자원을 많이 사용하는 문제와 빌드에 시간이 매우 오래걸린다는 것을 감안해야 한다.
5. Reference
https://blog.netking.xyz/145
https://source.android.com/docs/security/features/trusty?hl=ko
https://blog.netking.xyz/280
'ARM' 카테고리의 다른 글
[ARM] ARM Trust Zone (0) | 2024.05.30 |
---|