Realm은 host가 운영하지만 열어볼 수 없는 VM이다
일반 VM에서는 host hypervisor가 guest memory를 매핑해 읽을 수 있다. Realm에서는 memory granule의 World 소유권을 GPT가 기록하고 GPC가 모든 접근을 검사한다. host는 vCPU를 스케줄하고 외부 I/O를 제공하지만 protected memory와 Realm register state를 직접 읽거나 바꾸지 못하도록 설계된다.
자원 할당과 scheduling을 담당하지만 보호 data의 신뢰 주체가 아니다.
Realm 실행 context와 translation을 관리하는 작은 monitor다.
R-EL0/R-EL1에서 application과 kernel을 실행한다.
EL3에서 GPT와 World 전환의 최상위 경계를 관리한다.
RMI는 host용, RSI는 Realm guest용이다
| Interface | Caller → Callee | 대표 작업 |
|---|---|---|
| RMI | Host KVM/EL2 → RMM | Realm·REC·RTT 생성, data granule 위임, vCPU 진입과 exit. |
| RSI | Realm guest → RMM | ABI version, Realm config, IPA state, attestation, host call. |
| Host Call | Realm guest → RMM → Host | 공유 device emulation이나 host service 요청. |
| SMCCC | Register-based SMC calling convention | RMI/RSI function ID와 인수·결과 전달 기반. |
두 interface를 한 호출표에 섞으면 “guest kernel이 Realm을 생성한다”는 잘못된 결론이 나온다. 생성은 host의 RMI 영역이고, 생성된 Realm 안의 Linux가 사용하는 것은 RSI다.
Linux v6.18.37에는 Realm guest RSI가 있고 host KVM RME는 없다
로컬 commit 0c503cf3dde2의 arch/arm64를 전수 검색하면 arch/arm64/kernel/rsi.c, asm/rsi*.h와 memory-encryption hook은 존재한다. 반면 arch/arm64/kvm에는 Realm descriptor를 RMI로 생성하는 host-side RME 구현이 없다.
문서 경계: 아래의 Linux 소스 분석은 Realm 안에서 실행되는 guest kernel 기준이다. RMI Realm 생성 수명주기는 Arm RMM Architecture의 규약으로 설명하며, 이 tree의 host KVM 구현이라고 표시하지 않는다.
Realm guest가 부팅할 때 RSI를 확인한다
실제 초기화 흐름
arm64 boot
→ arm64_rsi_init()
→ rsi_version_matches()
→ SMC_RSI_ABI_VERSION
→ rsi_get_realm_config()
→ arm64_rsi_setup_memory()
→ I/O·memory encryption hook 등록arm64_rsi_init()은 ABI가 맞는지 확인한 뒤 Realm configuration과 memory 범위를 초기화한다. ABI가 맞지 않으면 일부 기능을 추측해서 켜지 않고 초기화를 중단한다.
is_realm_world()는 kernel이 Realm 환경인지 판단하는 공통 조건으로 I/O와 memory-encryption helper에서 사용된다.
RIPAS는 Realm이 IPA 내용을 어떻게 취급할지 나타낸다
| RIPAS | 의미 | Guest의 기대 |
|---|---|---|
| EMPTY | Realm RAM으로 받아들여지지 않은 영역 | 공유 또는 비어 있는 상태로 취급한다. |
| RAM | Realm이 보호 RAM으로 받아들인 영역 | private data와 code를 저장할 수 있다. |
| DESTROYED | 이전 내용의 신뢰를 잃은 영역 | 재사용 전에 안전한 초기화와 상태 전환이 필요하다. |
| DEV | device 용도 상태 | 해당 RSI/RME version과 device-assignment 계약을 확인한다. |
Linux의 arm64_rsi_is_protected()는 4KB granule 경계로 범위를 맞추고 rsi_ipa_state_get() 결과를 검사한다.
Attestation token은 challenge와 측정값을 연결한다
- 검증자가 replay 방지를 위한 challenge를 만든다.
- Realm이 challenge를 넣어
SMC_RSI_ATTESTATION_TOKEN_INIT을 호출한다. - token 생성이 비동기라면
RSI_INCOMPLETE가 올 수 있다. rsi_attestation_token_continue()를 반복해 한 granule씩 token data를 가져온다.- 외부 verifier가 platform token, Realm measurement, challenge와 key binding을 검증한다.
rsi_attestation_token_continue()의 반환 상태와 실제 길이를 반드시 검사한다. token을 받았다는 사실만으로 workload가 안전하다는 뜻은 아니다.
ioremap()도 Realm에서는 PAS를 고려한다
realm_ioremap_hook()은 Realm에서 I/O physical range를 매핑할 때 적절한 protection attribute를 더한다. device register와 일반 protected RAM을 같은 방식으로 매핑하면 GPC fault나 정보 노출이 생길 수 있다.
DMA는 더 어렵다. host가 device를 소유하면 device가 Realm private PA를 직접 읽어서는 안 된다. bounce/shared buffer 또는 RME device assignment와 SMMU 보안 구성이 필요하다.
Linux v6.18.37 실제 소스 지도
| 파일 | 심볼 | 책임 |
|---|---|---|
| arch/arm64/kernel/rsi.c | arm64_rsi_init, arm64_rsi_is_protected | Realm guest 초기화와 memory 검사 |
| asm/rsi_cmds.h | rsi_request_version, rsi_set_addr_range_state | SMC wrapper와 진행 상태 처리 |
| asm/rsi_smc.h | SMC_RSI_*, RSI_* | ABI function ID와 반환값 |
| asm/rsi.h | is_realm_world, memory helper | arm64 내부 공통 interface |
| asm/pgtable-prot.h | PROT_NS_SHARED | shared mapping protection bit |
| arch/arm64/kvm | host RME 생성 심볼 없음 | 이 tree의 범위 제한 |
Realm guest에서 확인할 항목
Boot·device·memory 확인
dmesg | grep -Ei 'rsi|realm|cca|attest'
ls -l /sys/bus/platform/devices/ | grep cca
cat /proc/iomem
grep -R . /sys/firmware 2>/dev/null | grep -i realm환경마다 userspace CCA device driver와 config가 다르다. boot log에 RSI version과 초기화 실패 이유를 남기고 RMM·firmware·guest kernel version을 한 묶음으로 기록한다.
Realm이 막는 것과 막지 않는 것
| 위협 | 기본 목표 | 남는 책임 |
|---|---|---|
| 악성 host | private memory와 register 비밀성·무결성 | 중단, 지연, I/O 거부 같은 availability 공격은 가능. |
| 다른 Realm | granule 소유권으로 상호 격리 | 공유 service와 side channel은 별도 분석. |
| Shared buffer | 의도적으로 host와 data 교환 | TOCTOU, 길이·offset 재검사, secret 복사 금지. |
| Attestation | 초기 측정과 platform 증명 | 실행 후 application 취약점이나 정책 오류까지 보장하지 않음. |
근거 자료
- Local sourceLinux v6.18.37 commit
0c503cf3dde2 - RMMRealm Management Monitor Architecture
- CCAArm CCA architecture explanation
- OverviewRealm·CCA 개념 해설