TDX Module

Ahn9807 (토론 | 기여)님의 2023년 4월 17일 (월) 06:01 판 (새 문서: 분류: CPU 분류: 하드웨어 기반 보안 분류: 시스템 보안 분류: 가상화 == 개요 == TDX Module은 Intel TDX에서 Hypervisor와 Trusted domains(TD)사이에 존재하는 소프트웨어 모듈로, 인텔이 Signed하고 CPU-attested된 안전한 소프트웨어 이다. TDX Module은 하이퍼바이저와 TD의 중재자 역활을 하면서 TD의 생성, 실행, 그리고 종료와 같은 일들을 하이퍼바이저의 TCB와 분리되어...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)


개요

TDX Module은 Intel TDX에서 Hypervisor와 Trusted domains(TD)사이에 존재하는 소프트웨어 모듈로, 인텔이 Signed하고 CPU-attested된 안전한 소프트웨어 이다. TDX Module은 하이퍼바이저와 TD의 중재자 역활을 하면서 TD의 생성, 실행, 그리고 종료와 같은 일들을 하이퍼바이저의 TCB와 분리되어서 진행한다. TDX는 Host그리고 Guest와 통신할 수 있는 명령어를 제공하며, SEAM RANGE라는 시스템의 암호화된 특별한 메모리 위치에 안전하게 로딩된다.

TDX Module의 로딩

우선 Non-Persistenct SEAM Loader (NP-SEAM Loader)라는 Intel이 보증하는 모듈이 먼저 로딩된다. 이는 Intel Authenticated Code Module로 보증되어 있다. NP-SEAM Loader는 Persisten SEAM Loader (P-SEAM Loader)의 이미지를 로딩시키고, 다시 P-SEAM Loader가 TDX Module을 로딩한다. 모두 Intel이 디지털 서명을 통해서 안전하다고 Verification하여야만 로딩될 수 있다.

NP-SEAM Loader -> P-SEAM Loader (SEAM RANGE: P_SEAMLDR_Range) -> TDX Module (SEAM RANGE: Module_Range)

이때 TDX Module은 SEAM RANGE라는 특수한 영역에 로딩되는데, 이 영역은 UEFI/BIOS가 할당해 놓은 영역이다. 이 SEAM RANGE의 영역은 IA32_SEAMRR_PHYS_BASE와 IA32_SEAMRR_PHYS_MASK라는 MSR레지스터를 통해서 설정된다.

TDX Module의 로딩에서 P-SEAM Loader은 TDX Module의 Code, Data, Stack, Page table을 설정하고, 그외의 Keyhole과 같은 여러 Metadata를 메모리에 올려놓고, TDX Module의 sysinfo_table, Per-LP VMCS Region설정, TDX Module이 사용할 Virtual address 설정과 같은 일련의 작업을 처리하여 안전하게 TDX Module을 CPU에 적재한다.

이때 P-SEAM Loader가 TD들을 로딩하게 하는 것은 Host의 Hypervisor이다. 하이퍼 바이저가 P-SEAM Loader을 통해서 모든 초기화 작업이 끝나면 하이퍼바이저는 global private HKID를 할당하여, TDX Modeul에 SEAMCALL을 통해서 넘겨준다. (HKID는 TDX Module암호화에 사용할 key 값으로 메모리 Protection에 사용된다.) TDX Module은 이 key를 이용하여서 Trust Domain Memory Region (TDMR)을 초기화 하고 각각의 Processor에서 사용할 TDX key를 설정하고 HKID와 연결시킨다. 이 TDX key는 Physical Address Metadata Table (PAMT)나 Trust Domain Root (TDR)과 같은 TD의 메모리를 암호화 하는데 사용된다. 마지막으로 하이퍼바이저는 SEAMCALL을 내려서 PAMT가 TDMR을 반영하도록 설정한다.

TDX Module의 메모리 구조

SEAMRR_BASE                          Module_Range                                  │
│ ──────────────────────────────────────────────────────────────────────────────── │
▼                                                                                  │
┌─────────┬────────────┬───────────┬──────┬─────────────┬───────────┬───────┬──────┤
│sysinfo_ │Per-LP      │LP-Local   │Global│Page Table   │Page Table │Per-LP │Code  │
│table    │VMCS Region │Data Region│Data  │PD, PT, PDPT │PML4       │Stacks │Region│
├─────────┼────────────┼───────────┴──────┼─────────────┴───────────┼───────┼──────┤
│   2KB   │            │   Data Region    │    4-level Page table   │       │ 2MB  │
└─────────┴────────────┴──────────────────┴─────────────────────────┴───────┴──────┘
  • sysinfo_table: NP-SEAM Loader와 P-SEAM Loader에 의해서 설정된 address 정보, Logical processor의 개수, Private HKID의 범위와 같은 시스템 정보가 있다.
  • per-LP VMCS Region: 4KB의 SEAM Transfer VMCS가 Per LP별로 있다.
  • Data Region: per-LP 각 LP들이 사용할 data region과 공유되는 데이터를 저장할 Global data region으로 구성되어 있다.
  • 4-level Page table: TDX Module이 사용할 Page table이 들어 있다.
  • Per-LP Stacks: 각각의 LP들이 TDX Module에 context switch될때 사용할 Stack이 들어 있다.
  • Code region: TDX Module의 Code section이다.

위의 Physical address의 Range는 아래와 같은 Virtual address로 Static time에 P-SEAM Loader에 의해서 로딩된다.

| keyhole_edit region | Code region | Stack region | Key-hole region | Data region | sysinfo_table |

각각의 Virtual address 주소의 34번부터 46번째의 비트는 Randomize되어서 제공된다.

TD Metadata

TDX Module이 TD들에 대한 관리를 수행하기 때문에, TD의 메타데이터를 TDX Module은 저장하고 있다. 이러한 메타데이터에는 TDR, TDCS, TDVPS, SEPT와 같은 것들이 있다.

TDX TD Metadata.png

[1]

  • Trust Domain Root (TDR): TDR은 TD의 생성시 초기화되어 TD의 종료시 사라지는 구조체로서, SEAMCALL에서 사용할 TD가 어떤 TD인지 나타내는 Physical address가 이 TDR의 주소이다. TDR은 TDX Module의 Global private key로 암호화 되며, TD가 사용하는 private key와 TDCS의 주소값을 가지고 있는 TDCX를 가지고 있다. TD가 사용하는 TDCS, TDVPCS,SEPT와 같은 메타데이터는 PAMT의 owner속성을 통해서 참고가능하다.
  • Trust Domain Control Structure (TDCS): TDCS는 TD의 동작과 state을 저장하는 메타데이터다. 이 TDCS는 TD의 Private key로 암호화 된다. 4개의 Page로 구성되어 있다.
  • Trust Domain Virtual Processor State (TDVPS): TDVPS는 TD의 Virtual CPU의 동작과 state을 저장하는 메타데이터이다. TDVPS는 TD의 Private Key로 암호화 된다.
  • Secure EPT (SEPT): TDX의 Secure EPT를 저장하기 위한 메모리이다. TDCS의 SEPT root page에 보관되며, TD의 private key로 암호화 된다.

Context switch

TDX Module은 SEAMCALL그리고 SEAMRET을 통해서 하이퍼바이저와 TDX Module사이의 문맥전환을 수행한다. 또한 기존의 Intel VT-d와는 다르게, TDX Module을 거쳐서 VMLAUNCH, VMRESUME과 같은 명령어로 TD Guest OS로 문맥을 전환하며, Guest OS는 VMEXIT으로 하이퍼바이저로 가거나 아니면 TDCALL혹은 TDEXIT으로 TDX Module로 문맥을 전활할 수 있다.

Hypervisor <-> TDX Module

TDX Module과 통신하기 위해서 하이퍼바이저는 SEAMCALL을 실행시켜야 한다. SEAMCALL이 실행되면 프로세서의 모드가 VMX root mode에서 SEAM VMX root mode로 전환되고, TDX Module의 SEAM Transfer VMCS가 로딩된다. 이떄 SEAM Transfer VMCS는 TDX Module로 Context switch시에 필요한 State들을 저장하고 있다. 각각의 Logical processor가 사용할 SEAM Transfer VMCS는 SEAMRR__BASE + 4KB + (Logical processor ID) * 4KB에 매핑되어 있다. State transfer과정에서 CPU는 RIP를 tdx_seamcall_entry_point로 바꾸고, CR3레지스터는 TDX Module의 PML4값으로, FS레지스터는 sysinfo_table의 주소값으로, GS레지스터는 per-LP data region의 주소값으로 바꾼다.

Context switch가 완료되면, TDX Module은 SEAMCALL에 해당하는 내용을 파싱하여서 요청을 처리하게 된다. 요청이 끝나면, SEAMRET을 통해서 다시 Hypervisor로 돌아가거나, Guest OS로 Context를 넘길 수도 있다.

Guest OS <-> TDX Module

Guest OS의 CPU state을 Hypervisor에 노출하는 것을 막기 위해서, Guest OS와 Hypervisor의 문맥 전환은 반드시 TDX Module을 통과하도록 하였다. 이때 사용할 메타데이터는 TDVPS의 TD Transfer VMCS에 저장되며, TD의 개인키로 암호화되어 있다. TD가 TDCALL을 호출하거나 VMEXIT을 호출하면, Logical processor은 해당하는 TD Transfer VMCS를 통해서 TDX Module을 호출한다. TDX에서 몇몇 TD exit들은 TDX Module에 의해서 emulate되어서 Hypervisor을 거치지 않아도 된다. 그러나 대부분의 VMEXIT을 처리하기 위해서는 Hypervisor가 VM의 state을 볼 필요가 있는데, 이를 위해서 TDX는 Virtualization Exception (VE)를 Guest OS에 일으키고, Guest OS에 어떤 파라미터를 Hypervisor에 넘길지 물어본다음, 최소한의 파라미터를 가지고 하이퍼바이저에 처리를 요청하게 된다. 이를 통해서 TDX Module은 민감한 state에 대한 최소한의 Guest state만을 하이퍼바이저에게 노출한다.

Keyholes

SEAMCALL을 통해서 Hypervisor의 버퍼가 Physical address를 통해서 전달되면, 이러한 메모리를 우선 TDX Module의 메모리 영역에 Mapping해야 한다. 이러한 매핑은 keyhole과 keyhole-edit이라는 영역을 통해서 임시적으로 TDX Module의 Virtual address을 대여하는 방식으로 일어난다.

keyhole은 TDX Module이 LRU와 reference count을 통해서 관리하는 비어있는 128개의 메모리 영역이다. 각각의 keyhole은 4KB로 정렬된 Virtual address로 가지고 Zero page를 가르키도록 초기화 되어 있다. 만약 Hypervisor가 SEAMCALL을 날리면서 Physical address를 보내면, TDX Module은 우선 Keyhole중에 이 Physical address에 매핑이 되어 있는 keyhole이 있는지 확인하고 있으면 ref count를 1 올리고 아니면 LRU를 통해서 새로운 keyhole을 배정해준다. 이때 keyhole들의 Physical address를 가르키는 PTE들은 keyhole-edit 영역에 있음으로 keyhole-edit영역을 통해서 PTE들을 수정해 주면 keyhole이 가르키는 Physical address를 수정할 수 있다.

Memory Management

TDX Module은 TD의 Physical memory도 관리하는데, Trust Domain Memory Region (TDMR)와 TDMR에 대한 메타데이터를 가지는 Physical Address Metadata Table (PAMT)을 통해서 관리한다. TDMR은 Hypervisor가 TD가 사용할 수 있는 메모리의 영역을 UEFI/BIOS가 초기화해 준 Convertible Memory Regions (CMRs)에서 참고해서 설정해준다. 이 영역들은 MKTIME 암호화화 TDX memory integrity protection의 대상이된다.

각각의 TDMR은 1GB로 정렬된 메모리의 연속된 영역이다. 이때 TDMR의 메모리 영역은 겹쳐질 수 없다. TDX Module은 PAMT을 통해서 각각의 TDMR에 있는 물리 페이지의 속성을 추적한다. 이러한 속성에는 page owner, page type 그리고 page size가 있다. 이러한 속성들은 각각의 TDMR의 페이지들이 단 하나의 TD에만 속하게 되고, 적절한 type을 가지고 있도록 보장하는 역활을 한다. 만약 페이지가 TD의 private memory에 할당된다면, TDX Module은 SEPT에 기록된 page의 크기와 PAMT에 있는 page의 크기가 같은지를 체크할 수 있다. PAMT은 3개의 계층구조를 가지는 블록들로 나뉘어져 있다. 최상위 블록은 1GB에 해당하는 페이지의 메타데이터를 기록하고, 두번째는 512개의 2MB 페이지들, 세번째는 512개의 4KB 페이지들을 관리한다. TDX Module은 PAMT의 구조체를 tracking함으로서, 페이지에 해당하는 속성을 가져올 수 있다.

TDX Module은 페이지에 대한 접근, 제거, 그리고 추가에 해당하는 Operation들은 반드시 PAMT테이블을 Walking해서 업데이트 한다. PAMT에 해당하는 메모리 영역은 Hypervisor가 할당하고 TDX Module의 개인키로 암호화 된다.

References

  1. Intel TDX Demystified: A Top-Down Approach