본문 바로가기
시스템 반도체/Arm

Arm TrustZone ( 신뢰공간, TEE, monitor, banked register, memory )

by 전컴반 2022. 6. 24.
반응형
TrustZone 

 

CPU 안에 보안에 있어서 신뢰할 수 있는 환경 ( TEE, Trusted Execution Environment )을 만들어야 하는데 벤더 회사마다 명칭을 다르게 하지만 Arm은 그 환경을 TrustZone이라고 부른다.

 

2개의 World로 구분해 놨는데. 하나는 Normal World ( non-Secure World ), 다른 하나는 Secure World로 구분했다.

단어에서 알 수 있듯이 Normal World에서는 일반적인 애플리케이션을 돌리고 은행 앱이나 정보보안이 필요한 서비스의 경우에는 Secure World에서 애플리케이션을 실행한다. 애플리케이션을 돌리기 위해선 운영체제도 필요하다는 걸 알 수 있다. 리눅스와 같이 오픈 소스 코드는 보안에 취약하니 보안에 강한 운영체제를 따로 만들어야 한다.

 

두 World 왔다 갔다 switching 하려면 Monitor를 통해서 전환이 가능하다. monitor란 정보를 보호하기 위해 만든 클래스다. Monitor는 하나의 gate라고 보면 쉽다. 자세한 건 아래서 더 설명하겠다.

 

 


 

현재 상태가 어떤 상태인지 나타내는 SCR ( Secure Configuration Register )가 존재하는데 제일 오른쪽에 있는

NS bit ( Non Secure bit )를 통해 알 수 있다. 만약 NS bit1이면 Normal World에 있다는 의미고, 0이면 Secure World에 있다는 의미다. 이 NS bit를 확인하면서 어떤 World에 있는지 확인할 수 있다.

 

 

 

TrustZone Mode

 

아래는 운영체제를 실행하기 위해 필요한 Mode를 보여주는데 Arm에서는 9가지 mode가 있다는 걸 기억하면 Non-secure state에서는 monitor mode를 제외한 8가지 mode를 모두 다 지원해준다. Normal World와 마찬가지로 Secure World도 거의 동일하게 지원해주지만 하나만 다르다. 그건 Normal World에 Hyp mode ( Hypervisor )다. Secure World에서 지원해주지 않는다.

 

이유는 Hyp mode는 가상 환경을 제공해주는 mode인데 가상화를 하면 하나의 컴퓨터에서 여러 개의 운영체제를 지원하며 공유하기 때문에 보안에 문제가 생길 수도 있다. 

 

이렇게 모든 mode를 지원해준다는 의미는 이 위에서 운영체제가 돌아갈 수 있다는 의미고 애플리케이션도 돌아간다는 의미다. 

 

Monitor mode일 때는 NS bit가 0 또는 1일 수도 있다. Non-secure world에서 왔다면 NS bit가 1이고 Secure world에서 ㅗ았다면 NS bit가 0이기 때문이다. 하지만 Monitor mode 그 자체는 Secure 한 상태로 존재한다.

 

 

TrustZone Vetor table

 

Trust zone에서 Normal World, Secure World, Monitor mode는 모두 물리적으로 서로 다른 Vetor Table을 가지고 있다. 즉 3개의 Vetor table을 가지고 있다는 의미다. ( + Vetor table은 지정해 놓은 위치로 이동하여 해당 동작을 수행하기 위해 만든 table이다. )

 

 

 

Banked register

 

Context switching은 쉽게 말해 core의 레지스터를 바꾸는 것이다. mode가 바뀌면 사용하는 레지스터를 갈아 끼운다는 것만 기억하면 된다.

 

단편적인 예를 들어보면, 모든 프로그램마다 page table이 존재하고 table의 시작 주소를 TTBR ( Translation Table Base Register )이라는 곳에 올리면 core는 시작 주소로부터 table의 정보로 읽어온다. 그러다가 context switching이 발생하면 ( = 구동 프로그램이 바뀌면 ) 이 TTBR도 바뀌 줘야 한다.

 

그런데 우린 secure world를 보호해야 하니 normal world와 구분하여 TTBR이 존재해야 한다. 즉 TTBR은 물리적으로 따로 존재해야 한다. 이렇게 물리적으로 따로 존재하는 register를 Banked register라고 부른다. 

 

Arm은 register를 최대한 적게 만들고, 적게 switching 하고 싶어 했다. 그래서 Banked register가 나온 것이다. 정리하면 mode가 바뀔 때 banked register를 기반으로 secure world를 지원하고 레지스터를 갈아 끼운다.  

 

 

Monitor mode

 

Monitor mode에서는 뭘 해야 할까?

바로 World를 변경하는 것이니, 조금 다르게 말해 Task를 변경하는 것과 같다.

 

monitor를 통해 이동할 수 있는데 SMC ( Secure Monitor Call )이라는 register를 통해 monitor를 호출할 수 있다.

SMC가 실행되면 SVC와 유사하게 동작하는데

 

1. 기존에 돌고 있던 프로그램의 CPSR을 SPSR에 덮어 씌우고

2. 다음 명령어를 lr_mon 레지스터에 저장하고 ( 돌아올 주소를 저장한다는 의미 )

3. CPSR를 monitor mode로 변경하고 ( CPSR에서 M bit가 10110일 때 동작한다 )

4. CPSR의 A, I, F bit를 111로 세팅하고 ( 모든 interrupt를 막는다는 의미 )

5. PC에  MVBAR + 0x8를 한 값으로 세팅한다. ( MVBAR는 vetor table의 시작 주소인데 0x8을 더하는 이유는 파이프라인 때문이다. )

 

이렇게 monitor mode로 들어가면 2가지 동작을 하는데 하나는 context switching을 하고, 다른 하나는 world switching을 해야 한다.

context swithcing은 실행 중이던 mode를 monitor mode로 변경한다.

World swithcing은 실행 중이던 world를 다른 world로 변경하는 걸 의미한다.

 

이게 큰 그림이다.

 

 

TrustZone Memory

 

설계를 할 때, I/O device 별로 어떤 World에 속하는지 지정할 수 있다. Normal World에서 Secure World를 접근하려고 하면 Exception이 발생하는데 Secure World에서 Normal World로 접근하는 건 가능하다.

 

또한 메모리도 World를 구별하여 사용한다. CPU는 메모리와 통신할 때, 여러 control 신호를 보내는데 이때 Normal World에서 실행하고 있는지, Secure World에서 실행하고 있는지 알려주는 "AxPROT" 신호를 통해 Decoder에게 알려준다.

AxPROT[1]가 0이면 Secure World, 1이면 non-Secure World라는 의미다. 역시 Secure에서는 Normal의 메모리에도 접근 가능하다. 하지만 역은 불가능하다. 

 

 

Cache에는 Tag, Data, Valid, Dirty, Entry와 같은 columns가 존재하는데 TrustZone cache에는 NS columns이 추가된다. 만약 1이라면 Non-secure라는 의미고, 0이라면 secure라는 의미다. 해당 메모리에 접근할 수 있다. 즉 NS를 보고 어느 World에서 접근했는지 알 수 있고 World가 다르다면 같은 주소를 접근했다 할지라도 miss로 간주한다.

반응형

댓글