Study

ARM TrustZone 메커니즘

부산대보금자리 2021. 7. 22. 22:08

컴퓨터 보안에 대한 필요성이 강조되고 있다. 

하지만 완벽한 보안을 제공하는 시스템은 존재하지 않는다. 여러 공격 위협에 대응하기 위해, 학계와 산업계에서는 신뢰할 수 있는 실행환경, 즉 TEE를 제공하려는 노력을 계속하고 있다. 

예를 들면 Intel은 SGX이라는 기능을 탑재한 프로세서를 제공하고 있고 AMD는 SME/SEV를 제공한다.

ARM은 Trustzone이라는 하드웨어 아키텍처를 제공한다. 

 

Trustzone은 하나의 물리적 CPU에서 Normal world와 Secure world라는 두 개념의 World를 제공한다.

CPU가 어느 world에 있는지는 간단하게도 SCR(=Secure Configuration Register)라는 레지스터에 NS-Bit에 따라 결정된다.

NS = 1이면 Normal world이고 NS = 0이면 Secure world이다. 

이렇게 world를 나눔으로써 높은 수준의 보안을 요구하거나 신뢰하는 소프트웨어는 secure world에서 실행한다. 

 

Trustzone은 cpu뿐만 아니라 mmu,캐시,주기억장치,i/o장치에 이르기까지 하드웨어 시스템을 구성하는 모든 장치에 적용된다.

normal world에 속한 하드웨어는 cpu가 normal world나 secure world 상태에 있을 때 모두 접근할 수 있는 반면 반대의 경우는 그렇지 않다. 

page table도 각 world용으로 따로 만들 수 있으며, TLB 각각의 entry에는 ns bit가 있어 구분이 가능하며 캐시도 마찬가지이다. 

 

이러한 하드웨어 시스템 설계를 위해 AMBA AXI프로토콜에는 Trustzone을 위해 제공하는 전용 control signal이 있다. 

AMBA는 arm사에서 만든 버스 프로토콜이다. 여기에는 주소 버스, 데이터 버스 외에도 control signal이 있다. 

control signal에는 read/write외의 access permission과 같은 부가정보를 위한 signal이 있다. 

그중 ARPROT[2:0]와 AWPROT[2:0]은 꼭 알아야 한다

R은 read 이고 w는 write인데 각  비트의 의미는 다음과 같다

[2] : 0 = data access, 1= instruction access

[1] : 0 = secure access, 1 = non-secure access - > normal or secure

[0] : 0 = unprivileged access, 1 = privileged access -> user or supervisor

이런 비트를 통해 각 world 에서 접근을 시도한다.

 

Normal world에서는 Arm cpu의 동작 모드, 즉 user,supervisor,FIQ,IRQ,Undefiend,Abort모드 등 어느 동작모드에든 있을 수 있다. 그리고 secure world에서는 hypervisor를 제외하고 어떤 모드에든 있을 수 있다. 

즉 secure world에서는 가상화와 관련된 동작모드만 지원하지 않는다. 따라서 각각의 world가 논리적으로 하나의 완전한 cpu라고 할 수 있다.

이는 task scheduling을 위해 timer 인터럽트가 필요하고 따라서 하드웨어 인터럽트를 위한 irq,fiq모드가 지원되어야 하고 시스템콜을 위한 supervisor모드도 필요하기 때문이다. 

 

눈여겨봐야 할 점은 두 world간의 전환을 위한 'monitor mode'가 있고 monitor mode는 scr'ns값에 상관없이 항상 secure world상태에 있다는 것이다. 

monitor 모드도 다른 모드와 마찬가지로 전용으로 할당되어 있는 세 개의 레지스터가 있다.

monitor 모드의 주요 역할은 문지기 역할인데 그렇다면 운영체제 스케쥴러가 하는 task switching처럼 world switching을 위한 작업을 해야한다. 즉 이전 world의 cpu context를 stack에 저장하고, 가고자 하는 world의 context를 스택으로부터 cpu레지스터로 가져오는 작업을 해야 한다. 이는 cpu 레지스터들은 두 world간에 공유되어 있기 때문이다.

 

하지만 모든 레지스터들을 공유하는 것이 아니다. Trustzone은 비교적 덩치가 큰 레지스터 파일은 각 world간에 공유하게 하고, 최소한의 시스템 레지스터들은 각 world별 전용으로 제공함으로써 Trustzone을 통한 보안 기능을 제공하면서 각 world에서 수행될 운영체제 운용의 효율과 편의를 고려한다.

 

실제로 Trustzone을 지원하는 Monitor,secure,normal 세개의 IVT가 있어야 하고 VBAR이 각 world를 위한 IVT의 시작 위치를 저장하고 있어야 한다. 

이는 world switching할때 monitor mode의 IVT를 거치도록 되어있기 때문이다.

 

vector table의 reset vector는 secure world에만 존재한다. 즉, Trustzone을 지원하는 arm 프로세서에서는 secure world의 supervisor 모드에서 부팅을 시작한다.

 

 

이제 normal -> secure world로 어떻게 가는지 살펴본다. 

아까 보았던 scr에 있는 ns bit를 바꾸면 된다고 했지만 어차피 이것은 secure world에서만 접근이 가능하다.

 

* SMC(Secure Monitor Call)

이는 monitor 모드로 가기 위한 secure monitor call 익셉션을 발생시키는 명령어이다. 

이는 SVC명령어와 동작 면에서 아주 유사하다. 이는 이전 ARMv8 에서 소프트웨어 인터럽트에서 설명한 동작을 보면된다. 

pc는 monitor mode의 IVT offset을 가지게 되고 해당 명령어를 실행한다. 

SMC 명령어는 PL1이상의 특권 계층에서만 실행할 수 있다. 따라서 User 모드, 즉 PL0계층에서 실행하면 undefined instruction으로 취급된다.

참고로 PL1은 system,supervisor,FIQ,IRQ,Undef,Abort mode이다. 

 

이는 monitor mode에서 world switching을 하는 예제 코드이다. 즉 monitor모드가 IVC에 있는 smc handler 를 수행한 것이다.

우선 r0~3의 인자들을 stack에 옮긴다. 이는 smc handler에서 r0~3을 사용하기 때문이다. 

1은 어느 world에서 switching을 요청했는지 알아내는 코드이다. 이를 통해 ns bit를 가져와 CPSR의 N,Z,C,V를 설정한다.

2는 MCR 명령어로 SCR'NS값을 바꾸어 world를 바꾼다. monitor mode는 secure world에 있는것으로 판단된다.

3은 각 world용으로 마련된 stack pointer를 가져오는 코드이다. 어떤 world이냐 따라 가져오는 sp가 다르다 이는 앞에서 어느 world인지를 보고 판단한 z flag를 보고 할당된다. 

4에서는 실제로 context switching이 된다. 즉 레지스터들을 복구하는과정이다

5에서는 pc값을 돌려놓음으로써 가고자 하는 world로 switching되며 복귀하게 된다. 

 

두번째 방법은 인터럽트와 익셉션을 통해서이다. 이를 허용할지는 scr 레지스터의 EA,FIQ,IRQ bit의 설정에 의해 결정된다. 

'Study' 카테고리의 다른 글

OPTEE pc레지스터 & secure storage(수정중)  (0) 2021.07.26
OPTEE Systemcall Hash연산  (0) 2021.07.25
ELF파일  (0) 2021.07.25
OPTEE system call 실습  (0) 2021.07.24
ARMv8  (0) 2021.07.22